使用已经建立的SSH频道


50

我已经在两台机器之间建立了ssh连接。

有没有办法使用已经打开的连接,从本地计算机上运行的Shell脚本向远程计算机发送命令,而无需启动另一个ssh会话?

Answers:


56

如果您提前计划,那么使用足够新版本的OpenSSH非常简单。

第一次打开主连接。对于后续连接,请通过现有的主连接路由从属连接。在您的中~/.ssh/config,将连接共享设置为自动进行:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

如果启动与现有连接相同的ssh会话(用户,端口,计算机),则第二个会话将在第一个会话上建立隧道。建立第二个连接不需要新的身份验证,并且速度非常快。


看起来第二个将不会在/ var / log / secure或/var/log/auth.log中注册。但是,第二个将在/ var / log / wtmp中注册吗?
SOUser 2013年

@XichenLi /var/log/secure/var/log/auth.log记录SSH连接;从属连接不会出现在那里,因为它背负在现有连接上。如果您的ssh会话分配了一个终端(即ssh somehost,没有提供任何命令,或ssh -t),则wtmp该终端(通常)已登录,而不管该终端的显示方式如何(sshd使用哪种方法建立连接,终端仿真器应用程序……)。
吉尔斯(Gillles)“所以-别再邪恶了”

2
您还可以使用ControlPersist 600它,这是套接字空闲之前经过几秒钟的延迟,然后套接字才会被自动删除。否则,当主连接结束时,它将自动关闭。这对于远程执行一系列命令(例如,将一系列rsync命令发送到不同的文件夹)没有

2
如果您不想编辑全局配置,也可以使用SSH客户端的选项-S(指定套接字)和-M(创建主连接)。
洋基

22

使用nc工具和ssh隧道很容易实现。

1.打开SSH隧道

在ssh会话中,输入~C新行。您将看到ssh“服务控制台”提示,如下所示:

ssh> 

键入本地转发命令以打开ssh隧道:

ssh> -L22000:targethost:22001
Forwarding port.

targethost您连接到的计算机的主机名或IP地址在哪里。

现在,假设未将目标计算机上的ssh服务器配置为禁止隧道,则您具有所需的连接转发:ssh计算机上的客户端侦听端口22000,它将发送给它的所有流量转发到上的22001端口targethost

2.在远程计算机上启动网络服务器

这就像输入以下命令进入已经打开的ssh会话一样简单:

remote$ nc -l localhost 22001 | sh

这将启动侦听端口22001(这是ssh隧道的目标端口)的TCP服务器,并将接收到的数据(大概是shell命令)路由到targethostshell实例。

3.通过隧道发送脚本

local$ cat yourscript.sh | nc localhost 22000

这会将脚本的主体发送到您的ssh隧道,并最终在的shell中执行targethost。您将在带有ssh会话的终端中看到脚本的输出。


我还将注意到,在这种情况下ssh隧道(第1步)并非严格要求;您也可以打开服务器并直接通过Internet连接到它。但是,如果无法直接访问目标主机(例如,在NAT之后),或者需要ssh加密,则需要使用隧道。


3
好答案。从技术上讲,要进入服务控制台,~字符必须在换行符之后,因此LF ~ C可能是更好的顺序。
Alexios 2012年

@Alexios,正确。
ulidtko 2012年

绝妙的把戏!作为记录,ssh手册页显示了更多有关此信息(向下滚动到“ ESCAPE CHARACTERS”部分)
Carles Sala 2015年

@CarlesSala还很高兴知道less常见的默认寻呼机支持搜索,如果您知道关键字,可以节省一些滚动:只需键入man ssh /ESCAPE就可以了。
ulidtko 2015年

@ulidtko可以肯定,但是据我所知,无法将CLI命令链接到SO注释中,所以我发现html手册页是一个更好的选择;-)
Carles Sala 2015年
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.