使用已经建立的 SSH 通道

SWe*_*eko 57 ssh

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

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

Gil*_*il' 64

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

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

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
Run Code Online (Sandbox Code Playgroud)

如果您将 ssh 会话启动到与现有连接相同的(用户、端口、机器),则第二个会话将通过第一个会话进行隧道传输。建立第二个连接不需要新的身份验证并且非常快。

  • 您还可以使用“ControlPersist 600”,它是套接字在自动删除之前处于空闲状态的延迟秒数。否则它会在主连接结束时自动关闭。这对远程执行一系列命令不利(例如,对不同文件夹执行一系列 rsync 命令) (5认同)
  • 如果不想编辑全局配置,也可以使用SSH客户端的`-S`(指定套接字)和`-M`(创建主连接)选项。 (2认同)

uli*_*tko 25

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

1.打开ssh隧道

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

ssh> 
Run Code Online (Sandbox Code Playgroud)

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

ssh> -L22000:targethost:22001
Forwarding port.
Run Code Online (Sandbox Code Playgroud)

targethost您所连接的机器的主机名或 IP 地址在哪里。

现在,假设目标机器上的 ssh 服务器没有配置为禁止隧道,你有所需的连接转发:ssh你机器上的客户端侦听端口 22000,它会将发送到它的任何流量转发到 22001 端口targethost

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

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

remote$ nc -l localhost 22001 | sh
Run Code Online (Sandbox Code Playgroud)

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

3.通过隧道发送您的脚本

local$ cat yourscript.sh | nc localhost 22000
Run Code Online (Sandbox Code Playgroud)

这会将脚本的正文发送到您的 ssh 隧道,并最终在targethost. 您将使用 ssh 会话在终端中看到脚本的输出。


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

  • 很好的答案。从技术上讲,要进入服务控制台,`~` 字符必须在换行符之后,所以 `LF ~ C` 可能是一个更好的序列。 (3认同)