web-dev-qa-db-fra.com

Se reconnecter automatiquement (ou plus facilement) à une session écran après une interruption du réseau

AJOUTÉ: Cette question est maintenant, je crois, subsumée par celle-ci: tilisation de GNU Écran complètement transparent et automatique

Voir aussi cette question connexe:
https://superuser.com/questions/147873/ssh-sessions-in-xterms-freeze-for-many-minutes-whenever-they-disconnect

Question d'origine:

Ce serait bien s'il y avait un moyen de ssh vers une machine et de se reconnecter immédiatement à une session d'écran spécifique. Tu peux le faire:

laptop> ssh server.com screen -ls

et il affichera une liste d'écrans disponibles sur server.com comme ceci [1]:

123.pts-1
456.pts-2

Et puis vous pourriez essayer de faire ceci:

laptop> ssh server.com screen -dr pts-2

mais cela échoue, en disant "Doit être connecté à un terminal." Vous devez d'abord ssh puis faire le "screen -dr pts-2" sur server.com, ce qui n'est pas bon si vous avez une connexion instable et que vous êtes souvent déconnecté. Vous voulez pouvoir reprendre avec une simple "flèche vers le haut" sur l'ordinateur portable. (Ou peut-être le rendre encore plus automatique.)

J'ai une solution irréfléchie à ce problème que je posterai comme réponse et j'espère qu'elle sera rejetée à l'oubli en faveur de la bonne façon de traiter cela.


[1] Ou mieux, si vous avez créé les sessions d'écran avec des noms comme "screen -S foo" et "screen -S bar ", vous obtiendrez une liste plus conviviale du type:

123.foo
456.bar

et peut se reconnecter avec, par exemple, "screen -dr foo ".


Mini tutoriel écran, intégrant la réponse à cette question:

Connectez-vous à server.com et faites

screen -S foo 

puis ne vous déconnectez plus de cette session. Pour vous reconnecter ailleurs, faites

ssh -t server.com screen -dr foo

Pour répertorier les écrans disponibles pour vous reconnecter:

screen -ls

ou bien sûr

ssh server.com screen -ls

pour vérifier à distance les écrans disponibles de server.com.

J'utilise maintenant l'alias suivant (tcsh), basé sur la réponse de Jason ci-dessous, pour me connecter à un écran nommé s'il existe ou créer et me connecter autrement:

alias ssc 'ssh -t \!:1 "screen -S \!:2 -dr || screen -S \!:2"'
55
dreeves

Est-ce que le -t option faites ce que vous voulez?

 -t Force l'allocation de pseudo-tty. Cela peut être utilisé pour exécuter des programmes basés sur l'écran arbi - 
 Trary sur une machine distante, ce qui peut être très 
 Très utile, par ex. lors de la mise en œuvre des services de menu. Plusieurs options -t 
 Forcent l'allocation de tty, même si ssh n'a pas de tty local. 

Alors:

laptop> ssh -t server.com screen -dr pts-2

Cela semble fonctionner dans mon installation.

58
Greg Hewgill

Utilisez le -t option à ssh pour allouer un terminal tout en exécutant directement une commande.

laptop> ssh -t server.com screen -dr pts-2
2
Douglas Leeder

J'ai travaillé sur quelque chose de similaire mais je n'y suis pas encore parvenu, vos solutions ont résolu mon problème alors voici ma suggestion:

ssh -t server.com "screen -S foo -rd || screen -S foo"

Cela essaie juste d'ouvrir l'écran existant nommé foo et s'il n'existe pas, le crée. Je vais mettre cela dans un lanceur sur mon ordinateur portable, donc lorsque le réseau sans fil disparaît, je peux simplement ouvrir là où je me suis arrêté.

Je viens de remarquer que l'écran par défaut Shell est un peu faible, donc une amélioration qui configure un peu mieux votre environnement domestique est:

ssh -t server.com "screen -S foo -rd || screen -S foo bash -l"
2
Jason

Si vous aimez vous connecter à la même session, même si elle est active, détachée ou n'existe pas encore:

ssh -t user @ server screen -xR screenName

La même chose mais créez une nouvelle session si elle est déjà active sur un autre pty:

ssh -t user @ server screen -rR screenName

1
Oguz

J'ai converti ceci pour travailler sur OS X .bash_profile avec un ajout: Si aucun 2ème paramètre n'est donné, il démarrera une session "par défaut".

function ssc() {
    if [[ -z $2 ]]; then
        screen="default"
    else
        screen=$2
    fi
    ssh -t $1 "screen -S $screen -dr || screen -S $screen"
}
1
udondan