5 načina za održavanje udaljenih SSH sesija i procesa nakon prekida veze


SSH ili Secure Shell jednostavno rečeno je način na koji osoba može daljinski pristupiti drugom korisniku na drugom sistemu, ali samo u komandnoj liniji, tj. ne-GUI modu. U tehničkim terminima, kada pređemo na drugog korisnika na nekom drugom sistemu i pokrenemo komande na toj mašini, on zapravo kreira pseudo-terminal i prikačuje ga ljusci za prijavu korisnika koji je prijavljen.

Kada se odjavimo iz sesije ili sesija istekne nakon što je bila neaktivna duže vrijeme, signal SIGHUP se šalje pseudoterminalu i svim poslovima koji su pokrenuti na tom terminalu, čak i poslovi koji imaju svoje roditeljske poslove koji se iniciraju na pseudo-terminalu također se šalju SIGHUP signalom i prisiljeni su prekinuti.

Ne propustite: 5 korisnih praksi da SSH server bude siguran i zaštićen

Samo poslovi koji su konfigurirani da ignoriraju ovaj signal su oni koji prežive završetak sesije. Na Linux sistemima možemo imati mnogo načina da ove poslove pokrenemo na udaljenom serveru ili bilo kojoj mašini čak i nakon odjave korisnika i prekida sesije.

Razumjeti procese na Linuxu

Normalni proces

Normalni procesi su oni koji imaju vijek trajanja jedne sesije. Pokreću se tokom sesije kao procesi u prvom planu i završavaju u određenom vremenskom periodu ili kada se sesija odjavi. Ovi procesi imaju svog vlasnika kao bilo koji od važećih korisnika sistema, uključujući root.

Orphan proces

Siroče procesi su oni koji su u početku imali roditelja koji je kreirao proces, ali nakon nekog vremena, roditeljski proces je nenamjerno umro ili se srušio, čime je init postao roditelj tog procesa. Takvi procesi imaju init kao svog neposrednog roditelja koji čeka na te procese dok ne umru ili završe.

Daemon Process

Ovo su neki namjerno napušteni procesi, takvi procesi koji su namjerno ostavljeni da rade na sistemu nazivaju se demonima ili namjerno napuštenim procesima. To su obično dugotrajni procesi koji se jednom pokrenu, a zatim odvoje od bilo kojeg kontrolnog terminala, tako da mogu raditi u pozadini dok se ne dovrše ili dok ne dovedu do greške. Roditelj takvih procesa namjerno umire zbog čega se dijete izvršava u pozadini.

Tehnike za održavanje SSH sesije u toku nakon prekida veze

Mogu postojati različiti načini da ostavite ssh sesije pokrenute nakon prekida veze kao što je opisano u nastavku:

1. Korišćenje naredbe na ekranu za održavanje SSH sesija

screen je tekstualni Window Manager za Linux koji omogućava korisniku da upravlja više terminalskih sesija u isto vrijeme, prebacivanje između sesija, evidentiranje sesije za pokrenute sesije na ekranu, pa čak i nastavak sesije u bilo koje vrijeme po želji bez brige da će se sesija odjaviti ili zatvoriti terminal.

sesije ekrana se mogu pokrenuti i zatim odvojiti od kontrolnog terminala ostavljajući ih da rade u pozadini, a zatim se mogu nastaviti u bilo koje vrijeme, pa čak i na bilo kojem mjestu. Samo trebate započeti svoju sesiju na ekranu i kada želite, odvojite je od pseudoterminala (ili kontrolnog terminala) i odjavite se. Kada osjetite, možete se ponovo prijaviti i nastaviti sesiju.

Pokretanje ekranske sesije

Nakon što unesete naredbu 'screen', bit ćete u novoj sesiji ekrana, unutar ove sesije možete kreirati nove prozore, prelaziti između prozora, zaključavati ekran i raditi još mnogo stvari koje možete raditi na normalan terminal.

screen

Kada se sesija ekrana pokrene, možete pokrenuti bilo koju komandu i održati sesiju u toku tako što ćete odvojiti sesiju.

Odvajanje ekrana

Baš kada se želite odjaviti iz udaljene sesije, ali želite da održavate sesiju koju ste kreirali na toj mašini živom, onda samo ono što treba da uradite je da odvojite ekran od terminala tako da nema više terminala za kontrolu. Nakon što to učinite, možete se bezbedno odjaviti.

Da biste odvojili ekran od udaljenog terminala, samo pritisnite “Ctrl+a ” odmah nakon čega slijedi “d ” i vratit ćete se na terminal i vidjeti poruku da ekran je odvojen. Sada se možete bezbedno odjaviti i vaša sesija će ostati živa.

Nastavak odvojene ekranske sesije

Ako želite da nastavite odvojenu sesiju ekrana koju ste napustili prije odjave, samo se ponovo prijavite na udaljeni terminal i upišite “screen -r ” u slučaju da je otvoren samo jedan ekran i ako više sesije ekrana se otvaraju pokrenite “screen -r .

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

Da biste saznali više o naredbi ekrana i kako je koristiti, samo slijedite vezu: Koristite naredbu ekrana za upravljanje sesijama Linux terminala

2. Korištenje Tmux (Terminal Multiplexer) za održavanje SSH sesija pokrenutim

Tmux je još jedan softver koji je kreiran da bude zamjena za ekran. Ima većinu mogućnosti ekrana, s nekoliko dodatnih mogućnosti koje ga čine moćnijim od ekrana.

