Как остановить / убить autossh туннель?

16

Теперь, когда у меня есть туннель autossh, как правильно его остановить?

Кажется, нет простого способа сделать это. Документация по этой части неясна.

Кажется, простой способ перезагрузить машину? Это верно?

onknows
источник

Ответы:

20

Нет, правильный способ убить autossh- это просто убить процесс autossh, больше ничего.

Причина в

# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable

это autosshпросто сценарий оболочки, а не сервис . Он запускает новую программу в самой последней строке,

exec /usr/lib/autossh/autossh "$@"

опять не сервис. Что касается exec(вы можете дважды проверить это в вики хакеров Bash ), это встроенная команда оболочки, которая заменяет текущую оболочку следующей командой ( /usr/lib/autossh/autossh "$@"в данном случае) без запуска нового процесса. Таким образом, единственный способ остановить autosshэто уничтожить вызывающий скрипт, например

pkill -3 autossh

(спасибо dviljoen за указание на важность использования флага -3 , см. ниже). Между прочим, уничтожение sshсоединения не будет работать, потому что вызывающая команда ( то есть та, что указана выше) просто запустит новое соединение, как только обнаружит, что старое соединение было сброшено.

MariusMatutiae
источник
1
На самом деле вы должны убить autossh без -9. Если через туннель уже было установлено соединение, он будет порождать дочерний процесс sshd для его обработки. Уничтожение родительского autossh с -9 оставит процесс sshd позади. Туннель будет работать до тех пор, пока не истечет время ожидания процесса sshd. Если вы используете сигнал по умолчанию (-3) для kill, он будет корректно завершен и возьмет с собой порожденный процесс sshd.
dviljoen
Привет, так как -3 является сигналом уничтожения по умолчанию, вам не нужно явно передавать -3, вы можете его опустить
Andrés Alcarraz
@ AndrésAlcarraz Вы действительно уверены в этом? SIGTERMпо умолчанию, и это один 15. SIGQUITэто 3, см superuser.com/questions/352147/what-does-kill-3-mean и en.wikipedia.org/wiki/Kill_(command) - Кроме того , FWIW, я только что проверил и -15не закрыть его, поэтому SIGTERMне может быть использован.
Даниэль Ф
И использование pkillбез сигнала (= default) также не прекращается autossh.
Даниэль Ф
@DanielF Вы правы, я был смущен "сигналом по умолчанию (-3)" из комментария dvijoen
Andrés Alcarraz
4

Поиск процесса:

PS Aux | grep ssh

Второй столбец - это PIDnumber

Убить процесс с помощью PID :)

убить -9 PIDnumber

Используйте sudo, если у вас нет привилегий root.

NIZ
источник
4

запустить авто SSH с:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

убить его с помощью:

kill pid

КСТАТИ

pkill -9 autossh это неправильно

-9гарантирует, что процесс не завершится корректно, поэтому sshпроцесс все еще там, когда autosshпроцесс завершен

без -9все равно плохо, если у вас работает несколько туннелей, pkillубьет их всех

правильный путь - установить AUTOSSH_PIDFILEenv var, тогда killтолько pid

Erik
источник
Добро пожаловать в Супер пользователя. Похоже, ваш последний абзац является вашим реальным ответом, а остальная часть вашего вопроса - комментарий к другому ответу . Учитывая характер вопросов и ответов на этом сайте, было бы полезно добавить достаточно подробностей к вашему ответу, чтобы он мог стоять сам по себе. Спасибо за помощь и не забудьте проверить тур .
Twisty Impersonator
1

Я знаю, что на это ответили, но вопреки комментариям выше, использование pkill -3 autosshНЕ убивает дочерние процессы sshd для меня.

Я использую эту функцию в моем .bashrcфайле.
По сути, это все равно, что добавить --killаргумент к autossh.

  if [ "$1" = "--kill" ]; then
    ps aux | 
    grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
    awk '{print $2}' |
    xargs -r kill
  else
    $(which autossh) "$@"
    echo "" # prevents line wrapping when you kill the ssh process
  fi

Вы можете запустить which sshи which autosshпроверить пути в вашей системе.

Пока первый аргумент не так --kill, он просто передает аргументы autossh.

Этот скрипт убивает экземпляры autossh & ssh. Это важно, если вы используете переадресацию портов, потому что, убивая ТОЛЬКО экземпляр autossh, не убивает туннель, он просто предотвращает его повторное подключение, если / когда он, наконец, отключается.

Вы также можете указать условие поиска (имя хоста), чтобы убить только определенные туннели.

autossh --kill dbserver1убивает только соединения с dbserver1
autossh --kill dbserver, убивает dbserver1, dbserver2 и т. д.
autossh --kill dbserverубивает ВСЕ соединения autossh

Для пояснения, он ДОЛЖЕН уничтожать только сеансы SSH, запущенные autossh.

Если вы запустите ps aux | grep sshсеанс autossh и ssh, то вы увидите, что те, которые запущены autossh, используют полный путь (/ usr / bin / ssh и / usr / lib / autossh / autossh).
Этот сценарий сопоставляет результаты только с процессами, запущенными с указанным путем. Я сделал это, потому что я (и я полагаю, что большинство людей) обычно печатает, sshа не полный путь, что удерживает его от уничтожения моих обычных сессий ssh.

Надеюсь, что это поможет другим.

KeithMcFly
источник
какая-то конкретная причина $(which autossh)вместо просто autossh?
МестреЛион