1) In Ihrem SSH rc-Skript (~ / .ssh / rc) richten Sie eine symbolische Verbindung von einem kanonischen Speicherort zum "aktuellen" SSH_AUTH_SOCK ein. So mache ich es in Bash (Inhalt von ~ / .ssh / rc):
#!/bin/bash
if test "$SSH_AUTH_SOCK" ; then
ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi
(und stellen Sie sicher, 755 ~ / .ssh / rc zu chmod). Der "Test" soll nur verhindern, dass ein Fehler angezeigt wird, wenn Sie nicht ssh-agent ausführen (dh Sie ssh ohne -A). Die zweite Hälfte dieses Befehls richtet einen Symlink an einem kanonischen Speicherort ein, der sich beim Anmelden auf den "echten" SSH_AUTH_SOCK aktualisiert. Dies ist unabhängig von der Verwendung einer Shell in ssh oder dem direkten Aufruf eines Befehls und funktioniert auch mit "ssh -t screen -RRD".
Hinweis: Die Existenz von ~ / .ssh / rc ändert das Verhalten von sshd. Insbesondere wird xauth nicht aufgerufen. Weitere Informationen finden Sie unter man sshd.
Außerdem sollten Sie "-v" nicht mit ln verwenden, sobald es rsync-over-ssh mit folgender Diagnose unterbricht:
$ 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) In Ihrem .screenrc müssen Sie nur SSH_AUTH_SOCK an der kanonischen Position überschreiben:
setenv SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
Beachten Sie, dass Sie setenv unabhängig von der verwendeten Shell verwenden. Ich denke, dass setenv Bildschirmsyntax ist, nicht die Shell.
Lösung ursprünglich aus diesem Beitrag angepasst , die nicht funktioniert, aber die richtige Idee hat.
Ich denke, dass dies eine Vereinfachung der Antwort von @ sandip-bhattacharya ist. Fügen Sie dies in Ihre
~/.bashrc
Datei ein und führen Sie den Exportbefehl in allen derzeit ausgeführten Bildschirmsitzungen aus.Dies lautet "Wenn
$SSH_AUTH_SOCK
es sich um einen Socket (-S
) und nicht um eine symbolische Verknüpfung (! -h
) handelt, erstellen Sie eine neue symbolische Verknüpfung auf dem bekannten Pfad. Definieren Sie in allen Fällen neuSSH_AUTH_SOCK
, um auf den bekannten Pfad zu verweisen.Das
! -h
vermeidet das Erstellen eines Zirkelverweises, wenn Sie diesen mehrmals ausführen.Wenn Sie dies verwenden
byobu
, wird dies auch automatisch durchgeführt, ohne dass Konfigurationsdateien bearbeitet werden müssen.Der einzige Fehler, den ich darin gefunden habe (
byobu
hat es auch), ist, wenn Sie eine Sekunde öffnenssh -A
oder eineForwardAgent
Verbindung herstellen, die den ersten Socket überschreibt, und wenn Sie die zweite Verbindung vor der ersten schließen, verlieren Sie Ihren einzigen guten Socket.quelle
tmux
auch.~/.ssh/ssh_auth_sock_"$(hostname)"
für Ihren Symlink. Es werden separate Authentifizierungssockets für jeden Host eingerichtet."ssh -t some.machine screen -R" führt bash nicht aus und führt daher nicht das Skript .bash_profile aus, in dem der Symlink erstellt wird.
Sie könnten versuchen: ssh -t some.machine bash -c "screen -R"
(vorausgesetzt, Sie verwenden bash als Shell)
Edit: Diese "Antwort" ist eigentlich ein Kommentar zu der ersten oben gegebenen Antwort :)
quelle
Ich denke du brauchst Autossh. Ich benutze es seit Jahren und in Kombination mit dem Bildschirm werden alle meine Terminalsitzungen vollständig portabel und transparent. Ich schließe lappy einfach, gehe an einen neuen Ort, öffne lappy und alle meine Bildschirme und verschachtelten Bildschirme verbinden sich automatisch. Ich denke nicht einmal mehr darüber nach.
http://www.linux.com/archive/feature/134133
ist die Grundlagen ... Ich habe ein kleines Skript erstellt, um den Prozess in meinem .screenrc für einen bestimmten Host zu automatisieren. (Tut auch meine SSH-Weiterleitung, so dass ich an all diesen verschiedenen Orten meine Verbindung über meine Server tunneln kann.)
in der autossh Distribution sollte es ein Programm namens rscreen geben (und .. da ist es!)
Dies sollte bei Problemen mit ssh / screen helfen
Um meinen ssh-Agenten am Laufen zu halten, verwende ich schließlich den Schlüsselbund, da ich eine Art Shell-Kopf bin ... Ich denke, OSX hat etwas, das Ihren Agenten am Laufen hält ...
quelle
Hier ist die Methode, die ich benutze:
Normalerweise richte ich mit diesen Befehlen einen Alias oder eine Shell-Funktion ein:
Möglicherweise müssen Sie den regulären Ausdruck ' screen - (r | DR) ' an die genauen Befehle anpassen, die Sie zum erneuten Anschließen Ihres Bildschirms verwenden.
Eine Einschränkung bei meiner Methode: Wenn auf dem Computer ein anderer " Bildschirm " -Befehl ausgeführt wird, können Probleme auftreten.
quelle
sudo
.Ich halte normalerweise längerfristige (6+ Monate) Sitzungen an meinem Arbeitsplatz auf verschiedenen Servern ab. Daher war es problematisch, immer wieder einen SSH-Spediteur anzuschließen und zu haben. Das habe ich auf meinen Systemen eingerichtet:
Wenn ich mich nur beim Remote-Server anmelde, ohne den Bildschirm zu starten / neu zu verbinden, werden zwei "Sockets" angezeigt,
screen
einer von der neuen Shell und einer von der neuen Shell. Es sollten keine zwei "Start" -Sitzungen stattfinden, aber eine zweite Sitzung kann noch gestartet werdenreattach -S new
. In diesem Fall wird der Agent mit dem~/.ssh/agent-screen
Wert geteilt. Um einen funktionierenden Weiterleitungsagenten wieder herzustellen, würde ich mich abmelden und wieder anmelden. Dadurch wirdX${USER} = Xmyusername
sichergestellt, dass der Code nichtsudo
auf demselben Server aufgerufen wird .quelle
Ich verwende eine Variante dessen, was @apinstein für meinen .bashrc verwendet .
Dies funktioniert für alle Apps, die in meiner Bildschirmsitzung ausgeführt werden. Dies würde für alle neuen Shells in Ihrer Bildschirmsitzung funktionieren. Für vorhandene Shells müssen Sie
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
die Host-Shell ausführen , damit sie funktioniert.PS Es tut mir leid, dass Sie dies als unabhängige Antwort hinzugefügt haben, obwohl es nur auf der Antwort von @apinstein aufbaut. Musste dies tun, da Kommentare im Stackoverflow keine Codeblöcke unterstützen.
quelle
Ich habe diesen einfachen Einzeiler ausprobiert, wie auf " Lass uns Freunde für Bildschirm und SSH-Agent werden" vorgeschlagen. Er funktioniert für mich.
Erstmalige Anmeldung bei Target. Muss nur einmal durchgeführt werden.
Bildschirm zum ersten Mal starten. Muss nur einmal ausgeführt werden.
Wenn die Verbindung getrennt oder getrennt wurde, melden Sie sich mit diesem Befehl an, um eine Verbindung zum Ausgangsbildschirm herzustellen.
quelle
Das sind alles wirklich gute Antworten, ich mache es etwas anders. Nachdem ich eine neue SSH-Sitzung gestartet und den Bildschirm erneut angefügt habe, setze ich die
SSH_AUTH_SOCK
Umgebungsvariable basierend auf dem Inhalt der Root-Bash-Umgebung zurück. Ich benötige nur gelegentlich ssh-agent-Zugriff, wenn ich svn verwende. Deshalb setze ich dasSSH_AUTH_SOCK
in diesen Shells erforderliche zurück.Dies verwendet das Proc-Dateisystem, ist also Linux-spezifisch. Ich habe dies nur auf einer kopflosen Linux-Box getestet, auf die nur ich zugreifen kann. Möglicherweise müssen einige Anpassungen vorgenommen werden, damit es in anderen Umgebungen funktioniert.
Zum Zurücksetzen von SSH_AUTH_SOCK (dies könnte zu einem Alias gemacht werden).
screen_auth.sh sieht so aus
quelle
Alle oben genannten Lösungen leiden unter Rennbedingungen (entweder in mehreren SCREEN-Sitzungen oder in mehreren SSH-Verbindungen). Die einzige universelle Lösung, die ich mir vorstellen kann, ist, zuerst SSH_AUTH_SOCK an den SCREEN-Serverprozess zu senden
screen -r
und ihn dann vor jedem interaktiven, nicht eingebauten Befehl in die BASH-Sitzung zu ziehen. Leider wurden SCREEN und BASH ohne Kenntnis derartiger Probleme entwickelt, so dass eine ordnungsgemäße Implementierung ziemlich schwierig ist (obwohl es nie zu spät ist, Feature-Anfragen an beide Projekte zu senden). Ich habe versucht, dieses Problem für BASH-Sitzungen zu lösen, die hier zu finden sind:Installieren:
$HOME/bin
und fügen Sie ein ausführbares Bit hinzu.stellen Sie sicher , dass
$HOME/bin
vor geht/usr/bin
in PFAD:PATH = $ HOME / bin: $ PATH
füge dies zu deinem hinzu
.bashrc
:source $ HOME / bin / screen-helper setup
Jetzt können Sie versuchen, eine SCREEN-Sitzung in einer SSH-Sitzung zu erstellen, die Verbindung zu trennen, die Verbindung herzustellen und erneut herzustellen, und hoffentlich
ssh-add -l
sollten Ihre Schlüssel korrekt angezeigt werden.quelle
ssh-agent
Daemon (wie hier vorgeschlagen superuser.com/a/412052/376867 ) nicht unter Rennbedingungen leidet, sondern unter einem veralteten Schlüsselring. Und was noch wichtiger ist, es ist nicht sehr sicher, alle Ihre Schlüssel zusammen mit der Bildschirmsitzung auf dem Remote-Host zu belassen (oder sogar länger, bis sie bei dem genannten Beitrag neu gestartet werden).Ich überflog andere Antworten und konnte meine nicht finden. Hier ist was ich benutze. Erstellen Sie eine Datei
~/.screenrc-wrapper
mit folgendem Inhalt:Und füge dies zu deinem hinzu
~/.bashrc
(oder~/.zshrc
wenn du das verwendest):Auf diese Weise würden Sie zwei Bildschirmsitzungen verwenden - eine ist "Wrapper" und eine ist die innere. Dadurch bleibt Letzteres auch dann am Leben, wenn Sie sich abmelden, und ssh-agent wird weiterhin aktiviert. Ein weiteres nettes Feature ist, dass es sich an Ihre Fensterkonfiguration erinnert - wenn Sie geteilte Fenster verwenden, kann es sehr praktisch sein.
Sie finden diese Funktion im Kontext in meinen Punktedateien .
quelle