Solution 1 :
Schéma :
ssh ssh
A ------> B ------> C
^ ^
using A's using B's
ssh key ssh key
Conditions préalables :
A
exécute ssh-agent ;A
peut accéder àB
;B
peut accéder àC
;A
La clé publique ssh de est présente dansB:~/.ssh/authorized_keys
B
La clé publique ssh de est présente dansC:~/.ssh/authorized_keys
En ~/.ssh/config
sur A
, ajouter
Host C
ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'
Si votre clé privée ssh sur B se trouve dans un emplacement non standard, ajoutez son chemin après ssh-add
.
Vous devriez maintenant pouvoir accéder au C
à partir de A
:
A$ ssh C
C$
Solution 2 :
Vérifiez si ce qui suit fonctionne.
ssh -t B ssh C
Utilisez la commande suivante si vous souhaitez utiliser la clé stockée sur B.
ssh -t B ssh -i /path/to/identity_on_B C
Ici, nous spécifions la commande, c'est-à-dire ssh -i /path/to/identity_on_B C
à exécuter sur B au lieu d'un shell de connexion.
Solution 3 :
J'ai travaillé cela maintenant. Voici la solution, qui est assez simple. J'aurais dû le voir plus tôt :
~/.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' est le serveur Proxy que vous traversez. Il doit être configuré comme vous le feriez normalement pour configurer l'accès à un serveur.
'C' est l'hôte de destination. Il doit être configuré pour utiliser 'B' dans le processus de connexion. Le fichier d'identité dans 'C' est le chemin vers la clé ssh sur 'B'. Le ProxyCommand utilise Netcat pour ouvrir la connexion à 'C' à partir de 'B'. Netcat, ou nc, devra être installé sur 'B'.
NOTE1 :Pour que cela fonctionne, vous devez copier le fichier d'identité de B (généralement ~/.ssh/rd_isa) vers A. Je change généralement son nom en rd_isa_B.
NOTE2 :Cette solution fonctionne également pour scp.
J'espère que cela aidera les autres.
Solution 4 :
J'ai écrit un script simple pour répertorier mes clés ssh sur l'instance distante, puis ajouter celle que j'ai sélectionnée à mon agent ssh local. Ce n'est pas très propre, mais me permet de garder toutes les clés à distance plutôt que localement.
Voici le script si quelqu'un est intéressé :
#!/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
Solution 5 :
La réponse de Snowball a beaucoup aidé. Cependant, j'ai apporté quelques modifications à la commande et je voulais expliquer comment cela fonctionne. Compte tenu de cette situation :
ssh ssh
A -------> B -------> C
^ ^
using A's using B's
ssh key ssh key
Modifiez votre ~/.ssh/config
fichier et ajoutez l'hôte B
à travers lequel vous voulez passer, exactement comme vous configureriez normalement un hôte :
Host B
User myusername
HostName b.mycompany.com
Ensuite, vous ajoutez l'hôte C
sur lequel vous voulez vous retrouver :
Host C
User myusername
HostName c.intranet.mycompany.com
ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'
Notez le ProxyCommand
, où :
ssh -T -q
indique qu'il ne doit pas allouer de pseudo-TTY (-T
) et taisez-vous (-q
);- une fois sur l'hôte de saut
B
, nous ajoutons la clé aux clés SSH deA
àssh-add
; - qui ne fonctionne que parce que nous avons transféré l'agent SSH en utilisant
-o 'ForwardAgent yes'
. ssh-add -t 1
indique que je souhaite que la clé soit ajoutée uniquement pendant la seconde nécessaire pour s'authentifier auprès de l'hôte final C ;- et enfin,
nc %h %p
lance unnetcat
connexion à l'hôte final%h
au port%p
(les deux qui seront remplis par SSH sur la base des informations contenues dans le~/.ssh/config
fichier).
Si vous devez spécifier une clé personnalisée sur B
à utiliser, vous pouvez le faire en modifiant le ssh-add
partie :
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'