Выполнение команды локально после туннелирования ssh и подключения ssh в консоли

380
Ne Nenne

Это продолжение вопроса: выполнение команды локально после туннелирования ssh " .

У меня есть что-то вроде этого:

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

Тем не менее, в таком случае ssh-соединение переходит в фоновый режим, и я не могу запускать какие-либо команды на удаленной машине.

Итак, мой вопрос: как мне остаться в консоли ssh и запустить vncviewer? В моем случае это TigerVNC.

0
Есть ли причина, по которой вы не можете запустить `vncviewer` до` ssh` (например, в фоновом режиме)? Может быть, вам нужен туннель, который будет установлен первым. Я правильно угадал? Kamil Maciorowski 5 лет назад 0
Да, точно. Для «vncviewer» у меня есть скрипт, который принимает данные из командной строки, например «./myserverssh vnc». Если там есть ключевое слово "vnc", то я хочу, чтобы ssh console и vnc были запущены. Если моя команда только "./myserverssh", то я хочу, чтобы запускалась только ssh console. Очевидно, что это может сработать, если я сначала запустлю vnc, но если соединение не установлено, мне придется вручную закрыть vncviewer. Это не имеет большого значения, но я бы предпочел выяснить, есть ли способ сделать это правильно. Ne Nenne 5 лет назад 0

1 ответ на вопрос

1
Kamil Maciorowski

Если вам действительно нужно сначала установить туннель, а vncviewerзатем запустить его, а затем только потом добраться до удаленной консоли, это основной сценарий:

#!/bin/sh  tmpd="$(mktemp -d)" || exit 1 # temporary directory creation srvr=10.0.0.1 # remote server sckt="$tmpd"/"$$-$".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для деталей.

Замечательно. Работает без нареканий. Большое спасибо. Ne Nenne 5 лет назад 0

Похожие вопросы