从连接的远程SSH主机在本地计算机上执行命令?


13

假设我已通过SSH连接到远程计算机。从此远程计算机上的程序中,我需要在本地计算机(连接启动器)上执行命令。

这就提出了一个问题:是否有可能在两台计算机之间建立现有连接以在本地计算机上运行命令?

我考虑过ssh user@host-of-connecting-party <command>在远程计算机上运行命令以建立反向连接。但这很难实现自动化,并且需要用户干预。我希望我可以完全自动化它,或者至少检测连接用户的用户名/主机名。


很明显,您想做什么。我不清楚您说“我希望我能完全自动化它,或者至少检测到所连接用户的用户/主机名”的部分。你什么意思?
hytromo

在这种情况下,“难以自动化,将需要用户干预”等同于“安全”。如果远程主机能够在与其连接的客户端上运行命令,那将是非常不安全的...想象一下服务器受到了威胁,而连接到该主机的任何人都只是感染了本地计算机...那会很有趣:)
谢尔盖(Sergey)2012年

Answers:


5

有时候,我也有类似的需求,只要我通过Putty连接到我们的VPN服务器,然后再通过ssh从那里连接到其他主机,由于VPN设置,这对我来说是直接无法达到的。

有时,我只需要在VPN服务器计算机上快速检查某些内容,同时仍在运行“ ssh-session”。一种方法是在之下运行ssh会话screen,正如我所注意到的,与“常规ssh”相比,这会增加一些延迟。我想在这里分享的另一种方法是:

在SSH会话下,按Enter,然后按,~(确保未显示,即您处于命令模式),然后按Ctrl- Z。这会将ssh客户端进程置于后台的“主机”上,您将遵循以下步骤:

[root@client170 ~]# ~^Z [suspend ssh]

[1]+  Stopped                 ssh root@10.0.0.167
[root@vps291736 ~]#

现在,您位于“主机”上,可以做任何您想做的事(尽管我不确定ssh会话将保持多长时间),然后通过运行返回到SSH会话fg

至少,当我从Win10工作站通过基于CentOS的VM上的Putty从Win10工作站连接,并从该VM通过SSH连接到其他主机时,这对我来说是有效的。

希望它能对某人有所帮助!


2
如果你PermitLocalCommand yes在你.ssh/config的主机,你也可以做<Enter>~C,然后!<command>
muru

5

@ 62mkv的答案是一个更好的解决方案。用那个

但是出于完整性和好奇心,如果本地计算机上运行着ssh服务器,则可以创建ssh隧道,以允许从端口20202上的远程主机到端口22上的本地主机的ssh连接。

ssh -R20202:localhost:22 remoteuser@remotehost.com

这将启动ssh连接,但还会建立一条返回到计算机上运行的ssh服务器的隧道。然后,当您将其放入远程主机时,您可以执行以下操作:

ssh -p 20202 localuser@localhost

当然,这会很快变得令人困惑-特别是如果该技术嵌套了不止一次。它还增加了一点延迟-因为您在本地计算机上执行的所有操作都会通过远程主机退回。

对于这个尚未满足好奇心的人们,有关ssh隧道的其他信息可以在此unix stackexchange问​​题的答案中找到。


这是一个很好的答案。正是我需要能够对位于防火墙后面且只能通过teamniewer进行访问的远程计算机执行ssh。我只是简单地通过teamviewer连接,然后从teamviewer会话返回到我的计算机,创建了ssh隧道,然后可以根据需要从计算机到远程打开尽可能多的ssh会话。
玛丽安

确实,对于@Marian这样的隧道,这是一个更好的用例。我自己做。
starbeamrainbowlabs

0

如果可以通过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>

对于自动化的东西,请看一下Fabric(需要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')

0

您可以使用sshpass连接到远程计算机并运行命令。

./sshpass -p "password" ssh user@remoteIP 'bash -s < EOI "Your Commands go here" EOI'

要在远程计算机上运行命令,请在本地计算机上使用简单的Shell脚本,并使用上面的代码。这是我通常在自动化中使用的方式之一。


0

不,您不能进入现有会话。

您的应用程序将需要一种连接回客户端的方法。如果客户端运行的是SSH服务器,并且服务器可以访问客户端上的端口22,则SSH可以工作。如果您使用基于密钥的身份验证而不是密码身份验证,将不难实现自动化-这样就无需用户干预。

有关设置基于密钥的身份验证的信息,可以在以下位置找到:http : //tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/


0

如果您可以访问另一个终端,则可以使用“ kill -19 PID”将SIGSTOP发送给发起连接的ssh命令。然后,您将在客户端计算机的终端上获得终端的控制权。完成后,您只需键入fg即可唤醒ssh客户端,即可恢复ssh连接。

但是,当然,这里的问题是:如果客户端计算机上已经有一个终端,为什么要这样做:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.