GNU/Linux >> Linux Esercitazione >  >> Linux

Come staccare la sessione ssh senza uccidere un processo in esecuzione?

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 un screen , usa reptyr 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 facendo

echo 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. Da ptrace 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 - classico ptrace permessi:un processo può PTRACE_ATTACH a qualsiasi altro processo in esecuzione con lo stesso uid, purché sia ​​scaricabile [...]

1 - limitato ptrace :un processo deve avere una relazione predefinita con l'inferiore che vuole chiamare PTRACE_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 con CAP_SYS_PTRACE può usare ptrace con PTRACE_ATTACH o tramite bambini che chiamano PTRACE_TRACEME .

3 - no attach:nessun processo può usare ptrace con PTRACE_ATTACH né tramite PTRACE_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.


Linux
  1. Ssh:come rifiutare un processo in esecuzione e associarlo a una nuova shell dello schermo?

  2. Come visualizzare l'output di un processo in esecuzione in un'altra sessione Bash?

  3. Come fermare un processo dello schermo in Linux?

  4. Come uccidere un processo in esecuzione su una particolare porta in Linux?

  5. timeout senza uccidere il processo in bash

Come elencare i processi in esecuzione in Linux

Come configurare l'accesso SSH senza password

Reptyr:sposta un processo in esecuzione da un terminale all'altro senza chiuderlo

Come eliminare l'esecuzione del processo Linux su una porta particolare

Come posso controllare la sintassi di uno script Bash senza eseguirlo?

Come collego un terminale a un processo distaccato?