如何从SSH服务器端访问SSH客户端?

通常有一个SSH客户端连接到SSH服务器。 然后,客户端放置在服务器上执行的命令。 现在,有没有办法以相反的方式做到这一点? 这样客户端就连接到服务器,但服务器也连接到客户端,并且能够在客户端上执行命令。 那可能吗?

我正在寻找的原因是我在两个不同的网络中有两个服务器(A和B),两个网络都连接到Internet。 服务器A可以通过端口转发访问,但服务器B不能。 由于服务器A完成了所有工作,我希望服务器B连接到服务器A,并且只做服务器A希望它做的任何事情。

像这样的反向连接可能吗? 或者可能是双向SSH连接?

编辑

作为一个例子,我想做以下事情。 在服务器A上,知道服务器B是SSH连接到我,我想连接到服务器B并发出命令,如

echo "This is test content." > /home/myuser/mytestfile` 

之后,我想找一个文件

 /home/myuser/mytestfile 

在服务器B.

正如@terdon 所说,您可以使用以下命令通过SSH在远程服务器上执行某些操作,并将输出保存(重定向)到本地实例:

 UserA @ HostA:〜$ ssh UserB @ HostB ls~> /home/UserA/ls-of-home-UserB.txt

您还可以使用以下命令在本地实例上执行某些操作 ,并将输出通过管道输出到远程服务器,并通过命令tee保存:

 UserA @ HostA:〜$ ls~ |  ssh UserB @ HostB tee /home/UserB/ls-of-home-UserA.txt

我同意 @Sebastian Stark您可能会问如何使用SSH端口转发创建反向隧道。 SSH连接允许使用选项-R远程服务器上的端口绑定 本地端口。 反之亦然,您可以通过-L本地端口绑定 远程端口。

在您的情况下,应该使用选项-R应用第一个场景:

 UserA @ HostA:〜$ ssh UserB @ HostB -R 2222:localhost:22

此命令将照常建立从HostAHostB连接,并将HostB上的端口2222绑定到HostA上的环回接口上的端口22 。 这意味着当您在HostB上的端口2222上请求某些内容时,请求将由在HostA上的端口22上侦听的服务处理,通常这是SSH服务器。 此时,您可以使用以下某些命令从HostB连接回HostA

 UserB @ HostB:〜$ ssh UserA @ HostB -p 2222
 UserB @ HostB:〜$ ssh UserA @ localhost -p 2222

或者您可以使用上述命令,例如:

 UserB @ HostB:〜$ ls~ |  ssh UserA @ localhost -p 2222 tee /home/UserA/ls-of-home-UserB.txt

请注意,您应该在HostA上安装SSH服务器!


一个有趣的用法是您可以将HostB上的远程端口绑定到HostA本地网络中其他实例上的端口:

 UserA @ HostA:〜$ ssh UserB @ HostB -fTN -R 3389:192.168.100.115:3389

其中192.168.100.115HostA局域网中任何Windows计算机上的IP地址,我们称之为HostC 。 选项-fTN将ssh连接推送到后台,你将只有一个从HostB:3389的隧道HostB:3389HostAHostC:3389


我通过与autossh结合使用它来保持连接活着。 例如,我的crontab有下一行:

 @reboot sleep 15 && autossh remote-server-with-public-ip -fTN 

remote-server-with-public-ip是在HostA上的~/.ssh/config文件中定义的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 

HostB上的端口2223不是公共的,我只能通过另一个SSH连接访问它们 – 例如来自HostD上某处的HostD 。 但要访问8080我在HostB上使用带反向代理的Apache :-),虚拟主机的配置文件如下所示:

  ServerName forward.example.com # Other configuration directives SSLEngine on # SSL certificate files ProxyRequests Off  Order deny,allow Allow from all  ProxyPass "/" "http://localhost:8080/" ProxyPassReverse "/" "http://localhost:8080/"  Order allow,deny Allow from all   
  • Apache的模块proxyproxy_http是必需的。

进一步阅读:

  • 访问NAT后面的远程多个服务器
  • 制作.sh脚本以检查SSH连接是否存在,如果不存在则连接
  • 使用传出SSH接收传入的SSH