Muszę zrobić rsync
przez ssh
i chcesz zrobić to automatycznie, bez konieczności przechodzenia hasło ssh
ręcznie.
Muszę zrobić rsync
przez ssh
i chcesz zrobić to automatycznie, bez konieczności przechodzenia hasło ssh
ręcznie.
Odpowiedzi:
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.
ssh -i
zawsze 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?
rsync -e
issh -i
.
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
sshpass -p`cat .password` ssh [...]
. Następnie zabezpiecz .password
plik, chmod 400 .password
aby upewnić się, że tylko użytkownik może go odczytać.
src_path
powinien być serwer: ścieżka, tak jak poniżej:server01.mydomain.local:/path/to/folder
-a
włączenie rsync obejmuje -rlptgoD
, możesz skrócić polecenie w następujący sposób:rsync -az ...
Możesz uniknąć monitu o hasło przy rsync
poleceniu, ustawiając zmienną środowiskową RSYNC_PASSWORD
na hasło, którego chcesz użyć, lub używając --password-file
opcji.
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!
Red Hat Enterprise Linux Server release 5.11 (Tikanga)
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
remote_port_ssh
było ustawione? Wygląda jak symbol zastępczy rzeczywistej wartości.
Użyj klucza ssh.
Spójrz na ssh-keygen
i ssh-copy-id
.
Następnie możesz użyć rsync
tego sposobu:
rsync -a --stats --progress --delete /home/path server:path
Inna interesująca możliwość:
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)
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
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
Chociaż już to zaimplementowałeś,
możesz również użyć dowolnej oczekiwanej implementacji (znajdziesz alternatywy w Perlu, Pythonie: pexpect, paramiko itp.)
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}"
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_config
i 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).
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