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.


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 devops@myserver.org:/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 .


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 "user@example.com:/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


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>

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 /

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 abhishek@192.168.1.115:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"

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/

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 username@192.168.1.123:/cool/cool1/* /tmp/cool/   
   expect "password:"   
   send "cool\r"   
   expect "*\r"   
   expect "\r"  

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"


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

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#########";

0

Wypróbuj lftp

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

cd $directory

put $srcfile

quit

--EOF--

-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ć


1
Nie wydaje się, aby dotyczyło to hasła.
Delicia Brummitt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.