Jak używać pliku tożsamości z rsync?

125

Jak używać pliku tożsamości z rsync?

To jest składnia, której myślę, że powinienem używać z rsync, aby użyć pliku tożsamości do połączenia:

rsync -avz -e 'ssh -p1234 -i ~ / .ssh / 1234-identity' \
„/ local / dir /” [email protected]: „/ remote / dir /”

Ale daje mi błąd:

Ostrzeżenie: plik tożsamości ~ / .ssh / 1234-identity niedostępny: nie ma takiego pliku lub katalogu.

Plik jest w porządku, uprawnienia są ustawione poprawnie, działa podczas wykonywania ssh - tylko nie z rsync - przynajmniej w mojej składni. Co ja robię źle? Czy próbuje znaleźć plik tożsamości na komputerze zdalnym? Jeśli tak, jak określić, że chcę używać pliku tożsamości na komputerze lokalnym ?

cwd
źródło

Odpowiedzi:

86

Możesz użyć ssh-agenti ssh-addzaładować klucz do pamięci. sshautomatycznie spróbuje tożsamości z ssh-agent, jeśli może je znaleźć. Polecenia byłyby

eval $(ssh-agent) # Create agent and environment variables
ssh-add ~/.ssh/1234-identity

ssh-agentjest demonem użytkownika, który przechowuje w pamięci niezaszyfrowane klucze ssh. ssh znajduje go na podstawie zmiennych środowiskowych, które ssh-agent wyświetla po uruchomieniu. Użycie evaldo oceny tego wyniku tworzy zmienne środowiskowe. ssh-addjest poleceniem zarządzającym pamięcią kluczy. Agenta można zablokować za pomocą ssh-add. Domyślny okres istnienia klucza można określić podczas uruchamiania programu ssh-agent i / lub określić dla klucza podczas jego dodawania.

Możesz także ustawić plik ~ / .ssh / config, aby podać port i definicję klucza. (Więcej opcji znajdziesz w `man ssh_config).

host 22.33.44.55
    IdentityFile ~/.ssh/1234-identity
    Port 1234

Pojedyncze cytowanie polecenia ssh zapobiegnie rozszerzaniu powłoki, które jest potrzebne w przypadku ~lub $HOME. Możesz użyć pełnej lub względnej ścieżki do klucza w pojedynczych cudzysłowach.

BillThor
źródło
2
Podwójne cudzysłowy i użycie $ HOME rozwiązało mój problem. Czy możesz wyjaśnić, co robią pierwsze dwa polecenia? Znałem już konfigurację pliku konfiguracyjnego - jedynym problemem jest sytuacja, gdy mam wiele kont na jednym serwerze. Nie spodziewam się, że pozwoliłoby mi to określić wiele plików tożsamości dla tego samego hosta.
cwd
+1 To rozwiązało mój problem z drone.io :) Wielkie dzięki.
Bhargav Nanekalva
To jest cholernie niesamowite. FTR, możesz również określić domyślną nazwę użytkownika do połączenia, np. User ubuntuPodczas konfigurowania instancji EC2 Ubuntu :) Dzięki!
DanielSmedegaardBuus
Jeśli używasz powłoki w stylu csh (takiej jak fish), zróbeval (ssh-agent -c)
Dave
77

Użyj albo $HOME

rsync -avz -e "ssh -p1234  -i \"$HOME/.ssh/1234-identity\"" dir remoteUser@server:

lub pełna ścieżka do klucza:

rsync -avz -e "ssh -p1234  -i /home/username/.ssh/1234-identity" dir user@server:

Testowane z rsync 3.0.9 na Ubuntu

Tombart
źródło
3
Tak, to działa dobrze, nie ma potrzeby używania ssh-agent ani innych opcji konfiguracyjnych.
laurent
2
+1: to globalny problem, tak jak nie można było zrobić „ls '~'”
Alex
$HOMEnie będzie działać w prostych cudzysłowach (bez rozwijania zmiennych), więc musisz użyć podwójnych cudzysłowów lub ścieżki bezwzględnej.
anol
w standardzie Bash powinien działać "$HOME"lub $HOMEbez różnicy (również "${HOME}"jest możliwy, jeśli chcesz to skomplikować)
Tombart.
Zmieniłem pojedyncze cudzysłowy na podwójne.
Steve Bennett
36

Musisz określić bezwzględną ścieżkę do pliku kluczy tożsamości. To prawdopodobnie jakieś dziwactwo w rsync. (w końcu nie może być idealne)

Napotkałem ten problem zaledwie kilka dni temu :-)

Alpha01
źródło
Możesz użyć ~, ale nie możesz go osadzić w pojedynczych cudzysłowach, ponieważ wtedy nie zostanie poprawnie podstawiony do / home / nazwa_użytkownika / musisz użyć cudzysłowów, aby poprawnie działało, zobacz rozwiązanie @ilcavero
X Tian
24

To działa dla mnie

rsync -avz --rsh="ssh -p1234  -i ~/.ssh/1234-identity"  \
"/local/dir/" [email protected]:"/remote/dir/"
ilcavero
źródło
2
Z jakiegoś powodu musiałem podać pełną ścieżkę do pliku tożsamości, tj /home/user/.ssh/1234-identity. Wtedy zadziałało. Prawdopodobnie dlatego, że jest to inna powłoka, jak sugeruje odpowiedź Darhuuka.
osa
@osa, uratowałeś mnie tam! Miałem problem z Drupalem i rSYNC, a problemem była ścieżka ... dziwna.
Lee Woodman
6

Czy wykonujesz polecenie w bash czy sh? To może mieć znaczenie. Spróbuj wymienić ~z $HOME. Spróbuj umieścić ciąg dla -eopcji w cudzysłowie.

Darhuuk
źródło
6

użyj pliku klucza z rsync:

rsync -rave "ssh -i /home/test/pkey_new.pem" /var/www/test/ [email protected]:/var/www/test
Avinash Raut
źródło