5 būdai, kaip išlaikyti nuotolines SSH sesijas ir procesus atjungus


Paprastais žodžiais tariant, SSH arba Secure Shell yra būdas, kuriuo asmuo gali nuotoliniu būdu pasiekti kitą vartotoją kitoje sistemoje, bet tik komandų eilute, t. y. ne GUI režimu. Kalbant labiau technine prasme, kai jungiamės kitam vartotojui kitoje sistemoje ir vykdome komandas tame kompiuteryje, jis iš tikrųjų sukuria pseudoterminalą ir prideda jį prie prisijungusio vartotojo prisijungimo apvalkalo.

Kai atsijungiame nuo seanso arba pasibaigia seanso skirtasis laikas, kai ilgą laiką buvome neaktyvūs, signalas SIGHUP siunčiamas į pseudoterminalą ir visas tame terminale vykdytas užduotis, net užduotys, kurių pirminės užduotys inicijuojamos pseudoterminale, taip pat siunčiamos SIGHUP signalu ir yra priverstinai nutrauktos.

Nepraleiskite: 5 naudingos praktikos, kaip užtikrinti SSH serverio saugumą ir apsaugą

Tik tos užduotys, kurios buvo sukonfigūruotos ignoruoti šį signalą, yra tos, kurios išgyvena po seanso nutraukimo. „Linux“ sistemose galime turėti daug būdų, kaip paleisti šias užduotis nuotoliniame serveryje arba bet kuriame įrenginyje net vartotojui atsijungus ir nutraukus sesiją.

Supraskite procesus sistemoje „Linux“.

Normalus procesas

Normalūs procesai yra tie, kurie trunka visą seansą. Jie paleidžiami seanso metu kaip pirminio plano procesai ir baigiasi per tam tikrą laikotarpį arba kai sesija atsijungiama. Šių procesų savininkas yra bet kuris galiojantis sistemos vartotojas, įskaitant root.

Našlaičių procesas

Natūralūs procesai yra tie, kurie iš pradžių turėjo pirminį procesą, kuris sukūrė procesą, bet po kurio laiko pirminis procesas netyčia mirė arba sustojo, todėl jis tapo to proceso pirminiu. Tokie procesai yra jų tiesioginiai tėvai, kurie laukia šių procesų, kol jie mirs arba baigsis.

Demonų procesas

Tai yra kai kurie tyčia palikti našlaičiais procesai, tokie procesai, kurie tyčia paliekami veikti sistemoje, vadinami demonu arba tyčia našlaičiais procesais. Paprastai tai yra ilgai trunkantys procesai, kurie vieną kartą inicijuojami ir atjungiami nuo bet kurio valdymo terminalo, kad galėtų veikti fone, kol nebaigti, arba galiausiai išklysta klaida. Tokių procesų tėvas tyčia miršta, priversdamas vaiką vykdyti egzekuciją fone.

Metodai, kaip išlaikyti SSH sesiją atjungus

Gali būti įvairių būdų, kaip palikti ssh seansus veikti po atjungimo, kaip aprašyta toliau:

1. Ekrano komandos naudojimas, kad SSH sesijos vyktų

Ekranas yra teksto langų tvarkyklė, skirta Linux, kuri leidžia vartotojui vienu metu valdyti kelis terminalo seansus, perjungti seansus, registruoti seansų žurnalą, kad būtų rodomos vykdomos sesijos ekrane ir net atnaujinti seansą bet kuriuo norimu metu. nesijaudindami, kad sesija bus atsijungta arba terminalas bus uždarytas.

ekrano seansus galima pradėti ir tada atskirti nuo valdymo terminalo, paliekant juos veikti fone, o tada tęsti bet kuriuo metu ir net bet kurioje vietoje. Jums tereikia pradėti seansą ekrane ir, kai norite, atjungti jį nuo pseudoterminalo (arba valdymo terminalo) ir atsijungti. Kai pajusite, galite iš naujo prisijungti ir tęsti sesiją.

Ekrano seanso pradžia

