Zautomatyzuj transfer plików scp za pomocą skryptu powłoki

84

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.

Pradeep Pati
źródło
2
Czy możesz mi powiedzieć, czy użycie hasła w skrypcie powłoki z rsync zadziałało, czy próbowałeś tego? dzięki.

Odpowiedzi:

90

Zamiast na stałe zakodować hasło w skrypcie powłoki, użyj kluczy SSH, jest to łatwiejsze i bezpieczniejsze.

$ scp -i ~/.ssh/id_rsa *.derp [email protected]:/path/to/target/directory/

zakładając, że twój klucz prywatny jest w, ~/.ssh/id_rsaa pliki, które chcesz wysłać, mogą być filtrowane*.derp

Aby wygenerować parę kluczy publiczny / prywatny:

$ ssh-keygen -t rsa

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.pubi wklej w nowej linii ~devops/.ssh/authorized_keysw myserver.orgserwerze. Jeśli ~devops/.ssh/authorized_keysnie istnieje, możesz go stworzyć.

Przejrzysty przewodnik jest dostępny tutaj .

Pradeep Pati
źródło
1
Nawet po wykonaniu tych instrukcji nadal pojawia się monit o hasło ... czy są jakieś inne kryteria, których mi brakuje?
scottysseus
@ScottScooterWeidenkopf może być kilka rzeczy, które mogą być nieprawidłowe, na przykład katalog .ssh lub pliki allowed_keys mogą nie mieć odpowiednich uprawnień (700).
Pradeep Pati
2
@PradeepPati Zrozumiałem mój problem. Masz rację, problemem były uprawnienia. W podanym przez Ciebie łączu autor wspomniał o pewnych zmianach uprawnień. Dokonałem tych zmian i teraz wszystko działa.
scottysseus
1
Aby uniknąć nieporozumień związanych z używaniem tego rozwiązania przez kopiowanie i wklejanie, obecnie ta odpowiedź wydaje się przenosić ze zdalnego na lokalny - co jest przeciwieństwem tego, co chce zrobić OP.
Ciabaros
@Ciabaros dobry chwyt! Zaktualizowałem odpowiedź. dzięki!
Pradeep Pati
42
#!/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

JohnA
źródło
Uwaga dla użytkowników systemu Windows: expectplik 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.
fzbd
19

dlaczego tego nie spróbujesz?

password="your password"
username="username"
Ip="<IP>"
sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH>
Veerendra Kakumanu
źródło
1
Niezła alternatywa dla #! /
Usr
16

możesz także użyć rsync. Wydaje się, że działa lepiej dla wielu plików niż scp IMHO.

rsync -avzh / ścieżka / do / dir / user @ remote: / path / to / remote / dir /

Aktualizacja

Możesz użyć rsync przez ssh, dodając przełącznik `` -e '':

rsync -avzh -e ssh / path / do / dir / user @ remote: / path / to / remote / dir /
bsisco
źródło
3
Zaletą scp ist jest to, że używa bezpiecznego kanału. rsync nie.
3
Możesz zmusić rsync do używania ssh: 'rsync -avz -e ssh remoteuser @ remotehost: / remote / dir / this / dir /'
@flokra. Dzięki, byłem w trakcie dodawania tej aktualizacji i rozproszyłem się.
bsisco
9
Spowoduje to wywołanie interaktywnego monitu o hasło. Uważam, że OP chciał w pełni zautomatyzowanego rozwiązania
Tom Auger,
@Dimitri scp -r kopiuje pliki rekurencyjnie. Nie ma to nic wspólnego z przechowywaniem hasła w skrypcie i przekazywaniem go do wywołania scp poprzez skrypt bash! Naprawdę nie rozumiem twojego komentarza.
Tom Auger
9
#!/usr/bin/expect -f
spawn scp -r BASE.zip [email protected]:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"
Abhinav Gupta
źródło
Czy można oczekiwać, że będzie używany do rsync? Próbuję coś zrobić, ale moja metoda klucza RSA nie działa. Ciągle pyta mnie o hasło do zdalnego komputera.
5

A co z symbolami wieloznacznymi lub wieloma plikami?

scp file1 file2 more-files* user@remote:/some/dir/

źródło
4

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"  
K.Govind Anupam
źródło
3

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"
Felix Rabe
źródło
1

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
Rishi Sinha
źródło
1

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#########";
Chief_Arbiter
źródło
0

Wypróbuj lftp

lftp -u $user,$pass sftp://$host << --EOF--

cd $directory

put $srcfile

quit

--EOF--
azazil
źródło
-1

Polecenie scpmoże być używane jak tradycyjny system UNIX cp. Więc jeśli zrobisz:

scp -r myDirectory/ mylogin@host:TargetDirectory

będzie działać

Dimitri
źródło
1
Nie wydaje się, aby dotyczyło to hasła.
Delicia Brummitt