57 votes

Comment faire pour que screen se connecte automatiquement à l'agent ssh actuel lorsqu'il se rattache à un screen existant ?

Si vous démarrez une session écran pendant que ssh-agent est en cours d'exécution (à partir de ssh -A agent forwarding), l'accès à ssh-agent fonctionne bien. Cependant, si vous vous détachez de cette session, que vous vous déconnectez, que vous vous reconnectez (avec le transfert de ssh-agent) et que vous vous reconnectez à votre session écran, l'accès à ssh-agent ne fonctionne pas.

Comment peut-on y remédier ?

46voto

Nick Ludlam Points 836
  1. Dans votre rc SSH script (~/.ssh/rc) vous allez mettre en place un lien symbolique depuis un emplacement canonique vers le SSH_AUTH_SOCK "actuel". Voici comment je le fais en bash (contenu de ~/.ssh/rc) :

     #!/bin/bash
     if test "$SSH_AUTH_SOCK" ; then
         ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
     fi

(et assurez-vous de chmod 750 ~/.ssh/rc ). Le "test" est juste pour éviter qu'une erreur ne s'affiche si vous n'exécutez pas ssh-agent (c'est-à-dire que vous utilisez ssh sans -A ). La seconde moitié de cette commande met en place un lien symbolique dans un emplacement canonique qui se met à jour avec le "vrai" lien. SSH_AUTH_SOCK au moment de la connexion. Ceci est indépendant de l'utilisation d'un Shell dans ssh ou de l'appel d'une commande directement, fonctionne aussi avec ssh -t <host> screen -RRD .

Remarque : l'existence de ~/.ssh/rc modifie le comportement de sshd. Notamment, il n'appellera pas xauth. Voir man sshd pour plus d'informations, et comment corriger cela.

De plus, vous ne devriez pas utiliser "-v" avec ln car cela interrompra rsync-over-ssh avec les diagnostics suivants :

$ rsync -n addr.maps.dev.yandex.net: .
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(173) [Receiver=3.0.7]
  1. Dans votre .screenrc, il vous suffit de remplacer le paramètre SSH_AUTH_SOCK par l'emplacement canonique :

     setenv SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock

Notez que vous utilisez setenv quel que soit le Shell que vous utilisez ; je pense que setenv est la syntaxe de l'écran, pas le Shell.

Solution adaptée à l'origine de ce poste qui ne fonctionne pas, mais qui a la bonne idée.

28voto

Dave Morgan Points 627

Je pense que cela fonctionne comme une simplification de la réponse de @sandip-bhattacharya. Mettez ceci dans votre ~/.bashrc et exécutez la commande d'exportation dans toutes les sessions d'écran en cours.

if [ -S "$SSH_AUTH_SOCK" ] && [ ! -h "$SSH_AUTH_SOCK" ]; then
    ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock

On y lit "si $SSH_AUTH_SOCK est un socket ( -S ) et non un lien symbolique ( ! -h ), créer un nouveau lien symbolique au chemin connu. Dans tous les cas, redéfinissez SSH_AUTH_SOCK pour pointer vers le chemin connu.

En ! -h évite de créer une référence circulaire si vous exécutez cette opération plusieurs fois.

De même, si vous utilisez byobu Il le fait automatiquement, sans qu'il soit nécessaire de modifier un quelconque fichier de configuration.

Le seul bogue que j'ai trouvé dans cette ( byobu l'a aussi) est que si vous ouvrez une deuxième ssh -A ou ForwardAgent Si vous fermez la deuxième connexion avant la première, vous perdrez votre seule bonne prise.

4voto

"ssh -t some.machine screen -R" ne lancera pas bash et donc ne lancera pas le .bash_profile script où le lien symbolique est créé.

Vous pouvez essayer : ssh -t some.machine bash -c "screen -R"

(en supposant que vous utilisez bash comme Shell bien sûr)

Edit : Cette "réponse" est en fait un commentaire sur la première réponse donnée ci-dessus :)

3voto

devforall Points 1141

Je pense que vous avez besoin d'autossh. Je l'utilise depuis des années maintenant, et combiné avec screen, il rend toutes mes sessions de terminal complètement portables et transparentes. Je ferme simplement lappy, je me déplace vers un nouvel emplacement, j'ouvre lappy et tous mes écrans et écrans imbriqués se connectent automatiquement. Je n'y pense même plus.

http://www.linux.com/archive/feature/134133

c'est les bases... J'ai ruby'd up un lil script pour automatiser le processus dans mon .screenrc pour un hôte donné. (il fait aussi mon ssh forwarding, donc dans tous ces endroits différents je peux tunneliser ma connexion à travers mes serveurs)

dans la distro autossh il devrait y avoir un programme appelé rscreen ( et il y en a un !)

#!/bin/sh                                                                       
#
# sample script to use autossh to open up a remote screen
# session, or reconnect to an existing one. 
#
# $Id: rscreen,v 1.4 2002/05/07 17:54:13 harding Exp $
#
if [ "X$1" = "X" ]; then
    echo "usage: `basename $0` <host>"
    exit 1
fi

if [ "X$SSH_AUTH_SOCK" = "X" ]; then
    eval `ssh-agent -s`
    ssh-add $HOME/.ssh/id_rsa
fi

#AUTOSSH_POLL=600
#AUTOSSH_PORT=20000
#AUTOSSH_GATETIME=30
#AUTOSSH_LOGFILE=$HOST.log
#AUTOSSH_DEBUG=yes 
#AUTOSSH_PATH=/usr/local/bin/ssh
export AUTOSSH_POLL AUTOSSH_LOGFILE AUTOSSH_DEBUG AUTOSSH_PATH AUTOSSH_GATETIME 

autossh -M 20004 -t $1 "screen -e^Zz -D -R"

Cela devrait aider à résoudre les problèmes de ssh/écran

Enfin, pour maintenir mon agent ssh en fonctionnement, j'utilise le trousseau de clés, car je suis un peu une tête de Shell... Je pense que OSX a quelque chose de disponible pour garder votre agent autour ...

3voto

Farzy Points 39

Voici la méthode que j'utilise :

SOCK=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep SSH_AUTH_SOCK) ; eval $SOCK ; export SSH_AUTH_SOCK
DISP=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep DISPLAY) ; eval $DISP ; export DISP

J'ai l'habitude de mettre en place un alias ou une fonction Shell avec ces commandes :

function ssh-screen-auth() {
  SOCK=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep SSH_AUTH_SOCK)
  eval $SOCK
  export SSH_AUTH_SOCK
  DISP=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep DISPLAY)
  eval $DISP
  export DISPLAY
}

Vous devrez peut-être adapter l'expression régulière ' écran -(r|DR) ' aux commandes exactes que vous utilisez pour rattacher votre écran.

  • La première ligne lit le SSH_AUTH_SOCK dans l'espace de processus du " écran -r " que vous venez de taper et met à jour la valeur dans votre Shell actuelle.
  • La deuxième ligne est nécessaire si vous utilisez " ssh -X "pour transmettre les connexions X11 : il met à jour le fichier DISPLAY de la même manière.

Un bémol à ma méthode : les choses peuvent mal tourner s'il y a un autre " écran La commande " " qui fonctionne sur l'ordinateur.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X