Įvedę komandą 'screen', pateksite į naują ekrano seansą. Šios sesijos metu galėsite kurti naujus langus, pereiti tarp langų, užrakinti ekraną ir atlikti daug kitų dalykų, kuriuos galite atlikti normalus terminalas.

screen

Pradėjus ekrano seansą, galite paleisti bet kurią komandą ir tęsti seansą, atjungdami seansą.

Ekrano atjungimas

Kai norite atsijungti nuo nuotolinio seanso, bet norite, kad seansas, kurį sukūrėte tame kompiuteryje, veiktų, tereikia atjungti ekraną nuo terminalo, kad jame neliktų jokio valdymo terminalo. Tai atlikę galite saugiai atsijungti.

Norėdami atjungti ekraną nuo nuotolinio terminalo, tiesiog paspauskite „Ctrl+a ”, iškart po to “d ” ir grįšite į terminalą ir pamatysite pranešimą, kad ekranas yra atskirtas. Dabar galite saugiai atsijungti ir jūsų sesija liks gyva.

Tęsiamas atskirto ekrano seansas

Jei norite atnaujinti atskirto ekrano seansą, kurį palikote prieš atsijungdami, tiesiog vėl prisijunkite prie nuotolinio terminalo ir įveskite “screen -r ”, jei atidaromas tik vienas ekranas ir keli ekranai ekrano seansai atidaromi paleisti “screen -r .

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

Norėdami sužinoti daugiau apie ekrano komandą ir kaip ją naudoti, tiesiog spustelėkite nuorodą: Naudokite ekrano komandą Linux terminalo seansams valdyti

2. Naudoti Tmux (terminalo multiplekserį), kad SSH sesijos vyktų

Tmux yra kita programinė įranga, sukurta pakeisti ekraną. Jis turi daugumą ekrano funkcijų, su keliomis papildomomis galimybėmis, dėl kurių jis yra galingesnis už ekraną.

Be visų ekrano siūlomų parinkčių, ji leidžia padalyti langų plokštes horizontaliai arba vertikaliai tarp kelių langų, keisti langų langų dydį, stebėti seanso veiklą, kurti scenarijus naudojant komandinės eilutės režimą ir tt Dėl šių tmux ypatybių jis buvo plačiai naudojamas beveik visi Unix platinimai ir net jis buvo įtrauktas į pagrindinę OpenBSD sistemą.

Pradėkite Tmux sesiją

Atlikę ssh nuotoliniame pagrindiniame kompiuteryje ir įvedę tmux, pradėsite naują seansą su nauju langu, kuriame galėsite daryti viską, ką darote įprastame terminale.

tmux

Atlikę operacijas terminale, galite atjungti tą seansą nuo valdymo terminalo, kad jis pereitų į foną ir galėtumėte saugiai atsijungti.

Atjunkite „Tmux Session“ nuo terminalo

Vykdydami tmux sesiją galite paleisti “tmux detach ” arba naudoti spartųjį klavišą (Ctrl+b, tada d). Po to dabartinė sesija bus atskirta ir grįšite į terminalą, iš kurio galėsite saugiai atsijungti.

tmux detach

Tęsiama uždara Tmux sesija

Norėdami iš naujo atidaryti sesiją, kurią atjungėte ir palikote tokią, kokia buvo atsijungę nuo sistemos, tiesiog iš naujo prisijunkite prie nuotolinio įrenginio ir įveskite "tmux attach", kad vėl prisijungtumėte prie uždaros sesijos ir bus ten ir veiks.

tmux attach

Norėdami sužinoti daugiau apie tmux ir kaip jį naudoti, tiesiog spustelėkite nuorodą: Norėdami valdyti kelis Linux terminalus, naudokite Tmux Terminal Multiplexer.

3. Norėdami tęsti SSH seansus, naudokite komandą nohup

Jei nesate gerai susipažinę su ekranu arba tmux, galite naudoti nohup ir išsiųsti ilgai veikiančią komandą į foną, kad galėtumėte tęsti komanda ir toliau bus vykdoma fone. Po to galėsite saugiai atsijungti.

