我已经在两台机器之间建立了 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 命令)路由到targethost
shell 实例。
3. 通过隧道发送脚本
local$ cat yourscript.sh | nc localhost 22000
这会将脚本的主体发送到您的 ssh 隧道,并最终在targethost
.您将通过 ssh 会话在终端中看到脚本的输出。
我还要指出的是,在这种情况下,ssh 隧道(步骤 1)并不是严格必需的;您也可以打开服务器并直接通过互联网连接到它。但是,如果无法直接到达目标主机(例如位于 NAT 之后),或者需要 ssh 加密,则需要使用隧道。
答案3
花了一段时间才让它发挥作用,请参阅这里以获得完整的示例和解释。
简而言之,您需要:
创建一个 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'
启动主会话
$master_ssh -MNf $remote
进行 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/
关闭主会话
$master_ssh -O exit $remote