Mam kilka n plików w katalogu w moim systemie uniksowym. Czy istnieje sposób na napisanie skryptu powłoki, który prześle wszystkie te pliki przez scp do określonego zdalnego systemu. Określę hasło w skrypcie, aby nie musieć wpisywać go dla każdego pliku.
84
Odpowiedzi:
Zamiast na stałe zakodować hasło w skrypcie powłoki, użyj kluczy SSH, jest to łatwiejsze i bezpieczniejsze.
zakładając, że twój klucz prywatny jest w,
~/.ssh/id_rsa
a pliki, które chcesz wysłać, mogą być filtrowane*.derp
Aby wygenerować parę kluczy publiczny / prywatny:
Powyższe wygeneruje 2 pliki
~/.ssh/id_rsa
(klucz prywatny) i~/.ssh/id_rsa.pub
(klucz publiczny)Aby skonfigurować klucze SSH do użycia (jedno zadanie czas): Skopiuj zawartość
~/.ssh/id_rsa.pub
i wklej w nowej linii~devops/.ssh/authorized_keys
wmyserver.org
serwerze. Jeśli~devops/.ssh/authorized_keys
nie istnieje, możesz go stworzyć.Przejrzysty przewodnik jest dostępny tutaj .
źródło
#!/usr/bin/expect -f # connect via scp spawn scp "[email protected]:/home/santhosh/file.dmp" /u01/dumps/file.dmp ####################### expect { -re ".*es.*o.*" { exp_send "yes\r" exp_continue } -re ".*sword.*" { exp_send "PASSWORD\r" } } interact
http://blogs.oracle.com/SanthoshK/entry/automate_linux_scp_command
źródło
expect
plik spakowany w MSYS2 będzie pasował do całego wyniku, więc pierwsza reguła będzie zawsze dopasowana. Jeśli zamienisz kolejność obu reguł, uzyskasz pożądane zachowanie.dlaczego tego nie spróbujesz?
password="your password" username="username" Ip="<IP>" sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>
źródło
możesz także użyć rsync. Wydaje się, że działa lepiej dla wielu plików niż scp IMHO.
Aktualizacja
Możesz użyć rsync przez ssh, dodając przełącznik `` -e '':
źródło
#!/usr/bin/expect -f spawn scp -r BASE.zip [email protected]:/tmp expect "password:" send "wifinetworks\r" expect "*\r" expect "\r"
źródło
A co z symbolami wieloznacznymi lub wieloma plikami?
źródło
rsync to program, który zachowuje się w podobny sposób jak rcp, ale ma o wiele więcej opcji i używa protokołu rsync do zdalnej aktualizacji, aby znacznie przyspieszyć transfer plików podczas aktualizacji pliku docelowego.
Protokół zdalnej aktualizacji rsync umożliwia rsync przesyłanie tylko różnic między dwoma zestawami plików przez połączenie sieciowe, przy użyciu wydajnego algorytmu wyszukiwania sum kontrolnych opisanego w raporcie technicznym dołączonym do tego pakietu.
Kopiowanie folderu z jednej lokalizacji do drugiej
#!/usr/bin/expect -f spawn rsync -a -e ssh [email protected]:/cool/cool1/* /tmp/cool/ expect "password:" send "cool\r" expect "*\r" expect "\r"
źródło
Jeśli zgadzasz się na jednorazowe wprowadzanie hasła przy każdym uruchomieniu skryptu, możesz to łatwo zrobić za pomocą połączenia głównego SSH.
#!/usr/bin/env bash USER_AT_HOST="user@host" # use "$1@$2" here if you like SSHSOCKET=~/".ssh/$USER_AT_HOST" # This is the only time you have to enter the password: # Open master connection: ssh -M -f -N -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" # These do not prompt for your password: scp -o ControlPath="$SSHSOCKET" file1.xy "$USER_AT_HOST":remotefile1.xy scp -o ControlPath="$SSHSOCKET" file2.xy "$USER_AT_HOST":remotefile2.xy # You can also use the flag for normal ssh: ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo hello" ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo world" # Close master connection: ssh -S "$SSHSOCKET" -O exit "$USER_AT_HOST"
źródło
Możesz to zrobić tylko za pomocą kluczy publicznych / prywatnych ssh. Lub użyj szpachli, w której możesz ustawić hasło. scp nie obsługuje podawania hasła w linii poleceń.
Instrukcje dotyczące kluczy publicznych / prywatnych można znaleźć tutaj: http://www.softpanorama.org/Net/Application_layer/SSH/scp.shtml
źródło
To zadziała:
#!/usr/bin/expect -f spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no file1 file2 file3 user@host:/path/ expect "password:" send "xyz123\r" expect "*\r" expect "\r" interact
źródło
tutaj jest kod bash dla SCP z plikiem klucza .pem. Po prostu zapisz go w pliku script.sh, a następnie uruchom z „sh script.sh”
Cieszyć się
#!/bin/bash #Error function function die(){ echo "$1" exit 1 } Host=ec2-53-298-45-63.us-west-1.compute.amazonaws.com User=ubuntu #Directory at sent destination SendDirectory=scp #File to send at host FileName=filetosend.txt #Key file Key=MyKeyFile.pem echo "Aperture in Process..."; #The code that will send your file scp scp -i $Key $FileName $User@$Host:$SendDirectory || \ die "@@@@@@@Houston we have problem" echo "########Aperture Complete#########";
źródło
Wypróbuj lftp
lftp -u $user,$pass sftp://$host << --EOF-- cd $directory put $srcfile quit --EOF--
źródło
Polecenie
scp
może być używane jak tradycyjny system UNIXcp
. Więc jeśli zrobisz:będzie działać
źródło