Como criar uma cadeia de túnel ssh em um comando?

6

Temos um serverA para se conectar. Em seguida, usamos serverA para conectar-se ao databaseB. Configuração como esta em Putty (windows):

Sessão1:
1. conectar-se a admin @ serverA
2. instalação de porta local de túnel 10022 para databaseB: 22
3. execute 'vi'

Session2:
1. conectar-se a admin @ localhost: 10022
2. instalação de porta local do túnel 1521 para o banco de dados 1521
3. execute 'vi'

(vi é usado para manter a sessão)

Então, use o localhost: 1521 para conexão com o banco de dados.

Gostaria de saber se posso fazer isso em um único comando ou em um arquivo de lote no cygwin? Note que não consigo abrir a porta no serverA

    
por jackysee 04.03.2011 / 11:50

5 respostas

6

ssh -L 1521:127.0.0.1:61521 admin@serverA ssh -L 61521:127.0.0.1:1521 admin@databaseB

ou usando plink (link Putty) a partir de uma janela de comando:

plink -ssh -L 1521:127.0.0.1:61521 admin@serverA ssh -L 61521:127.0.0.1:1521 admin@databaseB
    
por 06.03.2011 / 11:26
3

Para executar isto como um único comando, a resposta anterior está correta, mas se o segundo ssh requerer uma senha, provavelmente não funcionará (dependendo da configuração padrão do ssh). Você terá que forçar a alocação de uma pseudo-tty usando a opção -t, como em:

ssh -t -L 1521:127.0.0.1:61521 admin@serverA ssh -L 61521:127.0.0.1:1521 admin@databaseB

(isso funciona usando o comando ssh do cygwin)

    
por 18.10.2011 / 21:12
2

Você pode usar a opção ProxyCommand para isso. Coloque o seguinte no seu arquivo de configuração ssh (que geralmente está em ~/.ssh/config ):

Host direct-serverB
ProxyCommand ssh admin@serverA ssh admin@serverB sshd -i

Em seguida, você pode se conectar ao servidorB como se estivesse diretamente disponível:

% ssh -L 1521:localhost:1521 admin@direct-serverB

Este comando não abre nenhuma porta no servidor intermediárioA. No entanto, tem uma desvantagem de que você precisa se autenticar no serverB tanto do serverA quanto da sua máquina local.

Se o servidorA tiver netcat instalado, você poderá escrever isso em sua configuração ssh:

Host direct-serverB
ProxyCommand ssh admin@serverA nc -q0 serverB 22

e descarte a etapa de autenticação serverA → serverB.

    
por 08.11.2013 / 13:27
1

Eu tentaria executar:

ssh admin@serverA -L 10022:databaseB:22
ssh admin@localhost -p 10022 -L 1521:database2:1521

Mas cara, eu me encolho mesmo sugerindo isso. As pessoas que protegeram o firewall do DatabaseB provavelmente tinham uma boa razão para fazê-lo. Fale com eles.

    
por 04.03.2011 / 12:16
0

O seguinte é o que funcionou para mim.
- Meu objetivo era apontar o aplicativo cliente para localhost: 1115 e fazer com que ele realmente estivesse se conectando a target_db_server: 1433.
- target_db_server só é acessível a partir do jumpserver2.
- jumpserver2 é acessível somente a partir do jumpserver1.
- O comando, portanto, conecta-se ao jumpserver1, solicita um token (no meu caso) e, em seguida, conecta-se ao jumpserver2 e solicita a senha desse servidor, em seguida, o cliente local pode fazer a conexão.

ssh -L 1115:127.0.0.1:1115 username@jumpserver1 -tt ssh -L 1115:target_db_server:1433  username@jumpserver2

Descobri que a conexão expiraria, o que não era ideal. O seguinte fixo que:

echo "Host *" >> ~/.ssh/config
echo "ServerAliveInterval 60" >> ~/.ssh/config
    
por 11.08.2018 / 01:38

Tags