Zoeken op website

5 manieren om externe SSH-sessies en -processen actief te houden nadat de verbinding is verbroken


SSH of Secure Shell is in eenvoudige bewoordingen een manier waarop iemand op afstand toegang kan krijgen tot een andere gebruiker op een ander systeem, maar alleen in de opdrachtregel, dat wil zeggen in de niet-GUI-modus. In meer technische termen: wanneer we verbinding maken met een andere gebruiker op een ander systeem en opdrachten uitvoeren op die machine, wordt er in feite een pseudo-terminal gemaakt en wordt deze gekoppeld aan de login-shell van de ingelogde gebruiker.

Wanneer we uitloggen bij de sessie of wanneer de sessie een time-out krijgt nadat deze een tijdje inactief is geweest, wordt het SIGHUP signaal naar de pseudo-terminal gestuurd en naar alle taken die op die terminal zijn uitgevoerd, zelfs de taken waarvan de bovenliggende taken op de pseudo-terminal worden geïnitieerd, krijgen ook het SIGHUP-signaal verzonden en worden gedwongen te beëindigen.

Mis het niet: 5 nuttige tips om de SSH-server veilig en beschermd te houden

Alleen de taken die zijn geconfigureerd om dit signaal te negeren, overleven de beëindiging van de sessie. Op Linux-systemen kunnen we veel manieren hebben om deze taken op de externe server of op een andere machine te laten draaien, zelfs nadat de gebruiker is uitgelogd en de sessie is beëindigd.

Begrijp processen op Linux

Normaal proces

Normale processen zijn processen die de levensduur van een sessie hebben. Ze worden tijdens de sessie gestart als voorgrondprocessen en eindigen na een bepaalde tijdsperiode of wanneer de sessie wordt uitgelogd. Deze processen hebben hun eigenaar als een van de geldige gebruikers van het systeem, inclusief root.

Weesproces

Weesprocessen zijn processen die aanvankelijk een ouder hadden die het proces creëerde, maar na enige tijd stierf of crashte het ouderproces, waardoor init de ouder van dat proces werd. Dergelijke processen hebben init als hun directe ouder, die op deze processen wacht totdat ze doodgaan of eindigen.

Daemon-proces

Dit zijn enkele opzettelijk verweesde processen. Dergelijke processen die opzettelijk op het systeem blijven draaien, worden daemon of opzettelijk verweesde processen genoemd. Het zijn meestal langlopende processen die eenmaal zijn gestart en vervolgens zijn losgekoppeld van een controlerende terminal, zodat ze op de achtergrond kunnen worden uitgevoerd totdat ze niet worden voltooid of uiteindelijk een fout veroorzaken. De ouder van dergelijke processen sterft opzettelijk, waardoor het kind op de achtergrond wordt uitgevoerd.

Technieken om de SSH-sessie actief te houden na het verbreken van de verbinding

Er kunnen verschillende manieren zijn om ssh-sessies actief te laten nadat de verbinding is verbroken, zoals hieronder beschreven:

1. Schermopdracht gebruiken om SSH-sessies actief te houden

screen is een tekstvensterbeheerder voor Linux waarmee de gebruiker meerdere terminalsessies tegelijkertijd kan beheren, tussen sessies kan schakelen, sessieregistratie voor de lopende sessies op het scherm kan uitvoeren en zelfs de sessie kan hervatten op elk gewenst moment zonder dat u zich zorgen hoeft te maken dat de sessie wordt afgemeld of dat de terminal wordt gesloten.

schermsessies kunnen worden gestart en vervolgens worden losgekoppeld van de controlerende terminal, waardoor ze op de achtergrond blijven draaien en vervolgens op elk moment en zelfs op elke plaats kunnen worden hervat. U hoeft alleen maar uw sessie op het scherm te starten en wanneer u maar wilt, deze los te koppelen van de pseudo-terminal (of de controlerende terminal) en uit te loggen. Wanneer u zich voelt, kunt u opnieuw inloggen en de sessie hervatten.

Een schermsessie starten

