Wyszukiwanie w witrynie

5 sposobów na utrzymanie zdalnych sesji i procesów SSH po rozłączeniu


SSH lub Secure Shell w uproszczeniu to sposób, dzięki któremu dana osoba może uzyskać zdalny dostęp do innego użytkownika w innym systemie, ale tylko z wiersza poleceń, tj. w trybie innym niż GUI. Mówiąc bardziej technicznie, kiedy łączymy się z innym użytkownikiem w innym systemie i uruchamiamy polecenia na tym komputerze, w rzeczywistości tworzy to pseudoterminal i dołącza go do powłoki logowania zalogowanego użytkownika.

Kiedy wylogujemy się z sesji lub sesja wygaśnie po dłuższym okresie bezczynności, do pseudoterminalu wysyłany jest sygnał SIGHUP i wszystkie zadania, które zostały uruchomione na tym terminalu, nawet zadania, których zadania nadrzędne są inicjowane na pseudoterminale, również otrzymują sygnał SIGHUP i są zmuszane do zakończenia.

Nie przegap: 5 przydatnych praktyk zapewniających bezpieczeństwo i ochronę serwera SSH

Tylko zadania skonfigurowane tak, aby ignorowały ten sygnał, przetrwają zakończenie sesji. W systemach Linux możemy mieć wiele sposobów na uruchomienie tych zadań na zdalnym serwerze lub dowolnej maszynie, nawet po wylogowaniu użytkownika i zakończeniu sesji.

Zrozumienie procesów w systemie Linux

Normalny proces

Normalne procesy to te, które mają czas życia sesji. Są uruchamiane podczas sesji jako procesy pierwszoplanowe i kończą się w określonym przedziale czasu lub w momencie wylogowania się z sesji. Procesy te mają swojego właściciela jako dowolny ważny użytkownik systemu, łącznie z rootem.

Proces sierocy

Procesy osierocone to te, które początkowo miały rodzica, który utworzył proces, ale po pewnym czasie proces nadrzędny w niezamierzony sposób umarł lub uległ awarii, przez co init stał się rodzicem tego procesu. Takie procesy mają init jako swojego bezpośredniego rodzica, który czeka na te procesy, aż umrą lub zakończą się.

Proces demona

Są to niektóre celowo osierocone procesy. Takie procesy, które celowo pozostawiono uruchomione w systemie, nazywane są demonami lub celowo osieroconymi procesami. Są to zazwyczaj długotrwałe procesy, które są raz inicjowane, a następnie odłączane od dowolnego terminala sterującego, dzięki czemu mogą działać w tle, dopóki nie zostaną ukończone lub nie wygenerują błędu. Rodzic takich procesów celowo umiera, powodując wykonanie dziecka w tle.

Techniki utrzymywania sesji SSH po rozłączeniu

Istnieją różne sposoby pozostawienia sesji ssh działających po rozłączeniu, jak opisano poniżej:

1. Używanie poleceń ekranowych do utrzymywania sesji SSH

screen to tekstowy menedżer okien dla systemu Linux, który pozwala użytkownikowi zarządzać wieloma sesjami terminala w tym samym czasie, przełączać się między sesjami, rejestrować sesje uruchomione na ekranie, a nawet wznawiać sesję w dowolnym momencie bez obawy o wylogowanie z sesji lub zamknięcie terminala.

sesje screen można rozpocząć, a następnie odłączyć od terminala sterującego, pozostawiając je działające w tle, a następnie wznowić je w dowolnym momencie i nawet w dowolnym miejscu. Wystarczy rozpocząć sesję na ekranie i kiedy chcesz, odłączyć ją od pseudoterminala (lub terminala sterującego) i wylogować się. Kiedy poczujesz, możesz zalogować się ponownie i wznowić sesję.

Rozpoczynanie sesji ekranowej

Po wpisaniu polecenia 'screen' znajdziesz się w nowej sesji ekranowej, w ramach tej sesji możesz tworzyć nowe okna, przechodzić między oknami, blokować ekran i wykonywać wiele innych rzeczy, które możesz zrobić na normalny terminal.

