Wie kopiert man den öffentlichen Schlüssel auf einen SSH-Server?


33

Folgendes habe ich versucht und es ist ein Fehler aufgetreten:

$ 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

Warum nicht in zwei Schritten? Kopieren Sie es über und hängen Sie es dann an?
Faheem

@FaheemMitha: Das funktioniert, danke! Ich könnte tatsächlich die Ursache von Schwierigkeiten erkennen. Bitte sehen Sie meinen neuen Beitrag ?
Tim

Mit dem Parameter -f benötigen Sie keinen privaten Schlüssel, sodass Sie den Schlüssel nur mit dem öffentlichen Schlüssel einer anderen Person weitergeben können!
Kzqai

Antworten:


67

OpenSSH wird mit einem Befehl dazu geliefert ssh-copy-id. Sie geben ihm einfach die Remote-Adresse und er fügt Ihren öffentlichen Schlüssel zur authorized_keysDatei auf dem Remote-Computer hinzu:

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

Möglicherweise müssen Sie das -iFlag verwenden, um Ihren öffentlichen Schlüssel auf Ihrem lokalen Computer zu suchen:

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

1
Vielen Dank! Warum funktioniert mein Befehl nicht?
Tim

@Tim Diese Antwort hat es erklärt; >>wird von Ihrer Shell verarbeitet, und Sie führen den Befehl über SSH statt über eine Shell aus. Sein Fix, dass SSH eine Shell ausführt, die dann Ihren Befehl
ausführt

Vielen Dank! (1) ssh-copy-id funktioniert auch nicht. Ich kopiere die Datei manuell auf die Fernbedienung und hänge ihren Inhalt an, dann funktioniert es. Ich frage mich, warum das so ist? Ich habe festgestellt, dass meine Standard-Shell auf dem Server ein Skript ist, das ich auf meinen ursprünglichen Beitrag aktualisiere, und möglicherweise der Grund dafür ist. Bitte guck dir das an. (2) Ich frage mich, ob ssh-copy-id nur den öffentlichen Schlüssel auf die Fernbedienung kopiert, aber nicht den privaten und den öffentlichen Schlüssel erstellt, oder?
Tim

1
Angenommen, der SSH-Server ist so konfiguriert, dass er nur die Authentifizierung mit öffentlichem Schlüssel als Authentifizierungsmechanismus akzeptiert . In diesem Fall ssh-copy-idfunktioniert die Verwendung nicht, oder?
Abdull

1
@Abdull Es sei denn, Sie haben bereits einen anderen Schlüssel auf diesem Computer, mit dem Sie eine Verbindung herstellen können. Es ist nur eine Verbindung über SSH
Michael Mrozek

31

Sie könnten immer so etwas tun:

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

Ich bin nicht sicher, ob Sie catvon einem lokalen Computer in eine SSH-Sitzung können. Verschieben Sie es einfach wie vorgeschlagen nach / tmp.

Edit: Genau das ssh-copy-idmacht. Genau wie Michael gesagt hat.


Vielen Dank! Ich frage mich, ob ssh-copy-id nur den öffentlichen Schlüssel auf die Fernbedienung kopiert. Es erstellt nicht den privaten und den öffentlichen Schlüssel, oder?
Tim

Nein, es schafft es nicht. Fügt es einfach hinzu.
Mr. Monkey

@ Mr.Monkey Ja, Sie können Daten in eine SSH-Sitzung leiten (von catoder auf andere Weise). Was Sie beschreiben, ist der altmodische Weg; ssh-copy-idwird empfohlen, da das Risiko von Tippfehlern oder falschen Berechtigungen für Dateien geringer ist.
Gilles 'SO- hör auf böse zu sein'

@ Gilles, Sie haben nicht immer Zugriff auf den Server für den Client, insbesondere wenn Sie einen Computer für den Betrieb vorbereiten. Daher ist diese Methode viel besser als die Verwendung von ssh-cpy-id, da Sie das Gerät oder nicht benötigen Stellen Sie vor dem Einstellen eine Verbindung zum Netzwerk her.
e-info128

1
Oder Sie können einfach Rohr direkt mit dem Ziel : cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'.
Pablo A

7

Diese Antwort beschreibt, wie der in der Frage angegebene beabsichtigte Weg funktioniert.

Sie können auf dem Remotecomputer eine Shell ausführen, um die spezielle Bedeutung des >>Umleitungsoperators zu interpretieren :

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

Der Umleitungsoperator >>wird normalerweise von einer Shell interpretiert.

Wenn Sie ausführen, ssh host 'command >> file'kann nicht garantiert werden, dass command >> filedies von einer Shell interpretiert wird. In Ihrem Fall command >> filewird anstelle der Shell ohne spezielle Interpretation ausgeführt und >>der Befehl als Argument übergeben - genauso wie command '>>' filein einer Shell ausgeführt.

Einige Versionen von SSH (OpenSSH_5.9) rufen automatisch die Shell auf dem Remote-Server auf und übergeben die Befehle an sie, wenn sie Token erkennen, die von einer Shell wie z ; > >>. B. interpretiert werden sollen .


3

opensshbietet ssh-copy-id. Die Reihenfolge wäre:

  • Generieren Sie einen anständigen 4k-Schlüssel

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • Starten Sie Ihren SSH-Agenten und saugen Sie Informationen wie SSH_AGENT_PIDusw. ein.

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • Laden Sie nun die Schlüssel in Ihren SSH-Agenten

    ssh-add ~/.ssh/id_rsa4k
    
  • Überprüfen Sie, ob es geladen ist

    ssh-add -l
    ssh-add -L
    

    Dies zeigt Ihnen, was Sie im ssh-agent haben

  • Nun eigentlich SSH zu einem entfernten System

    ssh username@remotehost.network
    
  • Jetzt können Sie ssh-copy-id ohne Argumente ausführen:

    ssh-copy-id
    

    Dadurch werden ~/.ssh/authorized_keysdie grundlegenden Informationen erstellt und ausgefüllt, die von ssh-agent benötigt werden.


Übrigens habe ich unter github.com/centic9/generate-and-send-ssh-key ein kleines Skript erstellt, das die meisten dieser Schritte auf einmal
ausführt

Dies ist eine großartige Methode, wenn die Kennwortanmeldung deaktiviert ist. Es ermöglicht das Hinzufügen eines neuen Schlüssels während der Authentifizierung mit einem vorherigen Schlüssel.
MountainX

1

Ich hatte Probleme mit der ssh-copy-id, als ich einen anderen Port als 22 gewählt habe. Hier ist mein Oneliner mit einem anderen ssh-Port (zB 7572):

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

0

In der Tat macht der the ssh-copy-idBefehl genau das (aus dem openssh-clientPaket):

ssh-copy-id user@host

Hinweis:
hostBedeutet IP-Adresse oder Domain .


Ich möchte auch etwas hinzufügen weitere Informationen zu dieser

1) Wir können einen anderen Port für SSH auf dem Zielserver angeben :

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

Hinweis:
Der Port muss sich vor dem befinden, sonst user@hostwird er nicht aufgelöst.

Quelle

2) Wir können eine Datei mit einem öffentlichen Schlüssel angeben :

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

Hinweis:
Mit dieser -iOption können wir den entsprechenden Speicherort des Namens in der Datei angeben, die den öffentlichen Schlüssel enthält.

Manchmal kann es nützlich sein, besonders wenn wir es an einem nicht standardmäßigen Ort aufbewahren oder wenn wir mehr als einen öffentlichen Schlüssel auf unserem Computer haben und auf einen bestimmten verweisen möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.