Lösung 1:
Schema:
ssh ssh
A ------> B ------> C
^ ^
using A's using B's
ssh key ssh key
Voraussetzungen:
A
läuft ssh-agent;A
kann aufB
zugreifen;B
kann aufC
zugreifen;A
Der öffentliche ssh-Schlüssel von ist inB:~/.ssh/authorized_keys
vorhandenB
Der öffentliche ssh-Schlüssel von ist inC:~/.ssh/authorized_keys
vorhanden
In ~/.ssh/config
auf A
, hinzufügen
Host C
ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'
Wenn sich Ihr privater ssh-Schlüssel auf B an einem nicht standardmäßigen Speicherort befindet, fügen Sie seinen Pfad nach ssh-add
hinzu .
Sie sollten jetzt auf C
zugreifen können ab A
:
A$ ssh C
C$
Lösung 2:
Überprüfen Sie, ob Folgendes funktioniert.
ssh -t B ssh C
Verwenden Sie den folgenden Befehl, wenn Sie den auf B gespeicherten Schlüssel verwenden möchten.
ssh -t B ssh -i /path/to/identity_on_B C
Hier geben wir den Befehl an, z. B. ssh -i /path/to/identity_on_B C
auf B anstelle einer Login-Shell auszuführen.
Lösung 3:
Ich habe das jetzt ausgearbeitet. Hier ist die Lösung, die ziemlich einfach ist. Ich hätte es früher sehen sollen:
~/.ssh/config:
Host B
HostName 1.2.3.4
User myuser
IdentityFile ~/.ssh/rsa_key
ControlMaster auto
ControlPath ~/.ssh/socket/master-%l-%[email protected]%h:%p
Host C.*
User customer_username
Port customer_port
IdentityFile remote/path/to/ssh/key
ForwardAgent yes
ProxyCommand ssh accessable.server nc %h %p
Host C.server-1
HostName 2.3.4.5
'B' ist der Proxy-Server, durch den Sie springen. Es sollte so konfiguriert werden, wie Sie normalerweise den Zugriff auf einen Server konfigurieren würden.
'C' ist der Zielhost. Es muss konfiguriert werden, um „B“ im Verbindungsprozess zu verwenden. Die Identitätsdatei in 'C' ist der Pfad zum ssh-Schlüssel auf 'B'. Der ProxyCommand verwendet Netcat, um die Verbindung zu „C“ von „B“ zu öffnen. Netcat oder nc muss auf 'B' installiert werden.
HINWEIS1:Damit dies funktioniert, müssen Sie die Identitätsdatei von B (normalerweise ~/.ssh/rd_isa) nach A kopieren. Normalerweise ändere ich ihren Namen in rd_isa_B.
HINWEIS2:Diese Lösung funktioniert auch für scp.
Hoffe, das hilft anderen.
Lösung 4:
Ich habe ein einfaches Skript geschrieben, um meine SSH-Schlüssel auf der Remote-Instanz aufzulisten und dann den von mir ausgewählten zu meinem lokalen SSH-Agenten hinzuzufügen. Das ist nicht sehr sauber, erlaubt mir aber, alle Schlüssel an einem entfernten Ort statt lokal aufzubewahren.
Hier ist das Skript, falls es jemanden interessiert:
#!/usr/bin/ruby
require "rubygems"
require "fileutils"
# Get key list
key_list = (`ssh jumpbox "cd ~/.ssh/ ; ls id_rsa*" | sed 's/id_rsa_/ /g' | sed 's/id_rsa//g'`)
puts ' '
puts 'Available customer keys:'
puts key_list
# Get customer name input
puts ' '
puts 'Enter customer name: '
customer_name = gets.chomp
# Add key to ssh-agent
key_name = "~/.ssh/id_rsa_#{customer_name}"
puts ' '
puts "Adding #{key_name} to local ssh-agent"
`ssh jumpbox "ssh-add ~/.ssh/id_rsa_#{customer_name}"`
exit 0
Lösung 5:
Die Antwort von Snowball hat sehr geholfen. Ich habe jedoch einige Änderungen am Befehl vorgenommen und wollte erklären, wie er funktioniert. Angesichts dieser Situation:
ssh ssh
A -------> B -------> C
^ ^
using A's using B's
ssh key ssh key
Ändern Sie Ihren ~/.ssh/config
Datei und fügen Sie den Host B
hinzu durch die Sie springen möchten, genau so, wie Sie normalerweise einen Host konfigurieren würden:
Host B
User myusername
HostName b.mycompany.com
Dann fügen Sie den Host C
hinzu auf dem Sie landen möchten:
Host C
User myusername
HostName c.intranet.mycompany.com
ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'
Beachten Sie den ProxyCommand
, wobei:
ssh -T -q
gibt an, dass kein Pseudo-TTY (-T
) und be quiet (-q
);- einmal auf dem Sprunghost
B
, fügen wir den Schlüssel zu den SSH-Schlüsseln vonA
hinzu bisssh-add
; - was nur funktioniert, weil wir den SSH-Agenten mit
-o 'ForwardAgent yes'
weitergeleitet haben . ssh-add -t 1
gibt an, dass ich möchte, dass der Schlüssel nur für die 1 Sekunde hinzugefügt wird, die zur Authentifizierung beim letzten Host C benötigt wird;- und schließlich
nc %h %p
löst einennetcat
aus Verbindung zum Endhost%h
an Port%p
(beide werden von SSH anhand der Angaben im~/.ssh/config
ausgefüllt Datei).
Wenn Sie einen benutzerdefinierten Schlüssel für B
angeben müssen verwenden möchten, können Sie dies tun, indem Sie den ssh-add
ändern Teil:
Host C
User myusername
HostName c.intranet.mycompany.com
ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 ~/.ssh/mykey && nc %h %p'