Solución 1:
Esquema:
ssh ssh
A ------> B ------> C
^ ^
using A's using B's
ssh key ssh key
Condiciones previas:
A
está ejecutando ssh-agent;A
puede acceder aB
;B
puede acceder aC
;A
La clave pública ssh de está presente enB:~/.ssh/authorized_keys
B
La clave pública ssh de está presente enC:~/.ssh/authorized_keys
En ~/.ssh/config
en A
, agregar
Host C
ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'
Si su clave privada ssh en B está en una ubicación no estándar, agregue su ruta después de ssh-add
.
Ahora debería poder acceder a C
de A
:
A$ ssh C
C$
Solución 2:
Compruebe si lo siguiente funciona.
ssh -t B ssh C
Use el siguiente comando si desea usar la clave almacenada en B.
ssh -t B ssh -i /path/to/identity_on_B C
Aquí estamos especificando el comando, es decir, ssh -i /path/to/identity_on_B C
para ejecutarse en B en lugar de un shell de inicio de sesión.
Solución 3:
He resuelto esto ahora. Aquí está la solución, que es bastante sencilla. Debería haberlo visto antes:
~/.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' es el servidor Proxy por el que está saltando. Debe configurarse como normalmente configuraría el acceso a un servidor.
'C' es el host de destino. Debe configurarse para usar 'B' en el proceso de conexión. El archivo de identidad en 'C' es la ruta a la clave ssh en 'B'. El ProxyCommand usa Netcat para abrir la conexión a 'C' desde 'B'. Netcat, o nc, deberá instalarse en 'B'.
NOTA 1:Para que esto funcione, debe copiar el archivo de identidad de B (generalmente ~/.ssh/rd_isa) a A. Normalmente cambio su nombre a rd_isa_B.
NOTA 2:Esta solución también funciona para scp.
Espero que esto ayude a otros.
Solución 4:
Escribí un script simple para enumerar básicamente mis claves ssh en la instancia remota y luego agregar la que seleccioné a mi agente ssh local. Esto no es muy limpio, pero me permite mantener todas las claves en una ubicación remota en lugar de localmente.
Aquí está el guión si alguien está interesado:
#!/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
Solución 5:
La respuesta de Snowball ayudó mucho. Sin embargo, hice algunas modificaciones al comando y quería explicar cómo funciona. Dada esta situación:
ssh ssh
A -------> B -------> C
^ ^
using A's using B's
ssh key ssh key
Modifica tu ~/.ssh/config
archivo y agregue el host B
a través del cual desea saltar, tal como normalmente configuraría un host:
Host B
User myusername
HostName b.mycompany.com
Luego agrega el host C
en el que quieres terminar:
Host C
User myusername
HostName c.intranet.mycompany.com
ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'
Tenga en cuenta el ProxyCommand
, donde:
ssh -T -q
indica que no debe asignar un pseudo-TTY (-T
) y silencio (-q
);- una vez en el host de salto
B
, añadimos la clave a las claves SSH deA
a través dessh-add
; - que solo funciona porque reenviamos el agente SSH usando
-o 'ForwardAgent yes'
. ssh-add -t 1
indica que quiero que se agregue la clave solo durante el segundo necesario para autenticarse en el host final C;- y finalmente,
nc %h %p
inicia unnetcat
conexión al host final%h
en el puerto%p
(ambos serán completados por SSH según la información en el~/.ssh/config
archivo).
Si necesita especificar una clave personalizada en B
para usar, puede hacerlo modificando el ssh-add
parte:
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'