Lösung 1:
Schema:
ssh ssh
A ------> B ------> C
^ ^
using A's using B's
ssh key ssh key
Voraussetzungen:
Aläuft ssh-agent;Akann aufBzugreifen;Bkann aufCzugreifen;ADer öffentliche ssh-Schlüssel von ist inB:~/.ssh/authorized_keysvorhandenBDer öffentliche ssh-Schlüssel von ist inC:~/.ssh/authorized_keysvorhanden
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 -qgibt 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 vonAhinzu bisssh-add; - was nur funktioniert, weil wir den SSH-Agenten mit
-o 'ForwardAgent yes'weitergeleitet haben . ssh-add -t 1gibt 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 %plöst einennetcataus Verbindung zum Endhost%han Port%p(beide werden von SSH anhand der Angaben im~/.ssh/configausgefü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'