Comment utiliser efficacement l'écran et SSH?

12

Je voudrais configurer SSH et écran de telle sorte qu'une connexion sera toujours rattachée à une session d'écran. Idéalement, cette session ne se fermerait pas mais se détacherait lorsque j'appuyer sur Cd. Comment cela peut il etre accompli? Et quels sont les autres paramètres utiles pour faciliter ma vie SSH?

Tobias Kienzler
la source

Réponses:

9

Je viens de faire ce qui suit pour tous mes serveurs afin que lorsque je me connecte via SSH, je suis automatiquement mis dans une session d'écran.

Ajoutez ce qui suit au ~ / .bashrc pour vos comptes d'utilisateurs:

# 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]

Cela lancera une session d'écran nommée main si elle n'existe pas ou s'y reconnectera si c'est le cas. Cela a été fait parce que j'ai plusieurs autres sessions d'écran fonctionnant séparément pour divers services et que je ne voulais pas me connecter à elles.

Démon du chaos
la source
Je voulais juste ajouter que la combinaison de touches CTRL-d est standard dans l'écran pour se détacher d'une session d'écran en cours.
Daemon of Chaos
8

J'ai les éléments suivants dans mon .bash_profile sur mes serveurs distants:

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

Cela fait deux choses: premièrement, configure une fonction shell pour remplacer le shell et reporter la connexion ssh-agent, deuxièmement elle appelle la fonction après une pause de quelques secondes (au cas où vous ne voudriez pas que l'écran démarre).

La première ifclause sera vraie si screen ( -z "${STY}") n'est pas déjà en cours d'exécution est attaché à un terminal ( -t 0) et que je n'exécute pas sudo (qui parfois ne change pas $USER).

La reattachfonction vérifiera d'abord si ssh a été appelé avec un port ssh-agent actif ( -n "${SSH_AUTH_SOCK}"). Ensuite, il remplacera tout ce qui se trouve ~/.ssh/agent-scriptavec le fichier socket actuellement actif et remplacera la variable d'environnement ( $SSH_AUTH_SOCK) par la nouvelle valeur. Ensuite, le script remplacera le shell actuel par une seule screensession (en s'assurant qu'il n'en existe qu'une seule). Tous les arguments de la reattachfonction sont passés à la commande ( ${1:+"$@"}).

La dernière partie supprime d'abord toutes les sessions mortes ( screen -wipe), permet à l'utilisateur (moi) de savoir que l'écran va démarrer sous peu et peut à la place revenir au shell en appuyant sur Ctrl- C. Il attend ensuite 5 secondes et appelle la reattachfonction.

Arcege
la source
4

Tout d'abord, si vous utilisez byobu, vous pouvez configurer une nouvelle session shell pour toujours démarrer automatiquement byobu (ce qui est essentiellement une belle configuration d'écran, bien que les versions plus récentes puissent utiliser tmux comme backend). Si vous ne voulez vraiment pas byobu, vous pouvez probablement configurer l'écran pour qu'il se connecte manuellement en éditant votre .profileou un autre script de configuration du shell sur exec screenif TERM != "screen".

Si vous n'aimez pas cela, vous pouvez utiliser le authorized_keysfichier pour exécuter une commande spécifique pour les connexions avec une clé spécifique (et vous pouvez avoir autant de clés que vous le souhaitez). Voir man sshdpour plus de détails. Je vous suggère de faire exécuter à la commande un script qui vérifie si l'écran est en cours d'exécution et se connecte, ou bien démarre une nouvelle session.

Quant à la déconnexion sur Ctrl-D, l'écran vous permet de configurer les mappages de touches dans votre .screenrc. Voir man screenpour plus de détails. Vous recherchez "bindkey".

ams
la source
2

Peut-être totalement hors de propos pour votre question, mais avez-vous déjà envisagé d'utiliser TMUX à la place. Il fait beaucoup de fonctionnalités que vous recherchez hors de la boîte.

Par exemple. si vous vous déconnectez d'une session SSH lorsque vous êtes sous TMUX, tout ce que vous avez à faire est de sauvegarder en arrière et d'exécuter "tmux a" pour attacher à votre session. Depuis que j'ai commencé à utiliser TMUX, j'ai oublié ce que sont les commandes nohup / disown ... si vous avez besoin d'exécuter quelque chose et de vous déconnecter - exécutez-le dans tmux et détachez. La sortie de la commande sera mise en mémoire tampon, vous pourrez donc la consulter plus tard.

pour attacher automatiquement, vous pouvez ajouter quelque chose comme ci-dessous à .bashrc:

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

ou encore plus facile

tmux a 2>/dev/null

Il a une empreinte mémoire inférieure et une option IMHO globale bien meilleure / plus facile à utiliser.

Le raccourci méta-d est le mappage par défaut à détacher dans TMUX.

Alex
la source
0

screen -dAr default || screen -AS defaulttravaille pour moi. J'ajoute cela à mon ~ / .bashrc .

Expliquant brièvement les commutateurs:

  • d - Détachez l'écran s'il est toujours attaché à une autre session.
  • A - Adaptez les fenêtres de l'écran à la nouvelle taille du terminal.
  • r default - Attachez à un écran appelé par défaut.

Si la première commande d'écran (la précédente ||) échoue, la seconde est exécutée:

  • A - Comme expliqué ci-dessus ...
  • S default- Créez la nouvelle session d'écran avec le nom par défaut .
Batandwa
la source
0

Je suggère d'utiliser byobu . Cet outil utilise tmux et fournit une belle barre d'outils et d'autres fonctionnalités pratiques de changement de fenêtre, des raccourcis clavier, etc.

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

Avec ces commandes ci-dessus, après une connexion SSH réussie, le système essaie de se connecter à une session byobu-tmux existante, sinon il créera une nouvelle session.

Sandeep
la source