Řešení 1:
Schéma:
ssh ssh
A ------> B ------> C
^ ^
using A's using B's
ssh key ssh key
Předpoklady:
A
běží ssh-agent;A
má přístup kB
;B
má přístup kC
;A
Veřejný klíč ssh je přítomen vB:~/.ssh/authorized_keys
B
Veřejný klíč ssh je přítomen vC:~/.ssh/authorized_keys
V ~/.ssh/config
na A
, přidejte
Host C
ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'
Pokud je váš soukromý klíč ssh na B v nestandardním umístění, přidejte jeho cestu za ssh-add
.
Nyní byste měli mít přístup k C
od A
:
A$ ssh C
C$
Řešení 2:
Zkontrolujte, zda následující funguje.
ssh -t B ssh C
Pokud chcete použít klíč uložený na B.
, použijte následující příkazssh -t B ssh -i /path/to/identity_on_B C
Zde zadáváme příkaz, tj. ssh -i /path/to/identity_on_B C
který se má spustit na B namísto přihlašovacího shellu.
Řešení 3:
Teď jsem to vyřešil. Zde je řešení, které je poměrně jednoduché. Měl jsem to vidět dřív:
~/.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' je proxy server, kterým procházíte. Měl by být nakonfigurován tak, jak byste normálně konfigurovali přístup k serveru.
'C' je cílový hostitel. Musí být nakonfigurován tak, aby v procesu připojení používal „B“. Soubor identity v 'C' je cesta ke klíči ssh v 'B'. ProxyCommand používá Netcat k otevření připojení k 'C' z 'B'. Netcat nebo nc bude nutné nainstalovat na 'B'.
POZNÁMKA 1:Aby to fungovalo, musíte zkopírovat soubor identity B (obvykle ~/.ssh/rd_isa) do A. Obvykle měním jeho název na rd_isa_B.
POZNÁMKA 2:Toto řešení funguje také pro scp.
Doufám, že to pomůže ostatním.
Řešení 4:
Napsal jsem jednoduchý skript, který v podstatě vypíše mé ssh klíče na vzdálené instanci, a poté přidá ten, který jsem vybral, do svého místního ssh agenta. To není příliš čisté, ale umožňuje mi ponechat všechny klíče na vzdáleném místě, nikoli lokálně.
Zde je skript, pokud by měl někdo zájem:
#!/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
Řešení 5:
Odpověď Snowball hodně pomohla. Udělal jsem však nějaké úpravy příkazu a chtěl jsem vysvětlit, jak to funguje. Vzhledem k této situaci:
ssh ssh
A -------> B -------> C
^ ^
using A's using B's
ssh key ssh key
Upravte ~/.ssh/config
a přidejte hostitele B
přes který chcete přejít, přesně tak, jak byste normálně nakonfigurovali hostitele:
Host B
User myusername
HostName b.mycompany.com
Poté přidáte hostitele C
na které chcete skončit:
Host C
User myusername
HostName c.intranet.mycompany.com
ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'
Všimněte si ProxyCommand
, kde:
ssh -T -q
znamená, že by neměl přidělovat pseudo-TTY (-T
) a buďte zticha (-q
);- jednou na hostiteli skoku
B
, přidáme klíč ke klíčům SSHA
ažssh-add
; - což funguje pouze proto, že jsme agenta SSH přeposlali pomocí
-o 'ForwardAgent yes'
. ssh-add -t 1
označuje, že chci, aby byl klíč přidán pouze na 1 sekundu potřebnou k ověření ke konečnému hostiteli C;- a nakonec
nc %h %p
inicializujenetcat
připojení ke konečnému hostiteli%h
na portu%p
(obě údaje vyplní SSH na základě informací v~/.ssh/config
soubor).
Pokud potřebujete zadat vlastní klíč na B
Chcete-li použít, můžete to provést úpravou ssh-add
část:
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'