Jak zatrzymać / zabić autossh tunel?

17

Teraz, gdy mam tunel autossh, jaki jest właściwy sposób, aby go zatrzymać?

Wydaje się, że nie ma łatwego sposobu na zrobienie tego. Dokumentacja w tej części jest niejasna.

Najłatwiejszym sposobem wydaje się ponowne uruchomienie komputera? Czy to jest poprawne?

onknows
źródło

Odpowiedzi:

21

Nie, właściwym sposobem na zabicie autosshjest po prostu zabicie procesu autossh, nic więcej.

Powodem jest

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

że autosshjest to po prostu skrypt, a nie usługi . Zaczyna nowy program, w ostatniej linii,

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

znowu nie jest to usługa. Jeśli chodzi o exec(możesz to dwukrotnie sprawdzić na wiki hakerów Bash ), jest to polecenie wbudowane w powłokę, które zastępuje bieżącą powłokę następującą komendą ( /usr/lib/autossh/autossh "$@"w tym przypadku) bez rozpoczynania nowego procesu. Tak więc jedynym sposobem na zatrzymanie autosshjest na przykład zabicie skryptu wywołującego

pkill -3 autossh

(dzięki dviljoen za zwrócenie uwagi na znaczenie używania flagi -3 , patrz poniżej). Nawiasem mówiąc, zabicie sshpołączenia nie zadziała, ponieważ polecenie wywołujące ( tj. Powyższe) po prostu rozpocznie nowe połączenie, gdy tylko zorientuje się, że stare połączenie zostało porzucone.

MariusMatutiae
źródło
1
Właściwie powinieneś zabić autossh bez -9. Jeśli połączenie zostało już wykonane przez tunel, spowoduje to utworzenie potomnego procesu sshd do obsługi go. Zabicie nadrzędnego autossha za pomocą -9 pozostawi proces sshd w tyle. Tunel będzie działał do momentu przekroczenia limitu czasu procesu sshd. Jeśli użyjesz domyślnego sygnału (-3) przy zabijaniu, z wdziękiem się wyłączy i przejmie odrodzony proces sshd.
dviljoen
cześć, ponieważ -3 jest domyślnym sygnałem zabicia, tak naprawdę nie musisz jawnie przekazywać -3, możesz go pominąć
Andrés Alcarraz
@ AndrésAlcarraz Naprawdę jesteś tego pewien? SIGTERMjest wartością domyślną, a ta jest 15. SIGQUITjest 3, patrz superuser.com/questions/352147/what-does-kill-3-mean i en.wikipedia.org/wiki/Kill_(command) - Ponadto, FWIW, właśnie sprawdziłem i -15nie wyłączam go, więc SIGTERMnie można go użyć.
Daniel F
I używanie pkillbez sygnału (= the default) również nie kończy się autossh.
Daniel F
@DanielF masz rację, pomyliłem się z „domyślnym sygnałem (-3)” z komentarza dvijoen
Andrés Alcarraz
5

uruchom auto ssh z:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

zabij to:

kill pid

BTW

pkill -9 autossh jest źle

-9upewnia się, że proces nie kończy się z wdziękiem, więc sshproces jest nadal obecny, gdy autosshproces zostanie zabity

bez -9jest nadal złe, jeśli masz uruchomionych wiele tuneli, pkillzabije je wszystkie

poprawnym sposobem jest ustawienie AUTOSSH_PIDFILEenv var wtedy killtylko tego pid

Erik
źródło
Witamy w Super User. Wygląda na to, że ostatni akapit jest Twoją rzeczywistą odpowiedzią, a pozostała część pytania to komentarz do innej odpowiedzi . Biorąc pod uwagę charakter pytań i odpowiedzi tej witryny, pomocne byłoby dodanie wystarczającej ilości szczegółów do Twojej odpowiedzi, aby mogła ona sama działać. Dziękujemy za pomoc i nie zapomnij sprawdzić trasy .
Mówię: Przywróć Monikę
4

Wyszukaj proces:

ps aux | grep ssh

Druga kolumna to PIDnumber

Zabij proces przez PID :)

zabij -9 PIDnumber

Użyj sudo, jeśli nie masz uprawnień roota.

NIZ
źródło
1

Wiem, że udzielono odpowiedzi, ale w przeciwieństwie do powyższych komentarzy, użycie pkill -3 autosshNIE zabija dla mnie procesów potomnych sshd.

Korzystam z tej funkcji w moim .bashrcpliku.
Zasadniczo jest to jak dodanie --killargumentu do 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

Możesz uruchomić which sshi which autosshsprawdzić ścieżki w systemie.

Dopóki pierwszy argument nie jest --kill, po prostu przekazuje argumenty do autossh.

Ten skrypt zabija wystąpienia autossh i ssh. Jest to ważne, jeśli używasz przekierowania portów, ponieważ zabicie TYLKO instancji autossh nie zabija tunelu, po prostu uniemożliwia mu ponowne połączenie, jeśli / kiedy w końcu się rozłączy.

Możesz także określić wyszukiwane hasło (nazwę hosta), aby zabić tylko określone tunele.

autossh --kill dbserver1zabija tylko połączenia z dbserver1
autossh --kill dbserverzabije dbserver1, dbserver2 itp.
autossh --kill dbserverzabije WSZYSTKIE połączenia autossh

Aby to wyjaśnić, POWINNO zabić tylko sesje SSH rozpoczęte przez autossh.

Jeśli uruchomisz, ps aux | grep sshgdy masz uruchomione zarówno sesje autossh, jak i ssh, zobaczysz, że te rozpoczęte przez autossh używają pełnej ścieżki (/ usr / bin / ssh i / usr / lib / autossh / autossh).
Ten skrypt dopasowuje tylko wyniki do procesów uruchomionych ze ścieżką speicifc. Zrobiłem to, ponieważ ja (i zakładam, że większość ludzi) zwykle piszę, ssha nie pełną ścieżkę, co uniemożliwia zabicie moich normalnych sesji ssh.

Mam nadzieję, że pomoże to innym.

KeithMcFly
źródło
jakiś konkretny powód $(which autossh)zamiast po prostu autossh?
MestreLion