démarrer automatiquement l'écran lors de la connexion ssh

19

J'ai lu comment démarrer automatiquement un écran lorsque je me connecte sshà un serveur distant. Je voudrais un simple one-liner à ajouter à mon .bash_profilepour commencer screenlorsque je sshrentre et ne PAS quitter ma connexion à distance lorsque je détache l'écran.

Je suis à la recherche dans exec screenet à peu près toutes les combinaisons de -d, -r, -Det -Ret ne peut pas comprendre ce que j'ai besoin des drapeaux.

Idéalement, je taperais ssh whateveret serais connecté au serveur dans un nouveau screenou il pourrait rattacher un ancien écran, j'aimerais savoir comment faire les deux pour voir ce que je préfère. Ensuite, je peux soit taper Ctrl adou Ctrl det le faire me ramener à la sshconnexion normale pour ce serveur (où vous verriez le motd). De là, je peux screen -rrevenir dans l'écran que je veux, ou appuyer à Ctrl dnouveau pour me déconnecter.

Ronald Dregan
la source

Réponses:

19

Un simple screen -Rdevrait faire l'affaire.

Pour vérifier cela, j'ai ajouté screen -Rà mon .bash_profile sur un serveur distant, connecté, détaché de l'écran et j'ai été renvoyé à une invite de shell normale sur le serveur distant. Vérifié avec .bashrc également. Les connexions suivantes ont donné le résultat attendu (se rattacher à la session d'écran).

btanaka
la source
Merci! Je lisais autour et j'avais l'impression que j'aurais besoin d'un écran d'exécution -R. Heureux que cela ait fonctionné
Ronald Dregan
Est-ce une mauvaise idée de mettre logoutou exitjuste après cette ligne une session ssh est immédiatement terminée une fois que l'écran est fermé par ctrl + D?
Griddo
Cela n'a pas fonctionné pour moi. J'ai démarré quelques dizaines d'écrans depuis que la ligne est exécutée à chaque démarrage d'une session. Comment avez-vous fait pour que cela ne se produise pas?
Thomas
11

J'ai rencontré des problèmes avec la création de 40 sessions d'écran en cascade avec certaines des solutions lors du démarrage d'une nouvelle fenêtre ou session d'écran. J'ai pu éliminer l'écran en cascade et créer une nouvelle session s'il n'en existait pas avec ceci:

if [ -z "$STY" ]; then screen -R; fi

Il teste si vous êtes en session écran et s'exécute screen -Rsi vous ne l'êtes pas. Sans le test, vous obtenez le "Fixation de l'intérieur de l'écran?" avertissement de l'écran chaque fois que vous créez une nouvelle fenêtre d'écran.

seq3
la source
+1 - comme ça mieux que le screen -lstest que Tony a mentionné
cwd
10

screen -RR se rattachera à la première session disponible ou en créera une si nécessaire.

user1187902
la source
c'était très utile car l'utilisation de l'écran -R me causait des problèmes avec plusieurs sessions.
David V.
C'est génial, merci! Il se connecte à la première session "Détachée" trouvée (s'il y en a) et ignore les sessions attachées. Il vous permet donc de vous connecter et d'ouvrir plusieurs fenêtres, mais assurez-vous toujours que chaque session a la protection de s'exécuter sur un écran. Nos collaborateurs OPS vous remercient!
Ian McGowan
8

Si je comprends votre besoin, vous devriez essayer:

if $(screen -ls | grep -q pts); then screen -x; else screen -R; fi

Il ne créera qu'une seule session d'écran, sinon il se reconnectera à la session existante de manière multi-fenêtres (même si vous avez plusieurs sessions ssh, vous finirez par la même session d'écran)

Tony
la source
J'aime cette idée pour sa reconnaissance que nous avons des clients SSH multi-fenêtres (ou parfois nous connectons directement sur la machine). C'est assez flexible si vous utilisez quelque chose comme Bitvise et que plusieurs fenêtres de terminal sont ouvertes - vous pouvez transformer des fenêtres d'écran individuelles en fenêtres physiques distinctes.
Piku
1
Tout cela peut être remplacé par screen -xR, qui semble être analysé comme "attacher s'il y a quelque chose à attacher, sinon faire un nouvel écran".
Piskvor a quitté le bâtiment le
0

Voici une petite extension,

le script pour la vérification bashrc s'il y a plus d'une session d'écran détachée. S'il y en a plus, vous devez choisir la session manuellement. Quand il y a une session détachée, vous revenez à cette session. Si vous quittez la session, la session ssh se fermera également.

 #Start Screen
 if [ -z "$STY" ]; then

 value=$( screen -ls |grep '\<pts.*Detached\>' |wc -l )

 if [ $value -gt 1 ]; then

  screen -ls

 else

  screen -R

  echo 5 Sek. bis die SSH Session beendet wird.

  echo Strg + C - um ohne screen weiter zu arbeiten.

  sleep 6

  exit

 fi

fi
Thomas
la source
0

Si vous souhaitez vous connecter automatiquement à une session d'écran lorsque vous vous connectez via SSH, ajoutez le code ci-dessous à votre .bash_profileou à votre .bashrcsur votre machine distante, il:

  • Démarrez une nouvelle session d'écran chaque fois que vous vous connectez via SSH.
  • Réutilisez la session d'écran détaché déjà existante , en commençant toujours par la dernière. Si aucune session détachée n'est disponible, elle en démarre une nouvelle.
  • Lorsque vous ouvrez plusieurs connexions SSH à votre machine, vous obtiendrez une session d'écran différente car nous ne réutilisons que les connexions détachées.
  • Évitez les boucles si vous ajoutez le script à votre .bashrc

Voici le script:

#!/bin/bash
#
#  Attaches to the first Detached Screen. Otherwise starts a new Screen.

# Only run if we are not already inside a running screen and only if in an SSH session.
if [[ -z "${STY}" && ! -z "${SSH_CLIENT}" ]]; then
  detached_screens=($(screen -ls | grep pts | grep -v Attached))

  for screen in "${detached_screens[@]}"; do
    if [[ "${screen}" == *".pts"* ]]; then
      IFS='.pts' read -ra split <<< "${screen}"
      for id in "${split[@]}"; do
        first_id="${id}"
        break
      done 
      break
    fi
  done

  screen -R $first_id
fi

PS: Si vous souhaitez l'activer pour le terminal local, supprimez-le && ! -z "${SSH_CLIENT}sur la première ligne.

Nicolas Garnier
la source