Omogućava, pored svih opcija koje nudi ekran, podjelu okna horizontalno ili vertikalno između više prozora, promjenu veličine prozorskih okna, praćenje aktivnosti sesije, skriptiranje pomoću načina komandne linije itd. Zbog ovih karakteristika tmux-a, uživa široku primjenu od skoro sve Unix distribucije, pa čak i on je uključen u osnovni sistem OpenBSD-a.

Započnite Tmux sesiju

Nakon što uradite ssh na udaljenom hostu i otkucate tmux, ući ćete u novu sesiju sa novim prozorom koji se otvara ispred vas, u kojem možete učiniti sve što radite na normalnom terminalu.

tmux

Nakon što izvršite svoje operacije na terminalu, možete odvojiti tu sesiju od kontrolnog terminala tako da pređe u pozadinu i da se možete bezbedno odjaviti.

Odvojite Tmux sesiju od terminala

Ili možete pokrenuti “tmux detach ” prilikom pokretanja tmux sesije ili možete koristiti prečicu (Ctrl+b pa d). Nakon ovoga vaša trenutna sesija će biti odvojena i vratit ćete se na svoj terminal odakle se možete bezbedno odjaviti.

tmux detach

Nastavak zatvorene Tmux sesije

Da ponovo otvorite sesiju koju ste odvojili i ostavili kakva jeste kada ste se odjavili sa sistema, samo se ponovo prijavite na udaljenu mašinu i ukucajte “tmux attach ” da se ponovo povežete sa zatvorenom sesijom i ona i dalje će biti tamo i raditi.

tmux attach

Da biste saznali više o tmuxu i kako ga koristiti, samo slijedite vezu: Koristite Tmux terminalski multiplekser za upravljanje višestrukim Linux terminalima.

3. Korištenje naredbe nohup za nastavak pokretanja SSH sesija

Ako niste toliko upoznati sa screen ili tmux, možete koristiti nohup i poslati svoju dugotrajnu naredbu u pozadinu kako biste mogli nastaviti dok komanda će nastaviti da se izvršava u pozadini. Nakon toga možete se bezbedno odjaviti.

Sa nohup komandom kažemo procesu da ignoriše signal SIGHUP koji se šalje ssh sesijom po završetku, čime naredba traje čak i nakon odjave iz sesije. Prilikom odjave iz sesije komanda se odvaja od kontrolnog terminala i nastavlja da radi u pozadini kao demonski proces.

Izvršavanje naredbe koristeći nohup u pozadini

Evo jednostavnog scenarija u kojem smo pokrenuli naredbu find za traženje datoteka u pozadini na ssh sesiji koristeći nohup, nakon čega je zadatak poslan u pozadinu sa promptom koji se odmah vraća dajući PID i posao ID procesa ([JOBID] PID).

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

Nastavak sesije da vidite da li posao još uvijek radi

Kada se ponovo prijavite, možete provjeriti status komande, vratiti je u prvi plan koristeći 'fg %JOBID' da nadgledate njen napredak i tako dalje. Ispod, izlaz pokazuje da je posao završen jer se ne prikazuje pri ponovnoj prijavi, a dao je izlaz koji je prikazan.

fg %JOBID

4. Korištenje naredbe disown za održavanje SSH sesija aktivnim

Još jedan elegantan način da dozvolite da vaša naredba ili jedan zadatak rade u pozadini i ostanu živi čak i nakon odjave ili prekida veze je korištenje disown.

Disown, uklanja posao sa liste zadataka procesa u sistemu, tako da je proces zaštićen od ubijanja tokom prekida veze sesije jer neće primiti SIGHUP od strane ljuske kada odjavili ste se.

Nedostatak ove metode je u tome što je treba koristiti samo za poslove za koje nije potreban nikakav unos sa stdin i ne treba pisati u stdout, osim ako posebno ne preusmjerite unos i izlaz poslova, jer kada posao pokuša da stupi u interakciju sa stdin ili stdout, on će se zaustaviti.

Izvršavanje naredbe koristeći disown u pozadini

U nastavku smo poslali naredbu ping u pozadinu kako bi ut nastavio raditi i bio uklonjen sa liste poslova. Kao što se vidi, posao je prvo suspendovan, nakon čega je i dalje bio na listi poslova kao ID procesa: 15368.

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

Nakon toga je signal za odustajanje proslijeđen poslu i uklonjen je sa liste poslova, iako je još uvijek radio u pozadini. Posao bi i dalje bio pokrenut kada biste se ponovo prijavili na udaljeni server kao što se vidi ispod.

ps -ef | grep ping

5. Korištenje naredbe setsid za pokretanje SSH sesija

Još jedan uslužni program za postizanje potrebnog ponašanja je setsid. Nohup ima nedostatak u smislu da procesna grupa procesa ostaje ista tako da je proces koji se pokreće s nohup-om ranjiv na bilo koji signal koji se šalje cijeloj procesnoj grupi (poput Ctrl + C).

setsid sa druge strane dodeljuje novu grupu procesa procesu koji se izvršava i stoga je kreirani proces u potpunosti u novo dodeljenoj grupi procesa i može se bezbedno izvršiti bez straha da će biti ubijen čak i nakon odjave iz sesije.

Izvršite bilo koju naredbu koristeći setsid

Ovdje pokazuje da je proces ‘sleep 10m’ odvojen od kontrolnog terminala, od vremena kada je kreiran.

setsid sleep 10m
ps -ef | grep sleep

Sada, kada biste se ponovo prijavili na sesiju, i dalje ćete pronaći da ovaj proces radi.

ps -ef | grep [s]leep

Zaključak

Koje načine možete smisliti da vaš proces nastavi da radi čak i nakon što se odjavite sa SSH sesije? Ako postoji bilo koji drugi i efikasan način koji se možete sjetiti, navedite u svojim komentarima.