在 ssh 隧道和 ssh 连接停留在控制台后在本地执行命令

在 ssh 隧道和 ssh 连接停留在控制台后在本地执行命令

这是问题的延续:ssh 隧道连接后在本地执行命令”

我有类似的东西:

ssh -f -L 555:localhost:555 10.0.0.1 sleep 10
vncviewer

但是,在这种情况下,ssh 连接会进入后台,我无法在远程机器上运行任何命令。

所以,我的问题是,我如何才能留在 ssh 控制台中并运行 vncviewer? 在我的例子中是 TigerVNC。

答案1

如果您确实需要先建立隧道,vncviewer稍后运行,然后才进入远程控制台,那么这是基本脚本:

#!/bin/sh

tmpd="$(mktemp -d)" || exit 1         # temporary directory creation
srvr=10.0.0.1                         # remote server
sckt="$tmpd"/"$$-${srvr}".socket      # control socket for SSH connection sharing

clean() { rm -rf "$tmpd"; }           # cleaning function, removes the temporary directory

                                      # establishing SSH master connection
ssh -o ControlMaster=yes \
    -o ControlPath="$sckt" \
    -o ExitOnForwardFailure=yes \
    -Nf -L 555:localhost:555 "$srvr" || { clean; exit 2; }

                                      # the tunnel is now established
vncviewer >/dev/null 2>&1 &           # silent custom command in the background
ssh -o ControlPath="$sckt" "$srvr"    # reusing the master connection
                                      # (exit the remote shell to continue)
wait $!                               # waiting for vncviewer to terminate
ssh -o ControlPath="$sckt" \
    -O exit "$srvr"                   # terminating the master connection
clean || exit 4                       # removing the temporary directory

在连接到 Debian 服务器的 Kubuntu 客户端上进行了测试。我不确定它有多强大。将其视为概念验证。请参阅man 1 sshman 5 ssh_config了解详细信息。

相关内容