假设我已通过 SSH 连接到远程计算机。我需要从这台远程计算机上的程序执行本地计算机(连接发起者)上的命令。
这就引出了一个问题:是否可以利用两台计算机之间的现有连接在本地计算机上运行命令?
我考虑过在远程计算机上运行命令ssh user@host-of-connecting-party <command>
来建立反向连接。但这很难自动化,需要用户干预。我希望可以完全自动化,或者至少检测连接用户的用户/主机名。
答案1
@62mkv 的答案是一个更好的解决方案。使用它。
不过,为了完整性和好奇心,如果你在本地机器上运行着 ssh 服务器,你可以创建一个 ssh 隧道,以允许从远程主机的端口 20202 到本地主机的端口 22 建立 ssh 连接。示例命令:
ssh -R20202:localhost:22 [email protected]
这将启动 ssh 连接,但也会设置一条隧道返回到您机器上运行的 ssh 服务器。然后,您可以在 ssh 进入远程主机时执行以下操作:
ssh -p 20202 localuser@localhost
当然,这很快就会让人感到困惑 - 尤其是当该技术嵌套多次时。它还增加了一点延迟 - 因为您在本地机器上执行的所有内容都会通过远程主机反弹。
如果您的好奇心还没有得到满足,可以参考以下回答,了解有关 ssh 隧道的更多信息:这个 unix stackexchange 问题。
答案2
我有时也有类似的需求,只要我通过 Putty 连接到我们的 VPN 服务器,然后从那里通过 ssh 连接到其他主机,但由于 VPN 设置,我无法直接访问该主机。
有时我只需要快速检查 VPN 服务器计算机上的某些内容,同时仍保持“ssh 会话”运行。一种方法是在 下运行 ssh 会话,screen
据我所知,与“常规 ssh”相比,这会增加一些延迟。我想在这里分享的另一种方法是:
在 SSH 会话中,按Enter,然后~,(确保它未显示,即您处于命令模式),然后Ctrl- Z。这会将 ssh 客户端进程置于“主机”的后台,您将看到类似以下内容:
[root@client170 ~]# ~^Z [suspend ssh]
[1]+ Stopped ssh [email protected]
[root@vps291736 ~]#
现在您在“主机”上,可以做任何您想做的事情(虽然我不确定 ssh 会话将保持多长时间),然后通过运行返回 SSH 会话fg
。
至少,当我通过基于 CentOS 的 VM 上的 Putty 从 Win10 工作站连接,并从该 VM 通过 SSH 连接到其他主机时,这对我来说是有效的。
希望它能帮助到别人!
答案3
如果您的本地和远程计算机都可以从 Internet 访问,那么您只需在远程计算机上从本地计算机打开一个 SSH 会话,然后在该会话中在本地计算机上从远程计算机打开另一个 ssh 会话:
localuser@local> ssh remoteuser@remote
Password:
remoteuser@remote> hostname
remote
remoteuser@remote> ssh localuser@local
Password:
localuser@local> hostname
local
localuser@local> exit
remoteuser@remote> exit
localuser@local>
对于自动化的东西,看看织物(需要 Python 知识)
from fabric.api import *
@hosts('host1')
def clean_and_upload():
local('find assets/ -name "*.DS_Store" -exec rm '{}' \;')
local('tar czf /tmp/assets.tgz assets/')
put('/tmp/assets.tgz', '/tmp/assets.tgz')
with cd('/var/www/myapp/'):
run('tar xzf /tmp/assets.tgz')
答案4
不,您不能闯入现有会话。
您的应用程序需要一种方法来重新连接到客户端。如果客户端正在运行 SSH 服务器,并且服务器可以访问客户端上的端口 22,则 SSH 可以正常工作。如果您使用基于密钥的身份验证而不是密码身份验证,那么自动化并不难 - 这样就不需要用户干预。
关于设置基于密钥的身份验证的信息可以在这里找到:http://tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/