Soluzione 1:
Schema:
ssh ssh
A ------> B ------> C
^ ^
using A's using B's
ssh key ssh key
Precondizioni:
A
sta eseguendo ssh-agent;A
può accedere aB
;B
può accedere aC
;A
La chiave pubblica ssh di è presente inB:~/.ssh/authorized_keys
B
La chiave pubblica ssh di è presente inC:~/.ssh/authorized_keys
In ~/.ssh/config
su A
, aggiungi
Host C
ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'
Se la tua chiave privata ssh su B si trova in una posizione non standard, aggiungi il suo percorso dopo ssh-add
.
Ora dovresti essere in grado di accedere a C
da A
:
A$ ssh C
C$
Soluzione 2:
Controlla se quanto segue funziona.
ssh -t B ssh C
Usa il seguente comando se vuoi usare la chiave memorizzata su B.
ssh -t B ssh -i /path/to/identity_on_B C
Qui stiamo specificando il comando, ad esempio ssh -i /path/to/identity_on_B C
da eseguire su B invece che su una shell di login.
Soluzione 3:
L'ho risolto ora. Ecco la soluzione, che è piuttosto semplice. Avrei dovuto vederlo prima:
~/.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' è il server proxy che stai attraversando. Dovrebbe essere configurato come si configurerebbe normalmente l'accesso a un server.
'C' è l'host di destinazione. Deve essere configurato per utilizzare 'B' nel processo di connessione. Il file di identità in 'C' è il percorso della chiave ssh su 'B'. Il ProxyCommand utilizza Netcat per aprire la connessione a 'C' da 'B'. Netcat, o nc, dovrà essere installato su 'B'.
NOTA 1:Perché funzioni, devi copiare il file di identità di B (di solito ~/.ssh/rd_isa) in A. Di solito cambio il suo nome in rd_isa_B.
NOTA2:Questa soluzione funziona anche per scp.
Spero che questo aiuti gli altri.
Soluzione 4:
Ho scritto un semplice script per elencare fondamentalmente le mie chiavi ssh sull'istanza remota, quindi aggiungere quella che ho selezionato al mio agente ssh locale. Questo non è molto pulito, ma mi consente di conservare tutte le chiavi in una posizione remota piuttosto che in locale.
Ecco lo script se qualcuno è interessato:
#!/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
Soluzione 5:
La risposta di Snowball ha aiutato molto. Tuttavia, ho apportato alcune modifiche al comando e volevo spiegare come funziona. Data questa situazione:
ssh ssh
A -------> B -------> C
^ ^
using A's using B's
ssh key ssh key
Modifica il tuo ~/.ssh/config
file e aggiungi l'host B
attraverso il quale vuoi saltare, proprio come configureresti normalmente un host:
Host B
User myusername
HostName b.mycompany.com
Quindi aggiungi l'host C
su cui vuoi finire:
Host C
User myusername
HostName c.intranet.mycompany.com
ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'
Nota il ProxyCommand
, dove:
ssh -T -q
indica che non deve allocare uno pseudo-TTY (-T
) e stai zitto (-q
);- una volta sull'host di salto
B
, aggiungiamo la chiave alle chiavi SSH diA
attraversossh-add
; - che funziona solo perché abbiamo inoltrato l'agente SSH utilizzando
-o 'ForwardAgent yes'
. ssh-add -t 1
indica che voglio che la chiave venga aggiunta solo per 1 secondo necessario per l'autenticazione all'host finale C;- e infine,
nc %h %p
avvia unnetcat
connessione all'host finale%h
alla porta%p
(entrambi compilati da SSH in base alle informazioni nel~/.ssh/config
file).
Se devi specificare una chiave personalizzata su B
da usare, puoi farlo modificando il 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'