Nadat u de opdracht 'screen' hebt getypt, bevindt u zich in een nieuwe schermsessie. Binnen deze sessie kunt u nieuwe vensters maken, tussen vensters schakelen, het scherm vergrendelen en nog veel meer dingen doen die u op een normale terminal.

screen

Zodra de schermsessie is gestart, kunt u elke opdracht uitvoeren en de sessie draaiende houden door de sessie te ontkoppelen.

Een scherm losmaken

Net wanneer u zich wilt afmelden bij de sessie op afstand, maar u de sessie die u op die machine hebt gemaakt levend wilt houden, hoeft u alleen maar het scherm los te koppelen van de terminal, zodat er geen controlerende terminal meer over is. Nadat u dit heeft gedaan, kunt u veilig uitloggen.

Om een scherm los te koppelen van de externe terminal, drukt u gewoon op “Ctrl+a ” onmiddellijk gevolgd door “d ” en u keert terug naar de terminal en ziet het bericht dat het scherm staat los. Nu kunt u veilig uitloggen en blijft uw sessie actief.

Hervatten van een losgekoppelde schermsessie

Als u een losgekoppelde schermsessie wilt hervatten die u verliet voordat u zich afmeldde, logt u gewoon opnieuw in op de externe terminal en typt u “screen -r ” als er slechts één scherm is geopend en als er meerdere zijn geopend. schermsessies worden geopend, voer “screen -r uit.

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

Voor meer informatie over schermopdrachten en hoe u deze kunt gebruiken, volgt u de link: Gebruik schermopdracht om Linux-terminalsessies te beheren

2. Tmux (Terminal Multiplexer) gebruiken om SSH-sessies actief te houden

Tmux is een andere software die is gemaakt als vervanging voor scherm. Het heeft de meeste mogelijkheden van scherm, met enkele extra mogelijkheden die het krachtiger maken dan scherm.

Het maakt, afgezien van alle opties die het scherm biedt, het mogelijk om vensters horizontaal of verticaal te splitsen tussen meerdere vensters, het formaat van vensters te wijzigen, sessie-activiteit te monitoren, scripting te gebruiken met behulp van de opdrachtregelmodus enz. Vanwege deze kenmerken van tmux wordt het door bijna iedereen breed geaccepteerd. alle Unix-distributies en zelfs het is opgenomen in het basissysteem van OpenBSD.

Start een Tmux-sessie

Nadat je ssh hebt uitgevoerd op de externe host en tmux hebt getypt, ga je een nieuwe sessie aan met een nieuw venster dat voor je wordt geopend, waarin je alles kunt doen wat je op een normale terminal doet.

tmux

Nadat u uw handelingen op de terminal heeft uitgevoerd, kunt u die sessie loskoppelen van de controlerende terminal, zodat deze naar de achtergrond gaat en u veilig kunt uitloggen.

Koppel de Tmux-sessie los van de terminal

U kunt ofwel “tmux detach ” uitvoeren tijdens de actieve tmux-sessie, ofwel u kunt de sneltoets (Ctrl+b en vervolgens d) gebruiken. Hierna wordt uw huidige sessie verbroken en komt u terug op uw terminal waar u veilig kunt uitloggen.

tmux detach

De gesloten Tmux-sessie hervatten

Om de sessie die u hebt losgemaakt en hebt verlaten zoals deze was toen u zich afmeldde bij het systeem, opnieuw te openen, logt u gewoon opnieuw in op de externe machine en typt u “tmux Attach” om opnieuw verbinding te maken met de gesloten sessie. zal er nog steeds zijn en actief zijn.

tmux attach

Voor meer informatie over tmux en hoe u het kunt gebruiken, volgt u de link: Gebruik Tmux Terminal Multiplexer om meerdere Linux-terminals te beheren.

3. Gebruik de nohup-opdracht om SSH-sessies te blijven uitvoeren

Als u niet zo bekend bent met screen of tmux, kunt u nohup gebruiken en uw langlopende opdracht naar de achtergrond sturen, zodat u door kunt gaan terwijl de opdracht blijft op de achtergrond worden uitgevoerd. Daarna kunt u veilig uitloggen.

