Como @terdon dito você pode usar o seguinte comando para executar algo no servidor remoto através do SSH e salvar (redirecionar) a saída para a instância local:
UserA@HostA:~$ ssh UserB@HostB ls ~ > /home/UserA/ls-of-home-UserB.txt
Além disso, você pode usar o seguinte comando para executar algo na instância local e canalizar a saída para o servidor remoto e salvá-lo pelo comando tee
:
UserA@HostA:~$ ls ~ | ssh UserB@HostB tee /home/UserB/ls-of-home-UserA.txt
Eu sou concordar com @Sebastian Stark Você provavelmente está perguntando como criar um túnel reverso com o encaminhamento de porta SSH. A conexão SSH permite vincular a porta na porta remota do servidor a no local usando a opção -R
. E vice-versa, você pode vincular local porta a porta remota por -L
.
No seu caso, deve ser aplicado o primeiro cenário usando a opção -R
:
UserA@HostA:~$ ssh UserB@HostB -R 2222:localhost:22
Este comando estabelecerá a conexão de HostA
a HostB
como de costume e ligará a porta 2222
on HostB
à porta 22
na interface de loopback em HostA
. Isso significa que quando você solicita alguma coisa na porta 2222
on HostB
, a solicitação será tratada pelo serviço que atende na porta 22
on HostA
, geralmente esse é o servidor SSH. Neste ponto, você pode usar alguns dos seguintes comandos para se conectar de HostB
a HostA
:
UserB@HostB:~$ ssh UserA@HostB -p 2222 UserB@HostB:~$ ssh UserA@localhost -p 2222
Ou você pode usar os comandos acima, por exemplo:
UserB@HostB:~$ ls ~ | ssh UserA@localhost -p 2222 tee /home/UserA/ls-of-home-UserB.txt
Note que você deve ter instalado o servidor SSH em HostA
!
Um uso interessante é que você pode ligar a porta remota em HostB
à porta em outra instância na rede local de HostA
:
UserA@HostA:~$ ssh UserB@HostB -fTN -R 3389:192.168.100.115:3389
Onde 192.168.100.115
é o endereço IP em qualquer computador Windows na LAN de HostA
, vamos chamá-lo de HostC
. As opções -fTN
irão empurrar a conexão ssh para o segundo plano e você terá apenas um túnel de HostB:3389
a HostA
a HostC:3389
.
Estou usando isso por combinação com autossh
para manter a conexão ativa. Por exemplo, eu tenho a próxima linha no meu crontab
:
@reboot sleep 15 && autossh remote-server-with-public-ip -fTN
Em que remote-server-with-public-ip
é um Host definido no meu arquivo ~/.ssh/config
em HostA
:
Host remote-server-with-public-ip
HostName hostB
IdentityFile ~/.ssh/hostB/id_rsa
User userB
Port 22
RemoteForward 2223 127.0.0.1:22
RemoteForward 8080 127.0.0.1:80
RemoteForward 6900 127.0.0.1:5900
RemoteForward 3389 192.168.100.115:3389
As portas 2223
, 6900
, 3389
on HostB
não são públicas e eu posso acessá-las somente por meio de outra conexão SSH - por exemplo, de HostD
que está em algum lugar na Internet. Mas para acessar o 8080
estou usando o Apache com proxy reverso em HostB
:-) e o arquivo de configuração do host virtual se parece com isso:
<VirtualHost _default_:443>
ServerName forward.example.com
# Other configuration directives
SSLEngine on
# SSL certificate files
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass "/" "http://localhost:8080/"
ProxyPassReverse "/" "http://localhost:8080/"
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>
- Os módulos do Apache
proxy
eproxy_http
são obrigatórios.
Leitura adicional: