Jak skopiować klucz publiczny na serwer ssh?


33

Oto, co próbowałem i mam błąd:

$ cat /home/tim/.ssh/id_rsa.pub | ssh tim@just.some.other.server 'cat >> .ssh/authorized_keys'
Password: 
cat: >>: No such file or directory
cat: .ssh/authorized_keys: No such file or directory

Dlaczego nie zrobić tego w dwóch krokach? Skopiować, a następnie dołączyć?
Faheem Mitha,

@FaheemMitha: To działa, dziękuję! Właściwie mógłbym zrozumieć przyczynę kłopotów. Proszę zobaczyć mój nowy post ?
Tim

Z parametrem -f nie potrzebujesz klucza prywatnego, więc możesz przekazać mu klucz tylko z czyimś kluczem publicznym!
Kzqai,

Odpowiedzi:


67

OpenSSH pochodzi z poleceniem, aby to zrobić, ssh-copy-id. Po prostu nadajesz mu adres zdalny, a on dodaje klucz publiczny do authorized_keyspliku na zdalnym komputerze:

$ ssh-copy-id tim@just.some.other.server

Może być konieczne użycie -iflagi do zlokalizowania klucza publicznego na komputerze lokalnym:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub tim@just.some.other.server

1
Dzięki! Dlaczego moje polecenie nie działa?
Tim

@Tim Ta odpowiedź to wyjaśniła; >>jest obsługiwany przez twoją powłokę, a komendę uruchamiasz przez SSH zamiast przez powłokę. Jego poprawka polegająca na tym, że SSH uruchamia powłokę, która następnie uruchamia twoje polecenie, powinna działać
Michael Mrozek

Dzięki! (1) ssh-copy-id też nie działa. Ręcznie kopiuję plik do pilota i dołączam jego zawartość, a następnie działa. Zastanawiam się dlaczego? Odkryłem, że moją domyślną powłoką na serwerze jest skrypt, który aktualizuję do mojego oryginalnego postu i może być przyczyną. Proszę spojrzeć. (2) Zastanawiam się, czy ssh-copy-id to po prostu skopiowanie klucza publicznego do pilota, to nie tworzy klucza prywatnego i publicznego, prawda?
Tim

1
Załóżmy, że serwer SSH jest skonfigurowany w taki sposób, że akceptuje tylko uwierzytelnianie za pomocą klucza publicznego jako mechanizm uwierzytelniania. W takim przypadku używanie ssh-copy-idnie będzie działać, prawda?
Abdull

1
@ Abdull Nie, chyba że masz już inny klucz na tym komputerze do połączenia. Po prostu łączy się przez SSH
Michael Mrozek

31

Zawsze możesz zrobić coś takiego:

scp ~/.ssh/id_rsa.pub user@remote.example.com:/tmp/id_rsa.pub
ssh user@remote.example.com 
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

Nie jestem pewien, czy możesz catz lokalnego komputera na sesję ssh. Po prostu przenieś go do / tmp zgodnie z sugestią.

Edycja: Właśnie to ssh-copy-idrobi. Tak jak powiedział Michael.


Dzięki! Zastanawiam się, czy ssh-copy-id to po prostu skopiowanie klucza publicznego do pilota. Nie tworzy klucza prywatnego i publicznego, prawda?
Tim

Nie, to go nie tworzy. Po prostu to dodaje.
Pan Monkey

@ Mr.Monkey Tak, możesz przesyłać dane do sesji ssh (z catlub w inny sposób). To, co opisujesz, to staromodny sposób; ssh-copy-idjest zalecane, ponieważ istnieje mniejsze ryzyko literówek lub niewłaściwych uprawnień dla plików.
Gilles „SO- przestań być zły”

@Gilles, Nie zawsze masz dostęp do serwera do klienta, szczególnie gdy przygotowujesz komputer do jego działania, więc ta metoda jest znacznie lepsza niż użycie ssh-cpy-id, ponieważ nie musisz brać sprzętu lub połącz się z siecią przed ustawieniem.
e-info128,

