При всем уважении к пользователям pgrep
, pkill
, ps | awk
и т. Д., Существует намного лучший способ.
Учтите, что если вы используете ps -aux | grep ...
для поиска процесса, вы рискуете столкнуться. У вас может быть случай использования, когда это маловероятно, но, как правило, это не тот путь.
SSH предоставляет механизм для управления и контроля фоновых процессов. Но, как и многие другие вещи SSH, это «продвинутая» функция, и многие люди (кажется, из других ответов здесь) не знают о ее существовании.
В моем собственном случае использования у меня дома есть рабочая станция, на которой я хочу оставить туннель, который подключается к прокси-серверу HTTP во внутренней сети в моем офисе, и еще один, который дает мне быстрый доступ к интерфейсам управления в офисе. серверы Вот как вы можете создать основные туннели, инициированные из дома:
$ ssh -fNT -L8888:proxyhost:8888 -R22222:localhost:22 officefirewall
$ ssh -fNT -L4431:www1:443 -L4432:www2:443 colocatedserver
Это приводит к тому, что ssh отходит на задний план, оставляя туннели открытыми. Но если туннель пропадает, я застреваю, и если я хочу его найти, мне нужно проанализировать мой список процессов, и у меня есть «правильный» ssh (на случай, если я случайно запустил несколько таких, которые выглядят подобный).
Вместо этого, если я хочу управлять несколькими подключениями, я использую опцию конфигурации ControlMaster
SSH вместе с опцией командной строки -O
для управления. Например, со следующим в моем файле ~/.ssh/config
,
host officefirewall colocatedserver
ControlMaster auto
ControlPath ~/.ssh/cm_sockets/%r@%h:%p
Команды ssh, приведенные выше, при запуске оставят спор в ~/.ssh/cm_sockets/
, который затем может предоставить доступ для управления, например:
$ ssh -O check officefirewall
Master running (pid=23980)
$ ssh -O exit officefirewall
Exit request sent.
$ ssh -O check officefirewall
Control socket connect(/home/ghoti/.ssh/cm_socket/ghoti@192.0.2.5:22): No such file or directory
И на этом этапе туннель (и управляющий сеанс SSH) пропал без необходимости использования молотка (kill
, killall
, pkill
и т. Д.).
Возвращение к вашему сценарию использования ...
Вы устанавливаете туннель, через который вы хотите, чтобы syngergyc
говорил с syngergys
через TCP-порт 12345. Для этого я бы сделал что-то вроде следующего.
Добавить запись в ваш ~/.ssh/config
файл:
Host otherHosttunnel
HostName otherHost
User otherUser
LocalForward 12345 otherHost:12345
RequestTTY no
ExitOnForwardFailure yes
ControlMaster auto
ControlPath ~/.ssh/cm_sockets/%r@%h:%p
Обратите внимание, что параметр командной строки -L
обрабатывается с помощью ключевого слова LocalForward
, а строки Control {Master, Path} включены, чтобы обеспечить контроль после создания туннеля.
Затем вы можете изменить свой bash-скрипт на что-то вроде этого:
#!/bin/bash
if ! ssh -f -N otherHosttunnel; then
echo "ERROR: couldn't start tunnel." >&2
exit 1
else
synergyc localhost
ssh -O exit otherHosttunnel
fi
Опция -f
скрывает туннель, оставляя сокет на ControlPath, чтобы позже закрыть туннель. Если происходит сбой ssh (что может произойти из-за сетевой ошибки или ExitOnForwardFailure
), нет необходимости выходить из туннеля, но если он не вышел из строя (else
), запускается synergyc, а затем туннель закрывается после него. выходы.
Возможно, вы захотите узнать, можно ли использовать опцию SSH LocalCommand
для запуска synergyc
прямо из вашего файла конфигурации ssh.