如何从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
此命令将照常建立从HostA
到HostB
连接,并将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.115
是HostA
局域网中任何Windows计算机上的IP地址,我们称之为HostC
。 选项-fTN
将ssh连接推送到后台,你将只有一个从HostB:3389
的隧道HostB:3389
到HostA
到HostC: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的模块
proxy
和proxy_http
是必需的。
进一步阅读:
- 访问NAT后面的远程多个服务器
- 制作.sh脚本以检查SSH连接是否存在,如果不存在则连接
- 使用传出SSH接收传入的SSH