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
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
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
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)
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.
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.
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