使用已建立的 SSH 通道

使用已建立的 SSH 通道

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

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

答案1

如果您提前计划,这非常简单。

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

ControlMaster auto
ControlPath ~/.ssh/control:%C

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

如果您还放入ControlPersist 600.ssh/config,则在您停止使用隧道后,隧道将保留 10 分钟(600 秒),这意味着您不需要保持第一个会话运行:只要您不这样做,您就可以进行连续会话暂停10分钟以上。

答案2

使用以下方法很容易实现数控工具和 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

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

3. 通过隧道发送脚本

local$ cat yourscript.sh | nc localhost 22000

这会将脚本的主体发送到您的 ssh 隧道,并最终在targethost.您将通过 ssh 会话在终端中看到脚本的输出。


我还要指出的是,在这种情况下,ssh 隧道(步骤 1)并不是严格必需的;您也可以打开服务器并直接通过互联网连接到它。但是,如果无法直接到达目标主机(例如位于 NAT 之后),或者需要 ssh 加密,则需要使用隧道。

答案3

花了一段时间才让它发挥作用,请参阅这里以获得完整的示例和解释。

简而言之,您需要:

  1. 创建一个 ssh 配置文件来保存有关 ssh 会话的信息

    remote=your_ip_address
    echo "HostName $remote" > ssh_config
    echo "User root" >> ssh_config
    echo "ControlMaster auto" >> ssh_config
    echo "ControlPath ~/.ssh/%C" >> ssh_config
    master_ssh='ssh -F ssh_config'
    
  2. 启动主会话

    $master_ssh -MNf $remote
    
  3. 进行 rsync

    rsync -e "$master_ssh" $opts $remote:/etc/some_file1  local_directory/
    rsync -e "$master_ssh" $opts $remote:/etc/some_file2  local_directory/
    rsync -e "$master_ssh" $opts $remote:/etc/some_file3  local_directory/
    
  4. 关闭主会话

    $master_ssh -O exit $remote
    

相关内容