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

如何从 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 中。

答案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到 的连接,并将上的端口绑定到上的环回接口上的端口。这意味着当您请求HostB2222HostB22HostA某物端口上2222的请求将由监听端口上HostB的服务处理,通常是 SSH 服务器。此时,您可以使用以下一些命令从 重新连接:22HostAHostBHostA

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:3389HostA的隧道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

上的端口222369003389不是HostB公开的,我只能通过另一个 SSH 连接访问它们 - 例如从HostDInternet 上的某个地方。但要访问,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 的模块proxyproxy_http是必需的。

进一步阅读:

相关内容