1) Dans votre script SSH rc (~ / .ssh / rc), vous allez configurer un lien symbolique depuis un emplacement canonique vers le "courant" SSH_AUTH_SOCK. Voici comment je le fais dans 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 755 ~ / .ssh / rc). Le "test" sert simplement à empêcher une erreur de s'afficher si vous n'exécutez pas ssh-agent (c'est-à-dire que vous utilisez ssh sans -A). La seconde moitié de cette commande établit un lien symbolique dans un emplacement canonique qui se met à jour avec la "vraie" SSH_AUTH_SOCK au moment de la connexion. Ceci est indépendant de l'utilisation d'un shell dans ssh ou de l'appel direct d'une commande, fonctionne également avec "ssh -t 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 pour résoudre ce problème.
De plus, vous ne devriez pas utiliser "-v" avec ln dès que cela cassera 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]
2) Dans votre .screenrc, il vous suffit de remplacer le 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.
La solution initialement adaptée de ce post , qui ne fonctionne pas, mais a la bonne idée.
Je pense que cela fonctionne comme une simplification de la réponse de @ sandip-bhattacharya. Placez ceci dans votre
~/.bashrc
fichier et exécutez la commande d'exportation dans toutes les sessions d'écran en cours d'exécution.Cela se lit "si
$SSH_AUTH_SOCK
est un socket (-S
) et pas un lien symbolique (! -h
), créez un nouveau lien symbolique sur le chemin connu. Dans tous les cas, redéfinissezSSH_AUTH_SOCK
pour pointer sur le chemin connu.Les
! -h
évite la création d' une référence circulaire si vous exécutez cette opération plusieurs fois.De plus, si vous l'utilisez
byobu
, cela se fait automatiquement, sans avoir besoin de modifier de fichier de configuration.Le seul bogue que j’ai trouvé dans ce problème (qui l’
byobu
a aussi) est que si vous ouvrez une deuxième connexionssh -A
ou une autreForwardAgent
connexion, le premier socket sera écrasé et si vous fermez la deuxième connexion avant la première, vous perdrez votre seul bon socket.la source
tmux
aussi bien.~/.ssh/ssh_auth_sock_"$(hostname)"
pour votre lien symbolique. Il conservera des sockets d’authentification séparés pour chaque hôte."ssh -t some.machine screen -R" n’exécutera pas bash et ne lancera donc pas le script .bash_profile 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 :)
la source
Je pense que vous avez besoin d'autossh. Je l'utilise depuis des années et, combiné à l'écran, toutes mes sessions de terminal sont entièrement portables et transparentes. Je ferme simplement lappy, je me déplace vers un nouvel emplacement, 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
est la base ... Je ruby'd un script lil pour automatiser le processus dans mon .screenrc pour un hôte donné. (fait également mon transfert ssh, donc dans tous ces endroits différents je peux canaliser ma connexion via mes serveurs)
dans la distribution automatique, il devrait y avoir un programme appelé rscreen (et .. il y en a!)
Cela devrait aider avec les problèmes de ssh / screen
Enfin, afin de maintenir mon agent ssh en marche, j'utilise un trousseau, car je suis en quelque sorte une tête de shell ... Je pense que OSX a quelque chose de disponible pour garder votre agent dans les parages ...
la source
Voici la méthode que j'utilise:
Je configure habituellement un alias ou une fonction shell avec ces commandes:
Vous devrez peut-être adapter l'expression régulière ' écran - (r | DR) ' aux commandes exactes que vous utilisez pour rattacher votre écran.
Une mise en garde avec ma méthode: des problèmes peuvent survenir si une autre commande " écran " est exécutée sur l'ordinateur.
la source
sudo
.En règle générale, je maintiens des sessions à long terme (plus de 6 mois) sur mon lieu de travail sur différents serveurs. Il a donc été difficile de recoller de manière répétée et de disposer d'un agent de transmission ssh viable. Voici ce que j'ai mis en place sur mes systèmes:
Si je me connecte simplement au serveur distant sans démarrer / recoller l'écran, il y aura deux "sockets", l'un utilisé par l'
screen
autre et l'autre par le nouveau shell. Il ne devrait pas y avoir deux sessions de "démarrage", mais une deuxième session peut toujours être démarrée avecreattach -S new
; dans cette situation, l'agent serait partagé avec la~/.ssh/agent-screen
valeur. Pour récupérer un agent de transfert en état de fonctionnement, je me détache puis me reconnecte.X${USER} = Xmyusername
Cela garantit que le code ne sera pas appelésudo
sur le même serveur.la source
J'utilise une variante de ce que @apinstein utilise pour mon .bashrc .
Cela fonctionne pour toutes les applications en cours d'exécution dans ma session d'écran. Cela fonctionnerait pour tous les nouveaux shells de votre session screen. Pour les shells existants, vous devez exécuter
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
sur le shell hôte pour le faire fonctionner.PS Désolé de l'ajouter en tant que réponse indépendante, alors qu'il vient de s'appuyer sur la réponse de @ apinstein. Cela devait se faire car les commentaires dans stackoverflow ne supportent pas les blocs de code.
la source
J'ai essayé ce type de doublure simple, comme suggéré dans la page Faisons en sorte que des amis d'écran et de l'agent-ssh-agent fonctionnent et cela fonctionne pour moi.
Première connexion à Target.Nécessité d'une seule fois.
Lancer l'écran pour la première fois .. Il ne faut qu'une fois.
Si vous êtes déconnecté ou déconnecté, utilisez cette commande pour vous connecter ultérieurement afin de vous connecter à l'écran existant.
la source
Ce sont toutes de très bonnes réponses, je le fais légèrement différemment. Après avoir démarré une nouvelle session ssh et un nouvel écran, je réinitialise la
SSH_AUTH_SOCK
variable d’environnement en fonction du contenu de l’environnement root bash. Je n'ai besoin que de temps en temps d'un accès à ssh-agent lorsque j'utilise svn, alors je réinitialise simplement leSSH_AUTH_SOCK
si nécessaire dans ces shells.Ceci utilise le système de fichiers proc, il est donc spécifique à Linux. Je n’ai testé cela que sur une machine Linux sans tête à laquelle je n’accède que par moi; il faudra peut-être un peu de peaufinage pour que cela fonctionne sur d’autres environnements.
Pour réinitialiser SSH_AUTH_SOCK (cela pourrait être un alias).
screen_auth.sh ressemble à ceci
la source
Toutes les solutions ci-dessus souffrent de conditions de course (soit dans plusieurs sessions SCREEN, soit dans plusieurs connexions SSH). La seule solution universelle à laquelle je puisse penser est d’appliquer d’abord SSH_AUTH_SOCK au processus de serveur SCREEN
screen -r
, puis de le rentrer dans la session BASH avant chaque commande non intégrée interactive. Malheureusement, SCREEN et BASH ont été conçus sans prendre en compte ce type de problèmes, il est donc assez difficile de les implémenter correctement (même s’il n’est jamais tard de poster des demandes de fonctionnalités pour les deux projets). Ma tentative a été faite de surmonter ce problème pour les sessions BASH qui peut être trouvée ici:À installer:
$HOME/bin
, ajouter un bit exécutable;assurez-vous que cela
$HOME/bin
va avant/usr/bin
dans PATH:PATH = $ HOME / bin: $ PATH
ajoutez ceci à votre
.bashrc
:configuration $ HOME / bin / screen-helper
Vous pouvez maintenant essayer de créer une session SCREEN dans une session SSH, de détacher, de vous déconnecter, de vous connecter, de vous reconnecter et, espérons
ssh-add -l
-le, d’afficher correctement vos clés.la source
ssh-agent
démons permanents (comme suggéré ici, superuser.com/a/412052/376867 ) ne souffrent pas de la condition de course, mais souffrent du trousseau de clés périmé. Et ce qui est plus important, il n’est pas très sûr de laisser toutes vos clés sur l’hôte distant en même temps que la session écran (ou même plus longtemps jusqu’au redémarrage en cas de message mentionné).J'ai parcouru d'autres réponses sans pouvoir trouver la mienne. Voici ce que j'utilise. Créez un fichier
~/.screenrc-wrapper
avec le contenu suivant:Et ajoutez ceci à votre
~/.bashrc
(ou~/.zshrc
si vous utilisez ça):De cette façon, vous utiliseriez deux sessions d’écran - l’une est "wrapper" et l’autre est la session interne. Cela gardera ce dernier en vie même lorsque vous vous déconnectez et continuera à avoir ssh-agent. Une autre fonctionnalité intéressante est qu'il mémorisera votre configuration de fenêtre - si vous utilisez des fenêtres divisées, cela peut s'avérer très pratique.
Vous pouvez trouver cette fonctionnalité dans son contexte dans mes fichiers de points .
la source