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čí spustitscreen
, použijtereptyr
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í naptrace(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ímecho 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. Odptrace
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ůžePTRACE_ATTACH
na jakýkoli jiný proces běžící pod stejným uid, pokud je možné jej uložit […]
1
- omezenoptrace
:proces musí mít předem definovaný vztah s podřízeným, kterému chce volatPTRACE_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á sCAP_SYS_PTRACE
může používatptrace
sPTRACE_ATTACH
nebo prostřednictvím potomků volajícíchPTRACE_TRACEME
.
3
- bez připojení:žádné procesy nesmí používatptrace
sPTRACE_ATTACH
ani přesPTRACE_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.