Określ plik tożsamości (id_rsa) za pomocą rsync

196

Muszę robić okresowe kopie zapasowe katalogu na zdalnym serwerze, który jest maszyną wirtualną hostowaną przez organizację badawczą. Utrzymują, że dostęp do maszyn wirtualnych odbywa się za pomocą kluczy ssh, co jest dobre, z wyjątkiem tego, że nie mogę wymyślić, jak wskazać rsync na klucz ssh dla tego serwera.

Rsync nie ma problemu, jeśli plik klucza jest ~/.ssh/id_rsa, ale gdy jest to coś innego, dostaję Permission denied (publickey).

Za pomocą ssh mogę określić plik tożsamości za pomocą -i, ale rsync wydaje się nie mieć takiej opcji.

Próbowałem także tymczasowo przenieść klucz na maszynie lokalnej do ~/.ssh/id_rsa, ale to również nie działa.

tl; dr

Czy możesz podać plik tożsamości za pomocą rsync?

Jangari
źródło
1
Przydatne także w tym celu sudo rsync, który z jakichś powodów nie używa własnych kluczy ssh.
ijoseph
1
@ijoseph Dokładnie, używam rsync -aAP "sudo -u user ssh" user@server:dir local_dirpodczas synchronizacji ze skryptów cron, które działają jako root
Martin Pecka

Odpowiedzi:

341

Możesz podać dokładne polecenie ssh za pomocą opcji „-e”:

rsync -Pav -e "ssh -i $HOME/.ssh/somekey" username@hostname:/from/dir/ /to/dir/

Wielu użytkowników ssh nie zna swojego pliku ~ / .ssh / config. Możesz określić ustawienia domyślne dla hosta za pomocą pliku konfiguracyjnego.

Host hostname
    User username
    IdentityFile ~/.ssh/somekey

Na dłuższą metę najlepiej jest nauczyć się pliku ~ / .ssh / config.

Dan Garthwaite
źródło
Nie pomaga mi mieć IdentityFile w ssh_config. Mogę „ssh web1” bez problemów, ale przy użyciu rsync do web1: ... kończy się niepowodzeniem z „Permission denied (publickey)”.
Zitrax
1
Spróbuj podkręcić szczegółowość transportu ssh: rsync -e 'ssh -vv' web1: / etc / issue / tmp / issue
Dan Garthwaite
1
Ach Jeśli to automatyzujesz i nie będziesz w stanie podać hasła, będziesz potrzebować dodatkowego klucza SSH bez hasła skonfigurowanego na obu końcach. Jeśli chcesz, aby rsync działał bez hasła w sesji interaktywnej, musisz użyć ssh-agent.
Dan Garthwaite
16
Duuuuuuude! ~/.ssh/configplik - otworzyłeś nowy świat dla mnie!
demaniak
2
~ / .ssh / config uratował mi dzień, wielkie dzięki.
smishra
17

Można to zrobić za pomocą konfiguracji użytkownika SSH patrz: http://www.cyberciti.biz/faq/create-ssh-config-file-on-linux-unix/ w zasadzie edytuj ~ / .ssh / config:

$ nano ~/.ssh/config
#Add Hosts below 
Host server1
HostName examplehost.com
User username
Port 22
IdentityFile /path/to/key

$ rsync -e ssh /home/user/directory [email protected]:home/user/directory/

Powinno to działać dla każdego programu używającego SSH, rsync,

Cbaker510
źródło
4

FYI:

1) Klucz publiczny znajduje się zawsze w katalogu osobistym użytkownika logującego się na zdalnym serwerze, tzn. Jeśli logujesz się jako „kopia zapasowa”, znajduje się on na /home/backup/.ssh/authorized_keys. Identyfikator użytkownika podczas logowania określa klucz publiczny używany w miejscu docelowym.

Możesz wybrać identyfikator użytkownika podczas nawiązywania połączenia na dwa różne sposoby:

ssh [email protected]
or
ssh -l user_id  destination_server     (<-- that is lower case "L")

Z drugiej strony, na twoim końcu klucz prywatny jest w podobny sposób w homedir użytkownika, chyba że zastąpisz go tak, jak opisano w odpowiedzi Dana.

2) W celu utworzenia kopii zapasowej może być pożądane utworzenie klucza z ograniczeniami, który może uruchamiać tylko jedną komendę, np. „Rsync”. Istnieje dobry opis tego, co dotyczy kopii zapasowej „rsnapshot”, która umożliwia zdalne tworzenie kopii zapasowych całego serwera przy użyciu konta użytkownika nieuprzywilejowanego i „sudo”:

„rsnapshot” howto

Rsnapshot może z łatwością wykonać kopię zapasową wielu zdalnych lub lokalnych serwerów, dzięki czemu jest poręcznym i scentralizowanym serwerem kopii zapasowych.

ajaaskel
źródło