通常有一个 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 中。
答案1
作为@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
我是同意 @塞巴斯蒂安·斯塔克您可能想问如何使用 SSH 端口转发创建反向隧道。SSH 连接允许在偏僻的服务器到端口上的当地的通过使用选项-R
. 反之亦然,你可以绑定当地的港口到 偏僻的港口-L
。
您的情况应该使用以下选项应用第一种方案-R
:
UserA@HostA:~$ ssh 用户B@主机B -R 2222:localhost:22
此命令将照常建立从HostA
到 的连接,并将上的端口绑定到上的环回接口上的端口。这意味着当您请求HostB
2222
HostB
22
HostA
某物端口上2222
的请求将由监听端口上HostB
的服务处理,通常是 SSH 服务器。此时,您可以使用以下一些命令从 重新连接:22
HostA
HostB
HostA
UserB@HostB:~$ ssh 用户A@主机B -p 2222 UserB@HostB:~$ ssh 用户A@localhost -p 2222
或者也可以使用上面的命令,例如:
UserB@HostB:~$ ls ~ | ssh UserA@localhost -p 2222 tee /home/UserA/ls-of-home-UserB.txt
请注意,您应该已经在 上安装了 SSH 服务器HostA
!
一个有趣的用法是,您可以将远程端口绑定HostB
到本地网络中其他实例的端口HostA
:
UserA@HostA:~$ ssh 用户B@主机B -fTN -R 3389:192.168.100.115:3389
192.168.100.115
位于 局域网中任何 Windows 计算机的 IP 地址在哪里HostA
,我们将其称为HostC
。选项-fTN
将把 ssh 连接推入后台,您将只拥有从HostB:3389
到HostA
的隧道HostC:3389
。
我将其与 结合使用autossh
以保持连接处于活动状态。例如,我的 中有下一行crontab
:
@reboot sleep 15 && autossh remote-server-with-public-ip -fTN
哪里remote-server-with-public-ip
是主持人~/.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
上的端口2223
、6900
、3389
不是HostB
公开的,我只能通过另一个 SSH 连接访问它们 - 例如从HostD
Internet 上的某个地方。但要访问,8080
我使用开启反向代理的 Apache HostB
:-),虚拟主机的配置文件如下所示:
<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>
- Apache 的模块
proxy
和proxy_http
是必需的。
进一步阅读: