Est-ce une bonne idée de mettre "screen -r" dans mon .bashrc?

17

Je voudrais utiliser screen pour garder les sessions ssh actives sur mon serveur. Ce serait bien si je pouvais reprendre automatiquement toute session en cours d'exécution pour mon utilisateur lorsque je me connecte. La façon simple de le faire serait d'ajouter "screen -r" à mon .bashrc, et cela semble fonctionner correctement. Je me demande simplement si cela cassera quoi que ce soit dans des conditions que je n'ai pas encore testées. Toute personne ayant de l'expérience ici qui peut me dire si c'est ce que je dois faire?

marcusw
la source

Réponses:

20

Vous devez screen -R -dà la fois vous attacher automatiquement à une session existante s'il en existe une et créer une session dans le cas contraire.

Assurez-vous de ne le faire que sur des shells interactifs . Bash sources ~/.bashrcmême pour les shells non interactifs lorsque son processus parent est rshd ou sshd (cela est mentionné dans la documentation, mais il est facile de le manquer). Vous pouvez dire qu'un shell est interactif car $-contient i.

case $- in
  *i*) screen -Rd;;
esac

Cela ne vous permettra pas facilement d'exécuter différentes sessions d'écran dans différents terminaux.

Vous devrez vous détacher de l'écran, puis quitter le shell parent pour vous déconnecter. Cela peut être résolu en utilisant exec screenau lieu de screen.

Si vous démarrez un shell autre qu'un shell de connexion, vous serez mis à l'écran, ce qui n'est pas ce que vous voudriez la plupart du temps. Je limiterais au moins cela à lorsque vous exécutez directement dans une session ssh interactive, avec quelque chose comme ce qui suit dans votre ~/.bash_profile:

case "/$(ps -p $PPID -o comm=)" in
  */sshd) screen -R -d;;
esac

Soyez prudent lorsque vous faites des choses complexes avec votre .bashrccar une erreur entraînant la fermeture du shell rendrait la connexion difficile.


Ce que je recommande est de ne pas modifier vos fichiers d'initialisation du shell sur le serveur, mais d'exécuter l'écran explicitement à partir du client, comme dans

ssh -t host.example.com screen -R -d

(Vous créeriez probablement un alias shell ou un raccourci d'environnement de bureau sur le client.) De cette façon, vous pouvez facilement choisir de ne pas exécuter l'écran, spécifier un autre nom de session, etc.

Gilles 'SO- arrête d'être méchant'
la source
Parfait. Devrait être dans la page de manuel.
marcusw
N'est-il pas préférable que ssh s'exécute screen -D -Rou même screen -D -RR?
niutech
2

Vos scripts de démarrage du serveur X démarrent souvent un nouveau shell, par exemple si vous vous connectez en utilisant gdm en utilisant la "Session définie par l'utilisateur".

Je pense que tout ce qui ne se ferme pas pourrait bloquer votre démarrage X. Cela comprendrait screen -r.

Mikel
la source
Les scripts de démarrage du serveur X ne s'exécuteront pas .bashrc. Mais il y a d'autres circonstances où cela pourrait être un problème, par exemple lors de l'exécution ssh host.example.com somecommand(étrangement, bash s'exécute .bashrcalors).
Gilles 'SO- arrête d'être méchant'
C'est sur certaines distributions si vous choisissez "Session définie par l'utilisateur". Sur Ubuntu, il source explicitement .profile, d'autres appellent .xsession depuis l'intérieur d'un shell de connexion, ce qui signifie généralement .bash_profile, et la plupart des utilisateurs source .bashrc depuis l'intérieur de leur .bash_profile.
Mikel