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?


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.


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 user@remote.host.net:home/user/directory/

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



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 user_id@destination.server
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.

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.