Come utilizzare efficacemente schermo e SSH?


12

Vorrei configurare SSH e lo schermo in modo tale che un accesso si ricolleghi sempre a una sessione dello schermo. Idealmente, quella sessione non si chiude ma si stacca quando premo Cd. Come si può ottenere questo? E quali altre impostazioni utili ci sono per rendere più semplice la mia vita SSH?

Risposte:


9

Ho appena fatto quanto segue per tutti i miei server in modo che quando mi collego tramite SSH vengo automaticamente messo in una sessione dello schermo.

Aggiungi quanto segue a ~ / .bashrc per i tuoi account utente:

# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session.   Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ] 
then
  STARTED_SCREEN=1 ; export STARTED_SCREEN
  screen -RR -S main || echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]

Ciò avvierà una sessione di schermo denominata main se non esiste o si riconnetterà ad essa in caso affermativo. Questo è stato fatto perché ho diverse altre sessioni dello schermo in esecuzione staccate per vari servizi e non volevo collegarmi a loro.


Volevo solo aggiungere che la combinazione di tasti CTRL-d è standard nello schermo per staccare da una sessione dello schermo in esecuzione.
Daemon of Chaos,

8

Ho il seguente nel mio .bash_profile sui miei server remoti:

if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
    reattach() {
        if [ -n "${SSH_AUTH_SOCK}" ]; then
            ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
            SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
        fi
        exec screen -A -D -RR ${1:+"$@"}
    }
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

Questo fa due cose: in primo luogo, imposta una funzione di shell per sostituire la shell e portare avanti la connessione ssh-agent, in secondo luogo chiama la funzione dopo aver messo in pausa per alcuni secondi (nel caso in cui non si desideri avviare lo schermo).

La prima ifclausola sarà vera se non è già in esecuzione screen ( -z "${STY}") è collegato a un terminale ( -t 0) e non eseguo sudo (che a volte non cambia $USER).

La reattachfunzione verificherà prima se ssh è stato chiamato con una porta ssh-agent active ( -n "${SSH_AUTH_SOCK}"). Quindi sostituirà qualsiasi cosa si trovi ~/.ssh/agent-scriptcon il file socket attualmente attivo e sostituirà la variabile di ambiente ( $SSH_AUTH_SOCK) con il nuovo valore. Quindi lo script sostituirà la shell corrente con una singola screensessione (assicurandosi che ne esista solo una). Tutti gli argomenti della reattachfunzione vengono passati al comando ( ${1:+"$@"}).

L'ultima parte rimuove prima tutte le sessioni morte ( screen -wipe), fa sapere all'utente (me) che lo schermo si avvierà a breve e può invece tornare alla shell premendo Ctrl- C. Quindi attende 5 secondi e chiama la reattachfunzione.


4

In primo luogo, se si utilizza byobu è possibile configurare una nuova sessione di shell in modo che si avvii sempre automaticamente byobu (che è essenzialmente una buona configurazione dello schermo, sebbene le versioni più recenti possano usare tmux come backend). Se davvero non vuoi byobu, allora puoi probabilmente impostare lo schermo per la connessione manuale modificando il tuo .profileo altri script di configurazione della shell su exec screenif TERM != "screen".

Se non ti piace, puoi utilizzare il authorized_keysfile per eseguire un comando specifico per le connessioni con una chiave specifica (e puoi avere tutte le chiavi che desideri). Vedi man sshdper i dettagli. Ti suggerirei di eseguire il comando eseguendo uno script che controlli se lo schermo è in esecuzione e si connette, oppure avvia una nuova sessione.

Per quanto riguarda la disconnessione su Ctrl-D, lo schermo ti consente di impostare i mapping dei tasti nel tuo .screenrc. Vedi man screenper i dettagli. Stai cercando "bindkey".


2

Forse del tutto irrilevante per la tua domanda, ma hai mai preso in considerazione l'utilizzo di TMUX. Fa molte funzionalità che stai cercando fuori dalla scatola.

Per esempio. se ti disconnetti da una sessione SSH quando sei in TMUX, tutto ciò che devi fare è tornare indietro ed eseguire "tmux a" per collegarti alla tua sessione. Da quando ho iniziato a usare TMUX, ho dimenticato quali sono i comandi nohup / disown ... se devi eseguire qualcosa e disconnetterti - eseguilo all'interno di tmux e scollegalo. L'output del comando verrà bufferizzato, quindi è possibile rivederlo in un secondo momento.

per allegare automaticamente è possibile aggiungere qualcosa di simile a .bashrc:

[ -z $TMUX ] && tmux list-sessions 2>/dev/null && tmux a

o anche più facile

tmux a 2>/dev/null

Ha un ingombro di memoria inferiore e IMHO complessivo opzione molto migliore / più facile da usare.

La scorciatoia meta-d è la mappatura predefinita da staccare in TMUX.


0

screen -dAr default || screen -AS defaultper me va bene. Lo aggiungo al mio ~ / .bashrc .

Spiegazione breve degli interruttori:

  • d - Stacca lo schermo se è ancora collegato, da un'altra sessione.
  • A - Adatta le finestre dello schermo alle nuove dimensioni del terminale.
  • r default - Collega a uno schermo chiamato predefinito.

Se il primo comando sullo schermo (quello precedente ||) non riesce, viene eseguito il secondo:

  • A - Come spiegato sopra ...
  • S default- Crea la nuova sessione schermo con il nome predefinito .

0

Suggerisco di usare byobu . Questo strumento utilizza tmux e offre una bella barra degli strumenti e altre comode funzioni di cambio finestra, tasti di scelta rapida ecc.

echo "new-session" >> ~/.byobu/.tmux.conf
echo "if [ -n '\$TMUX' ]; then :; else byobu attach; fi" >> ~/.bashrc

Con questi comandi sopra dopo un SSH riuscito accedi al sistema con prova e connettiti a una sessione byobu-tmux esistente, altrimenti creerà una nuova sessione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.