screen

Po rozpoczęciu sesji ekranowej możesz uruchomić dowolne polecenie i kontynuować sesję, odłączając ją.

Odłączanie ekranu

Właśnie wtedy, gdy chcesz wylogować się z sesji zdalnej, ale chcesz utrzymać sesję utworzoną na tym komputerze przy życiu, wystarczy odłączyć ekran od terminala, tak aby nie pozostał na nim terminal sterujący. Po wykonaniu tej czynności możesz bezpiecznie się wylogować.

Aby odłączyć ekran od zdalnego terminala, po prostu naciśnij „Ctrl+a ”, a następnie „d ”, a wrócisz do terminala i zobaczysz komunikat, że ekran jest odłączony. Teraz możesz bezpiecznie się wylogować, a Twoja sesja pozostanie aktywna.

Wznawianie sesji odłączonego ekranu

Jeśli chcesz wznowić sesję odłączonego ekranu, którą opuściłeś przed wylogowaniem, po prostu zaloguj się ponownie do zdalnego terminala i wpisz „screen -r ” w przypadku, gdy otwarty jest tylko jeden ekran lub jeśli jest ich wiele sesje screen są otwierane, uruchom polecenie „screen -r .

screen -r
screen -r <pid.tty.host>

Aby dowiedzieć się więcej o poleceniu ekranowym i sposobie jego używania, kliknij link: Użyj polecenia ekranowego do zarządzania sesjami terminali Linux

2. Używanie Tmux (multipleksera terminali) do utrzymywania sesji SSH

Tmux to kolejne oprogramowanie, które ma zastąpić ekran. Posiada większość możliwości ekranu, z kilkoma dodatkowymi możliwościami, które czynią go potężniejszym od ekranu.

Umożliwia, poza wszystkimi opcjami oferowanymi przez screen, dzielenie paneli w poziomie lub w pionie pomiędzy wiele okien, zmianę rozmiaru paneli okien, monitorowanie aktywności sesji, pisanie skryptów w trybie wiersza poleceń itp. Dzięki tym funkcjom tmux cieszy się szerokim przyjęciem przez prawie wszystkich dystrybucjach Uniksa i nawet on został włączony do podstawowego systemu OpenBSD.

Rozpocznij sesję Tmux

Po wykonaniu polecenia ssh na zdalnym hoście i wpisaniu tmux, rozpoczniesz nową sesję, a przed tobą otworzy się nowe okno, w którym możesz zrobić wszystko, co na normalnym terminalu.

tmux

Po wykonaniu operacji na terminalu możesz odłączyć tę sesję od terminala sterującego, aby przeszła ona w tło i można było bezpiecznie się wylogować.

Odłącz sesję Tmux od terminala

Możesz uruchomić „tmux detach ” podczas uruchamiania sesji tmux lub możesz użyć skrótu (Ctrl+b, a następnie d). Po tym Twoja bieżąca sesja zostanie odłączona i wrócisz do terminala, skąd możesz się bezpiecznie wylogować.

tmux detach

Wznawianie zamkniętej sesji Tmux

Aby ponownie otworzyć sesję, którą odłączyłeś i pozostawiłeś tak, jak po wylogowaniu się z systemu, po prostu zaloguj się ponownie na zdalny komputer i wpisz „tmux dołącz”, aby ponownie dołączyć do zamkniętej sesji, a ona nadal tam będzie i będzie działał.

tmux attach

Aby dowiedzieć się więcej o tmux i jak z niego korzystać, kliknij link: Użyj multipleksera terminali Tmux do zarządzania wieloma terminalami Linux.

3. Używanie polecenia Nohup do kontynuowania sesji SSH

Jeśli nie jesteś zaznajomiony z screen lub tmux, możesz użyć nohup i wysłać swoje długotrwałe polecenie do tła, abyś mógł kontynuować polecenie będzie nadal wykonywane w tle. Następnie możesz bezpiecznie się wylogować.

