Usa
Ctrl-Z
per mettere in pausa l'applicazione e tornare alla riga di comando. Quindi usa
bg
per consentire al processo di continuare in background. Infine usa
disown
In modo che il processo non venga chiuso quando disconnetti la sessione e chiudi il terminale.
Il processo continuerà a essere eseguito ma non c'è modo di "ricollegarsi" al terminale per visualizzare l'output di cui sono a conoscenza se ti riconnetti a una nuova sessione.
Usa reptyr
Questo è esattamente il caso man 1 reptyr
menziona esplicitamente:
reptyr
è un'utilità per prendere un programma in esecuzione esistente e collegarlo a un nuovo terminale. Hai avviato un processo di lunga durata su ssh, ma devi andartene e non vuoi interromperlo? Basta iniziare unscreen
, usareptyr
per prenderlo, quindi terminare la sessione ssh e tornare a casa.
(Il manuale menziona screen
, puoi utilizzare tmux
invece, quello che preferisci).
Non perdere questa nota:
reptyr
dipende dall'ptrace(2)
chiamata di sistema da collegare al programma remoto. Su Ubuntu Maverick e versioni successive, questa capacità è disabilitata per impostazione predefinita per motivi di sicurezza. Puoi abilitarlo temporaneamente facendoecho 0 > /proc/sys/kernel/yama/ptrace_scope
come root o permanentemente modificando il file
/etc/sysctl.d/10-ptrace.conf
, che contiene anche ulteriori informazioni su questa impostazione.
Se il file non esiste ma il /etc/sysctl.d/
directory lo fa, quindi è probabilmente sufficiente crearlo con il seguente contenuto:
kernel.yama.ptrace_scope = 0
L'impostazione verrà applicata al successivo riavvio. Si prega di consultare le considerazioni sulla sicurezza di seguito.
Utilizzo di base
L'utilizzo di base è semplice:
reptyr PID
dove PID
è il PID del processo che vuoi collegare a un nuovo terminale. Nota reptyr
collega solo un processo a un altro terminale. Questo non significa che il processo diventa figlio della nuova shell.
Considerazioni sulla sicurezza
Impostazione ptrace_scope
come 0
non è raccomandato.
Man mano che Linux cresce in popolarità, diventerà un obiettivo più ampio per il malware. Una debolezza particolarmente preoccupante delle interfacce di processo di Linux è che un singolo utente è in grado di esaminare la memoria e lo stato di esecuzione di uno qualsiasi dei propri processi. Ad esempio, se un'applicazione (ad esempio Pidgin) è stata compromessa, un utente malintenzionato potrebbe collegarsi ad altri processi in esecuzione (ad esempio Firefox, sessioni SSH, agente GPG, ecc.) per estrarre credenziali aggiuntive e continuare ad espandere l'ambito della propria attaccare senza ricorrere al phishing assistito dall'utente.
Questo non è un problema teorico. Il dirottamento della sessione SSH (http://www.storm.net.nz/projects/7) e l'iniezione di codice arbitrario (http://c-skills.blogspot.com/2007/05/injectso.html) esistono già e rimangono possibile se
ptrace
è autorizzato a funzionare come prima. Daptrace
non è comunemente usato da non sviluppatori e non amministratori, i system builder dovrebbero avere la possibilità di disabilitare questo sistema di debug.[…]
Le impostazioni di sysctl (scrivibili solo con
CAP_SYS_PTRACE
) sono:
0
- classicoptrace
permessi:un processo puòPTRACE_ATTACH
a qualsiasi altro processo in esecuzione con lo stesso uid, purché sia scaricabile [...]
1
- limitatoptrace
:un processo deve avere una relazione predefinita con l'inferiore che vuole chiamarePTRACE_ATTACH
Su. Per impostazione predefinita, questa relazione è solo quella dei suoi discendenti quando vengono soddisfatti anche i criteri classici di cui sopra. […]
2
- admin-only attach:elabora solo conCAP_SYS_PTRACE
può usareptrace
conPTRACE_ATTACH
o tramite bambini che chiamanoPTRACE_TRACEME
.
3
- no attach:nessun processo può usareptrace
conPTRACE_ATTACH
né tramitePTRACE_TRACEME
. Una volta impostato, questo valore sysctl non può essere modificato.
Un approccio ragionevole è impostare ptrace_scope
a 2
e poi consenti reptyr
per utilizzare ptrace
:
echo 2 | sudo tee /proc/sys/kernel/yama/ptrace_scope
sudo setcap CAP_SYS_PTRACE+pe /usr/bin/reptyr
Non dimenticare il file che contiene l'impostazione permanente.
Le funzionalità sono memorizzate nell'inode del file. Pertanto non sarò sorpreso se reptyr
perde la capacità quando viene aggiornato (sostituito atomicamente da un nuovo eseguibile).
Puoi dissociare totalmente un comando (in bash
o zsh
, possibilmente altre shell) con disown
comando. Il comando tuttavia potrebbe non essere soddisfatto se richiede un tty, nel qual caso vedere il reptyr
rispondi.
$ 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$
Un'altra opzione è quella di avviare automaticamente una sessione screen (o tmux) in modo da non dimenticarti di avviarne una perché ne è già stata avviata una perché hai impostato le cose in questo modo. Ci sono altri post altrove su come farlo.