1
Albo można po prostu rura bezpośrednio do miejsca przeznaczenia : cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'.
Pablo A

7

Ta odpowiedź opisuje, jak sprawić, by zamierzony sposób pokazany w pytaniu działał.

Możesz uruchomić powłokę na komputerze zdalnym, aby zinterpretować specjalne znaczenie >>operatora przekierowania:

ssh tim@just.some.other.server sh -c "'cat >> .ssh/authorized_keys'" < /home/tim/.ssh/id_rsa.pub

Operator przekierowania >>jest zwykle interpretowany przez powłokę.

Podczas wykonywania ssh host 'command >> file'nie ma gwarancji, że command >> filezostanie zinterpretowana przez powłokę. W twoim przypadku command >> filejest wykonywany zamiast powłoki bez specjalnej interpretacji i >>przekazany do polecenia jako argument - w ten sam sposób, jak command '>>' filew powłoce.

Niektóre wersje SSH (OpenSSH_5.9) automatycznie wywołują powłokę na zdalnym serwerze i przekazują do niej polecenia (polecenia), gdy wykryją tokeny do interpretacji przez powłokę, taką jak ; > >>itp.


3

opensshzapewnia ssh-copy-id. Sekwencja będzie następująca:

  • Wygeneruj porządny klucz 4k

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • Uruchom agenta ssh i zasysaj informacje takie jak SSH_AGENT_PIDitp.

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • Teraz zacznij ładować klucze do swojego agenta SSH

    ssh-add ~/.ssh/id_rsa4k
    
  • Sprawdź, czy jest załadowany

    ssh-add -l
    ssh-add -L
    

    To pokaże ci, co masz w agencie ssh

  • Teraz faktycznie SSH do zdalnego systemu

    ssh username@remotehost.network
    
  • Teraz możesz uruchomić ssh-copy-id bez argumentów:

    ssh-copy-id
    

    Spowoduje to ~/.ssh/authorized_keysutworzenie i uzupełnienie podstawowych informacji wymaganych od ssh-agent.


BTW, stworzyłem mały skrypt na github.com/centic9/generate-and-send-ssh-key, który uruchamia większość tych kroków za jednym razem i dodatkowo zapewnia uprawnienia do plików / katalogów, które zwykle zawsze powodowały bóle głowy ...
centic

Jest to świetna metoda do użycia, gdy logowanie hasłem jest wyłączone. Umożliwia dodanie nowego klucza podczas uwierzytelniania przy użyciu poprzedniego klucza.
MountainX

1

Miałem problemy z ssh-copy-id przy wyborze innego portu niż 22 ... więc oto mój oneliner z innym portem ssh (np. 7572):

ssh yourServer.dom -p7572 "mkdir .ssh; chmod 700 .ssh; umask 177; sh -c 'cat >> .ssh/authorized_keys'" < .ssh/id_rsa.pub

0

Rzeczywiściethe ssh-copy-id komenda robi dokładnie to (z openssh-clientpakietu):

ssh-copy-id user@host

Uwaga:
hostoznacza adres IP lub domenę .


Chciałbym również dodać do tego kilka dodatkowych informacji

1) Możemy określić inny port SSH na serwerze docelowym:

ssh-copy-id "-p 8127 user@host"

Uwaga: portu musi być z przodu lub go nie rozwiąże.
user@host

Źródło

2) Możemy określić plik z kluczem publicznym :

ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

Uwaga:
Ta -iopcja pozwala nam wskazać odpowiednią lokalizację nazwy w pliku zawierającym klucz publiczny.

Czasami może się przydać, zwłaszcza jeśli przechowujemy go w niestandardowej lokalizacji lub gdy mamy więcej niż jeden klucz publiczny na naszym komputerze i chcemy wskazać konkretny.

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.