Za pomocą polecenia Nohup mówimy procesowi, aby ignorował sygnał SIGHUP wysyłany przez sesję ssh po zakończeniu, dzięki czemu polecenie będzie obowiązywać nawet po wylogowaniu z sesji. Po wylogowaniu z sesji polecenie zostaje odłączone od terminala sterującego i nadal działa w tle jako proces demona.

Wykonywanie polecenia przy użyciu Nohup w tle

Oto prosty scenariusz, w którym uruchomiliśmy polecenie find, aby wyszukać pliki w tle w sesji ssh przy użyciu Nohup, po czym zadanie zostało wysłane do tła z natychmiastowym powrotem i podaniem PID i zadania ID procesu ([JOBID] PID).

nohup find / -type f $gt; files_in_system.out 2>1 &

Wznawianie sesji w celu sprawdzenia, czy zadanie jest nadal uruchomione

Po ponownym zalogowaniu możesz sprawdzić status polecenia, przywrócić je na pierwszy plan za pomocą 'fg %JOBID', aby monitorować jego postęp i tak dalej. Poniżej dane wyjściowe pokazują, że zadanie zostało ukończone, ponieważ nie jest widoczne przy ponownym logowaniu, i dały wyświetlony wynik.

fg %JOBID

4. Używanie polecenia disown do utrzymywania działających sesji SSH

Innym eleganckim sposobem, aby polecenie lub pojedyncze zadanie działało w tle i pozostawało aktywne nawet po wylogowaniu lub rozłączeniu sesji, jest użycie disown.

Disown, usuwa zadanie z listy zadań procesowych systemu, dzięki czemu proces jest chroniony przed śmiercią podczas rozłączania sesji, ponieważ nie otrzyma SIGHUP od powłoki, gdy wylogujesz się.

Wadą tej metody jest to, że powinna być używana tylko do zadań, które nie wymagają żadnych danych wejściowych z stdin i nie muszą zapisywać na stdout, chyba że specjalnie przekierujesz zadań wejściowych i wyjściowych, ponieważ gdy zadanie będzie próbowało wejść w interakcję z stdin lub stdout, zatrzyma się.

Wykonywanie polecenia przy użyciu disown w tle

Poniżej wysłaliśmy polecenie ping do tła, dzięki czemu ut będzie nadal działać i zostanie usunięty z listy zadań. Jak widać, zadanie zostało najpierw zawieszone, po czym nadal znajdowało się na liście zadań jako ID procesu: 15368.

ping linux-console.net > pingout &
jobs -l
disown -h %1
ps -ef | grep ping

Następnie sygnał wyparcia został przekazany do zadania i zostało ono usunięte z listy zadań, chociaż nadal działało w tle. Zadanie będzie nadal działać po ponownym zalogowaniu się na zdalny serwer, jak pokazano poniżej.

ps -ef | grep ping

5. Użycie polecenia setsid do uruchomienia sesji SSH

Innym narzędziem umożliwiającym osiągnięcie wymaganego zachowania jest setsid. Nohup ma tę wadę, że grupa procesów procesu pozostaje taka sama, więc proces działający z Nohup jest podatny na każdy sygnał wysyłany do całej grupy procesów (np. Ctrl + C).

Z drugiej strony setsid przydziela nową grupę procesów do wykonywanego procesu, w związku z czym utworzony proces znajduje się całkowicie w nowo przydzielonej grupie procesów i może być bezpiecznie wykonywany bez obawy, że zostanie zabity nawet po wylogowaniu z sesji.

Wykonaj dowolne polecenie za pomocą setsid

Tutaj widać, że proces „sleep 10m” został odłączony od terminala sterującego od chwili jego utworzenia.

setsid sleep 10m
ps -ef | grep sleep

Teraz, gdy ponownie zalogujesz się do sesji, proces ten będzie nadal uruchomiony.

ps -ef | grep [s]leep

Wniosek

Jakie sposoby możesz wymyślić, aby utrzymać działanie procesu nawet po wylogowaniu się z sesji SSH? Jeśli istnieje inny i skuteczny sposób, jaki możesz wymyślić, wspomnij o tym w swoich komentarzach.