Як зупинити / вбити тунель з автоматичним вмиканням?


17

Тепер, коли у мене є тунель для автоматичного очищення, який правильний спосіб зупинити його?

Здається, немає простого способу зробити це. Документація в цій частині незрозуміла.

Найпростіший спосіб, здається, перезавантажити машину? Це правильно?

Відповіді:


21

Ні, правильний спосіб вбити 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з'єднання не вийде, тому що команда виклику ( тобто , зазначена вище) просто запустить нове з'єднання, як тільки зрозуміє, що старий був скинутий.


1
Насправді вам слід вбити автосш без без -9. Якщо з'єднання вже здійснено через тунель, він створив дочірній sshd-процес для його обробки. Вбивство батьківського autossh з -9 залишить процес sshd позаду. Тунель буде працювати до тих пір, поки не закінчиться процес sshd. Якщо ви використовуєте сигнал за замовчуванням (-3) для вбивства, він витончено вимкнеться та запустить з ним породжений sshd процес.
dviljoen

привіт, оскільки -3 є сигналом вбивства за замовчуванням, насправді не потрібно явно пропускати -3, можна пропустити його
Андрес Алькарас

@ 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без сигналу (= the default) також не припиняється autossh.
Даніель Ф

@DanielF Ви маєте рацію, я збентежився y "сигнал за замовчуванням (-3)" від коментаря dvijoen
Andrés Alcarraz

5

запустити автоматичний ssh ​​за допомогою:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

вбити його:

kill pid

До речі

pkill -9 autossh є неправильним

-9гарантує, що процес не виходить вишукано, тому sshпроцес все ще є, коли autosshпроцес загине

без -9цього все-таки погано, якщо у вас запущено кілька тунелів, pkillвирвете їх усіх

правильний спосіб - встановити AUTOSSH_PIDFILEenv var, а потім killлише цей pid


Ласкаво просимо до Супер Користувача. Здається, ваш остаточний абзац - ваша фактична відповідь, а решта вашого запитання - коментар до іншої відповіді . Враховуючи характер питань та відповідей цього веб-сайту, було б корисно додати достатньо деталей до вашої відповіді, щоб він міг стояти самостійно. Дякуємо за ваш внесок і не забудьте перевірити тур .
Я кажу, що відновіть Моніку

4

Пошук процесу:

ps aux | grep ssh

Стовпець стовпця - це номер PID

Процес вбивства PID :)

вбити -9 PIDкілька

Використовуйте sudo, якщо у вас немає привілеїв root.


1

Я знаю, що на це відповіли, але всупереч коментарям вище, використання pkill -3 autosshНЕ вбиває для мене sshd дочірніх процесів.

Я використовую цю функцію у своєму .bashrcфайлі.
В основному, це як додати --killаргумент до автоматичного пошуку.

  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 & ssh. Це важливо, якщо ви використовуєте переадресацію портів, оскільки, вбиваючи ТОЛЬКО екземпляр autossh, не вбивається тунель, він просто запобігає його повторному підключенню, якщо / коли він остаточно відключиться.

Ви також можете вказати пошуковий термін (ім'я хоста), щоб знищити лише певні тунелі.

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

Для уточнення потрібно Вбивати тільки сеанси SSH, розпочаті автошш.

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

Сподіваюся, що це допоможе іншим.


якась конкретна причина, $(which autossh)а не просто autossh?
MestreLion
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.