Naudodami komandą nohup nurodome procesui nepaisyti SIGHUP signalo, kuris siunčiamas ssh seanso nutraukimo metu, todėl komanda išlieka net ir atsijungus seansui. Atsijungus seansui, komanda atjungiama nuo valdymo terminalo ir toliau veikia fone kaip demono procesas.

Vykdoma komanda naudojant nohup fone

Čia pateikiamas paprastas scenarijus, kai paleidome komandą find, norėdami ieškoti failų fone ssh sesijoje naudodami nohup, po kurios užduotis buvo išsiųsta į foną, nedelsiant grąžinant PID ir užduotį ID proceso ([JOBID] PID).

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

Tęsiamas seansas, kad pamatytumėte, ar darbas vis dar vykdomas

Kai vėl prisijungiate, galite patikrinti komandos būseną, grąžinti ją į pirmą planą naudodami 'fg %JOBID', kad galėtumėte stebėti jos eigą ir pan. Žemiau pateikta išvestis rodo, kad užduotis buvo baigta, nes ji nerodoma iš naujo prisijungus, ir pateikiama išvestis, kuri rodoma.

fg %JOBID

4. Naudokite disown komandą, kad SSH sesijos vyktų

Kitas elegantiškas būdas leisti komandai arba vienai užduočiai vykdyti fone ir išlikti gyvai net atsijungus seansui arba atsijungus, yra naudoti atsisakyti.

Atsisakyti, pašalina užduotį iš sistemos proceso užduočių sąrašo, todėl procesas yra apsaugotas nuo užmušimo seanso atjungimo metu, nes apvalkalas negaus SIGHUP, kai tu atsijungi.

Šio metodo trūkumas yra tas, kad jis turėtų būti naudojamas tik tiems darbams, kuriems nereikia įvesties iš stdin ir nereikia rašyti į stdout, nebent konkrečiai peradresuojate užduočių įvestis ir išvestis, nes kai užduotis bandys sąveikauti su stdin arba stdout, ji sustos.

Vykdoma komanda naudojant disown fone

Toliau išsiuntėme komandą ping į foną, kad ut veiktų ir būtų pašalinta iš darbų sąrašo. Kaip matyti, darbas pirmiausia buvo sustabdytas, o po to jis vis dar buvo darbų sąraše kaip Proceso ID: 15368.

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

Po to atsisakymo signalas buvo perduotas darbui ir jis buvo pašalintas iš darbų sąrašo, nors vis dar veikė fone. Užduotis vis tiek bus vykdoma, kai iš naujo prisijungsite prie nuotolinio serverio, kaip parodyta toliau.

ps -ef | grep ping

5. Naudokite komandą setsid, kad paleistumėte SSH seansus

Kitas įrankis, leidžiantis pasiekti reikiamą elgesį, yra setsid. Nohup turi trūkumą ta prasme, kad proceso procesų grupė išlieka ta pati, todėl su nohup vykdomas procesas yra pažeidžiamas bet kokio signalo, siunčiamo visai proceso grupei (pvz., Ctrl + C<). /kodas>).

Kita vertus, setsid priskiria naują procesų grupę vykdomam procesui, todėl sukurtas procesas yra visiškai naujai priskirtoje procesų grupėje ir gali būti vykdomas saugiai, nebijant būti nužudytas net ir atsijungus seansui.

Vykdykite bet kurią komandą naudodami setsid

Čia rodoma, kad procesas 'miega 10 m' nuo valdymo terminalo buvo atskirtas nuo jo sukūrimo.

setsid sleep 10m
ps -ef | grep sleep

Dabar, kai iš naujo prisijungsite prie sesijos, šis procesas vis tiek bus vykdomas.

ps -ef | grep [s]leep

Išvada

Kokius būdus galėtumėte sugalvoti, kad procesas vyktų net atsijungus nuo SSH sesijos? Jei yra koks nors kitas ir veiksmingas būdas, kurį galite sugalvoti, paminėkite savo komentaruose.