Jak automatycznie przekazać hasło dla polecenia rsync SSH?


111

Muszę zrobić rsyncprzez sshi chcesz zrobić to automatycznie, bez konieczności przechodzenia hasło sshręcznie.


najłatwiejszym sposobem na podanie hasła za każdym razem, gdy przenosisz lub logujesz się do ssh, jest utworzenie klucza, oto jak możesz to zrobić w 2 krokach brightery.com/en/post/ ...
Muhammad El-Saeed

Odpowiedzi:


44

Powinieneś użyć pliku klucza bez hasła do skryptowego logowania ssh. Jest to oczywiście zagrożenie bezpieczeństwa, należy uważać, aby sam plik klucza był odpowiednio zabezpieczony.

Instrukcje dotyczące konfigurowania dostępu SSH bez hasła


9
Nie ma możliwości wpisania hasła w tekście polecenia?
liysd,

3
Niełatwo, nie ma na to opcji w ssh
Mad Scientist

Należy zauważyć, że nie zawsze jest to możliwe (np. Wiele implementacji serwera ssh dla systemu Android jest dość ograniczonych).
Ponkadoodle

@Ponkadoodle OP dotyczy żądań po stronie klienta, a nie po stronie serwera. ssh -izawsze powinno być możliwe po stronie klienta. Czy masz na myśli, że serwer może nie obsługiwać wszystkich typów kluczy (np. ECDSA)? Nie byłby to jednak poważny problem, tylko przypadek używania ssh-keygen -t. Czy coś mi brakuje?
Jonathan H

1
Chociaż na początku może się to wydawać kłopotliwe, to jest poprawna odpowiedź. Hasła to poufne informacje i nie należy ich przechowywać w sposób przejrzysty ani nieostrożnie używać w programach. Po to są pliki kluczy; po prostu dowiedz się o plikach tożsamości rsync -eissh -i .
Jonathan H,

94

Użyj nieinteraktywnego narzędzia dostawcy haseł ssh „sshpass”

Na Ubuntu

 sudo apt-get install sshpass

Polecenie rsync

 /usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p password ssh -o StrictHostKeyChecking=no -l username" src_path  dest_path

4
Wiem, że to nie jest najlepsza praktyka, ale mam serwer NAS z uszkodzonym dyskiem SSHD, który nie obsługuje uwierzytelniania opartego na kluczach. Ta odpowiedź była brakującym elementem mojej układanki automatycznego tworzenia kopii zapasowych. Więc +1 za ostateczną odpowiedź
Mike Gossmann

8
Jeśli nie można użyć keyfile, ale nie chce, aby to hasło w poleceniu można napisać go do tymczasowego pliku i umieścić go w ten sposób: sshpass -p`cat .password` ssh [...]. Następnie zabezpiecz .passwordplik, chmod 400 .passwordaby upewnić się, że tylko użytkownik może go odczytać.
lutuh

5
Dla kompletności, w przypadku ssh'ing do zdalnego serwera, src_pathpowinien być serwer: ścieżka, tak jak poniżej:server01.mydomain.local:/path/to/folder
harperville

to jest zdecydowanie dobra odpowiedź! pozwala na wykonywanie skryptów bez magii ssh, po prostu skrypty. ;) Kudos @Rajendra
Genuinefafa

1
ponieważ -awłączenie rsync obejmuje -rlptgoD, możesz skrócić polecenie w następujący sposób:rsync -az ...
Jannie Theunissen

24

Możesz uniknąć monitu o hasło przy rsyncpoleceniu, ustawiając zmienną środowiskową RSYNC_PASSWORDna hasło, którego chcesz użyć, lub używając --password-fileopcji.


41
działa tylko wtedy, gdy serwer docelowy ma uruchomionego demona rsync
Darryl Hebbes

4
Mimo że ta odpowiedź nie pomaga, chyba że używasz demona rsync, Google wylądował mnie tutaj i było to dokładnie to, czego potrzebowałem. Dla mnie potrzebowałem bezpośredniego rsync do rsyncd, bez ssh. Po prostu użyłem opcji pliku z hasłem i działałem idealnie dla skryptu.
gregthegeek

15

Jeśli nie możesz użyć kluczy publicznych / prywatnych, możesz użyć oczekiwać:

#!/usr/bin/expect
spawn rsync SRC DEST
expect "password:"
send "PASS\n"
expect eof
if [catch wait] {
    puts "rsync failed"
    exit 1
}
exit 0

Będziesz musiał zamienić SRC i DEST na swoje normalne parametry źródłowe i docelowe rsync oraz zastąpić PASS swoim hasłem. Tylko upewnij się, że ten plik jest bezpiecznie przechowywany!


3
te polecenia nie są dostępne w moimRed Hat Enterprise Linux Server release 5.11 (Tikanga)
To Kra

13

Mam to do pracy w ten sposób:

sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir  remote_user@remote_host:/remote_dir

co by to remote_port_sshbyło ustawione? Wygląda jak symbol zastępczy rzeczywistej wartości.
Max Williams

6

Użyj klucza ssh.

Spójrz na ssh-keygeni ssh-copy-id.

