Выполнение команды локально после туннелирования 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
Протестировано на клиенте Kubuntu, подключающемся к серверу Debian. Я не уверен, насколько он крепок. Считайте это доказательством концепции. Увидеть man 1 ssh
а также man 5 ssh_config
для деталей.