Met het nohup-commando vertellen we het proces om het SIGHUP-signaal te negeren dat door de ssh-sessie wordt verzonden bij beëindiging, waardoor het commando blijft bestaan, zelfs nadat de sessie is afgemeld. Bij het uitloggen van de sessie wordt het commando losgekoppeld van de besturingsterminal en blijft het op de achtergrond draaien als daemonproces.

Opdracht uitvoeren met nohup op de achtergrond

Hier is een eenvoudig scenario waarin we de opdracht find hebben uitgevoerd om tijdens een ssh-sessie naar bestanden op de achtergrond te zoeken met behulp van nohup, waarna de taak naar de achtergrond werd gestuurd met onmiddellijke terugkeer met PID en job ID van het proces ([JOBID] PID).

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

De sessie hervatten om te zien of de taak nog steeds actief is

Wanneer u opnieuw inlogt, kunt u de status van het commando controleren, het terug naar de voorgrond brengen met behulp van 'fg %JOBID' om de voortgang ervan te volgen, enzovoort. Hieronder laat de uitvoer zien dat de taak is voltooid, aangezien deze niet wordt weergegeven bij opnieuw inloggen, en de uitvoer heeft opgeleverd die wordt weergegeven.

fg %JOBID

4. Disown Command gebruiken om SSH-sessies actief te houden

Een andere elegante manier om uw opdracht of een enkele taak op de achtergrond te laten draaien en in leven te blijven, zelfs nadat de sessie is afgemeld of de verbinding is verbroken, is door disown te gebruiken.

Disown, verwijdert de taak uit de procestakenlijst van het systeem, zodat het proces wordt beschermd tegen beëindiging tijdens het verbreken van de sessie, omdat het geen SIGHUP door de shell ontvangt wanneer jij logt uit.

Het nadeel van deze methode is dat deze alleen moet worden gebruikt voor de taken die geen invoer van de stdin nodig hebben en die ook niet naar stdout hoeven te schrijven, tenzij u specifiek omleidt jobs invoer en uitvoer, omdat wanneer job probeert te communiceren met stdin of stdout, het zal stoppen.

Commando uitvoeren met behulp van disown op de achtergrond

Hieronder hebben we de opdracht ping naar de achtergrond gestuurd, zodat ut blijft draaien en uit de takenlijst wordt verwijderd. Zoals u kunt zien, werd de taak eerst opgeschort, waarna deze nog steeds in de takenlijst stond als Proces-ID: 15368.

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

Daarna werd het afwijzingssignaal doorgegeven aan de taak en verwijderd uit de takenlijst, hoewel deze nog steeds op de achtergrond actief was. De taak zou nog steeds actief zijn als u zich opnieuw zou aanmelden bij de externe server, zoals hieronder te zien is.

ps -ef | grep ping

5. Gebruik de opdracht setsid om SSH-sessies actief te maken

Een ander hulpprogramma om het vereiste gedrag te bereiken is setsid. Nohup heeft een nadeel in de zin dat de procesgroep van het proces hetzelfde blijft, dus het proces dat met nohup draait, is kwetsbaar voor elk signaal dat naar de hele procesgroep wordt verzonden (zoals Ctrl + C).

setsid wijst daarentegen een nieuwe procesgroep toe aan het proces dat wordt uitgevoerd en daarom bevindt het gecreëerde proces zich volledig in een nieuw toegewezen procesgroep en kan het veilig worden uitgevoerd zonder bang te zijn om te worden gedood, zelfs na het afmelden van de sessie.

Voer een willekeurige opdracht uit met behulp van setid

Hier blijkt dat het proces ‘sleep 10m’ is losgekoppeld van de controlerende terminal, sinds het moment dat het is gemaakt.

setsid sleep 10m
ps -ef | grep sleep

Wanneer u nu opnieuw inlogt op de sessie, zult u merken dat dit proces nog steeds actief is.

ps -ef | grep [s]leep

Conclusie

Welke manieren kunt u bedenken om uw proces draaiende te houden, zelfs nadat u zich hebt afgemeld bij de SSH-sessie? Als u een andere en efficiënte manier kunt bedenken, vermeld dit dan in uw opmerkingen.