GNU/Linux >> Znalost Linux >  >> Linux

Jak odpojit relaci ssh bez zabití běžícího procesu?

Použijte

Ctrl-Z

pozastavit aplikaci a vrátit se na příkazový řádek. Poté použijte

bg

aby proces mohl pokračovat na pozadí. Nakonec použijte

disown

Aby se proces neukončil, když odpojíte relaci a zavřete terminál.

Proces bude pokračovat, ale neexistuje způsob, jak se znovu připojit k terminálu a zobrazit výstup, o kterém vím, pokud se znovu připojíte k nové relaci.


Použijte reptyr

To je přesně případ man 1 reptyr výslovně uvádí:

reptyr je nástroj pro převzetí existujícího běžícího programu a jeho připojení k novému terminálu. Spustili jste dlouhotrvající proces přes ssh, ale musíte odejít a nechcete jej přerušovat? Stačí spustit screen , použijte reptyr chytit to a pak zabít ssh relaci a jít domů.

(Příručka zmiňuje screen , můžete použít tmux místo toho podle toho, čemu dáváte přednost).

Nenechte si ujít tuto poznámku:

reptyr závisí na ptrace(2) systémové volání pro připojení ke vzdálenému programu. Na Ubuntu Maverick a vyšších je tato schopnost z bezpečnostních důvodů ve výchozím nastavení zakázána. Dočasně jej můžete povolit provedením

echo 0 > /proc/sys/kernel/yama/ptrace_scope

jako root nebo trvale úpravou souboru /etc/sysctl.d/10-ptrace.conf , který také obsahuje další informace o tomto nastavení.

Pokud soubor neexistuje, ale /etc/sysctl.d/ adresář ano, pak ho pravděpodobně stačí vytvořit s následujícím obsahem:

kernel.yama.ptrace_scope = 0

Nastavení se použije při příštím restartu. Viz bezpečnostní aspekty níže.

Základní použití

Základní použití je jednoduché:

reptyr PID

kde PID je PID procesu, který chcete připojit k novému terminálu. Poznámka reptyr pouze připojí proces k jinému terminálu. To neznamená, že se proces stane potomkem nového shellu.

Bezpečnostní aspekty

Nastavení ptrace_scope jako 0 se nedoporučuje.

S rostoucí popularitou Linuxu se stane větším cílem malwaru. Jednou obzvláště znepokojivou slabinou procesních rozhraní Linuxu je to, že jeden uživatel je schopen prozkoumat paměť a stav běhu kteréhokoli ze svých procesů. Pokud by byla například ohrožena jedna aplikace (např. Pidgin), bylo by možné, aby se útočník připojil k jiným běžícím procesům (např. Firefox, SSH relace, GPG agent atd.), aby extrahoval další přihlašovací údaje a nadále rozšiřoval rozsah svých útok bez použití phishingu za pomoci uživatele.

To není teoretický problém. Útoky na únos relací SSH (http://www.storm.net.nz/projects/7) a vložení libovolného kódu (http://c-skills.blogspot.com/2007/05/injectso.html) již existují a přetrvávají možné, pokud ptrace může fungovat jako dříve. Od ptrace není běžně používán nevývojáři a správci, měli by mít tvůrci systému možnost zakázat tento systém ladění.

[…]

Nastavení sysctl (lze zapisovat pouze pomocí CAP_SYS_PTRACE ) jsou:

0 - klasický ptrace oprávnění:proces může PTRACE_ATTACH na jakýkoli jiný proces běžící pod stejným uid, pokud je možné jej uložit […]

1 - omezeno ptrace :proces musí mít předem definovaný vztah s podřízeným, kterému chce volat PTRACE_ATTACH na. Ve výchozím nastavení je tento vztah vztahem pouze jeho potomků, pokud jsou také splněna výše uvedená klasická kritéria. […]

2 - připojení pouze pro správce:pouze zpracovává s CAP_SYS_PTRACE může používat ptrace s PTRACE_ATTACH nebo prostřednictvím potomků volajících PTRACE_TRACEME .

3 - bez připojení:žádné procesy nesmí používat ptrace s PTRACE_ATTACH ani přes PTRACE_TRACEME . Jakmile je tato hodnota sysctl nastavena, nelze ji změnit.

Rozumný přístup je nastavit ptrace_scope na 2 a poté povolte reptyr použít ptrace :

echo 2 | sudo tee /proc/sys/kernel/yama/ptrace_scope
sudo setcap CAP_SYS_PTRACE+pe /usr/bin/reptyr

Nezapomeňte na soubor, který má trvalé nastavení.

Schopnosti jsou uloženy v inodu souboru. Proto nebudu překvapen, když reptyr ztratí schopnost, když je aktualizován (atomicky nahrazen novým spustitelným souborem).


Příkaz můžete zcela zrušit (v bash nebo zsh , případně další shelly) s disown příkaz. Příkaz však nemusí být spokojený, pokud vyžaduje tty, v takovém případě se podívejte na reptyr odpovědět.

$ ssh somecentos7system
-bash-4.2$ sleep 252727
^Z
[1]+  Stopped                 sleep 252727
-bash-4.2$ bg
[1]+ sleep 252727 &
-bash-4.2$ disown
-bash-4.2$ logout
Connection to somecentos7system closed.
$ ssh somecentos7system
-bash-4.2$ pgrep -lf 252727
20089 sleep
-bash-4.2$ 

Další možností je nechat relaci obrazovky (nebo tmux) automaticky spouštět, takže nemůžete zapomenout ji spustit, protože jedna pro vás již byla spuštěna, protože jste to tak nastavili. O tom, jak to udělat, jsou jiné příspěvky.


Linux
  1. Ssh – Jak zrušit běžící proces a přiřadit jej k novému prostředí obrazovky?

  2. Ssh – Ponechat procesy spuštěné po odpojení relace Ssh?

  3. Jak restartovat (nebo resetovat) běžící proces v Linuxu?

  1. Jak zjistit, zda běží v linuxové konzoli oproti relaci ssh?

  2. časový limit bez procesu zabíjení v bash

  3. Jak se znovu připojit k odpojené relaci ssh

  1. Jak nastavit SSH přihlášení bez hesla

  2. Jak ukončit nereagující připojení SSH v linuxu?

  3. Obnovit příkaz spuštěný ve zrušené relaci SSH