Następnie możesz użyć rsynctego sposobu:

rsync -a --stats --progress --delete /home/path server:path

Jeśli używam klucza z ssh, piszę: ssh u @ serv -i ./rsa Ale jak to zrobić w rsync?
liysd

2
Jeśli umieścisz klucz w swoim katalogu .ssh i nadasz mu standardową nazwę (zazwyczaj id_rsa / id_rsa.pub), zostanie on automatycznie pobrany przez rsync.
Craig Trader

6

Inna interesująca możliwość:

  1. wygeneruj parę kluczy RSA lub DSA (tak jak zostało to opisane)
  2. wstaw klucz publiczny do hosta (tak jak zostało to już opisane)
  3. biegać:
rsync --partial --progress --rsh = "ssh -i dsa_private_file" nazwa_hosta @ host: / home / me / d.

Uwaga: -i dsa_private_file, który jest Twoim kluczem prywatnym RSA / DSA

Zasadniczo to podejście jest bardzo podobne do tego opisanego przez @Mad Scientist, jednak nie musisz kopiować swojego klucza prywatnego do ~ / .ssh. Innymi słowy, jest to przydatne do zadań ad-hoc (jednorazowy dostęp bez hasła)


5

U mnie działa:

SSHPASS='myPassword'
/usr/bin/rsync -a -r -p -o -g --progress --modify-window=1 --exclude /folderOne -s -u --rsh="/usr/bin/sshpass -p $SSHPASS ssh -o StrictHostKeyChecking=no -l root"  source-path  myDomain:dest-path  >&2

Musiałem zainstalować sshpass


2
-a już implikuje -rlptgoD i ogólnie o wiele bardziej pomocne byłoby posiadanie tutaj skróconej linii poleceń.
Christian

4

Automatyczne wprowadzanie hasła dla polecenia rsync jest trudne. Moim prostym sposobem uniknięcia problemu jest zamontowanie folderu, którego kopia zapasowa ma zostać utworzona. Następnie użyj lokalnego polecenia rsync, aby wykonać kopię zapasową zamontowanego folderu.

mount -t cifs //server/source/ /mnt/source-tmp -o username=Username,password=password
rsync -a /mnt/source-tmp /media/destination/
umount /mnt/source-tmp

3

Chociaż już to zaimplementowałeś,

możesz również użyć dowolnej oczekiwanej implementacji (znajdziesz alternatywy w Perlu, Pythonie: pexpect, paramiko itp.)


2

Używam do tego pliku VBScript na platformie Windows, obsługuje mnie bardzo dobrze.

set shell = CreateObject("WScript.Shell")
shell.run"rsync -a Name@192.168.1.100:/Users/Name/Projects/test ."
WScript.Sleep 100
shell.SendKeys"Your_Password"
shell.SendKeys "{ENTER}"

2

Oficjalne rozwiązanie (i inne) były niekompletne, kiedy po raz pierwszy odwiedziłem, więc wróciłem po latach, aby opublikować to alternatywne podejście na wypadek, gdyby ktoś inny znalazł się tutaj i zamierzał użyć pary kluczy publiczny / prywatny:

Wykonaj to z docelowej maszyny kopii zapasowej, która ściąga kopię zapasową ze źródła do celu

rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' user@10.9.9.3:/home/user/Server/ /home/keith/Server/

Wykonaj to z maszyny źródłowej, która wysyła ze źródła do docelowej kopii zapasowej

rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' /home/user/Server/ user@10.9.9.3:/home/user/Server/

A jeśli nie używasz alternatywnego portu dla ssh, rozważ bardziej eleganckie przykłady poniżej:

Wykonaj to z docelowej maszyny kopii zapasowej, która ściąga kopię zapasową ze źródła do celu:

sudo rsync -avi --delete user@10.9.9.3:/var/www/ /media/sdb1/backups/www/

Wykonaj to z maszyny źródłowej, która wysyła ze źródła do docelowej kopii zapasowej:

sudo rsync -avi --delete /media/sdb1/backups/www/ user@10.9.9.3:/var/www/

Jeśli nadal otrzymujesz monit o podanie hasła, musisz sprawdzić konfigurację ssh /etc/ssh/sshd_configi sprawdzić, czy użytkownicy w źródle i docelowi mają odpowiedni publiczny klucz ssh innych, wysyłając je za pomocą ssh-copy-id user@10.9.9.3.

(Ponownie, dotyczy to używania par kluczy ssh bez hasła jako alternatywnego podejścia, a nie przekazywania hasła przez plik).


Ważną uwagą na marginesie jest to, że w przykładzie portu alternatywnego kierujesz ssh do pliku klucza prywatnego, a gdy wykonuje polecenie u celu, uwierzytelnia się za pomocą klucza publicznego.
oemb1905

-1

Zgodnie z pomysłem opublikowanym przez Andrew Seaforda, odbywa się to za pomocą sshfs:

echo "SuperHardToGuessPass:P" | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com:/mypath/ /mnt/source-tmp/ -o workaround=rename -o password_stdin
rsync -a /mnt/source-tmp/ /media/destination/
umount /mnt/source-tmp
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.