Gibt es eine bequeme Möglichkeit, um sicherzustellen, dass alle Anmeldungen eines bestimmten Benutzers (dh ich) denselben ssh-Agenten verwenden? Ich habe ein Skript gehackt, damit dies die meiste Zeit funktioniert, aber ich habe die ganze Zeit vermutet, dass es einen Weg gibt, den ich gerade verpasst habe. Darüber hinaus gab es seitdem erstaunliche Fortschritte in der Computertechnologie, wie zum Beispiel diese Website.
Das Ziel hier ist also das
- Jedes Mal, wenn ich mich in der Box anmelde, egal ob über SSH oder in einer grafischen Sitzung, die von gdm / kdm / etc aus gestartet wurde, oder an einer Konsole:
- Wenn für meinen Benutzernamen derzeit kein Programm
ssh-agent
ausgeführt wird, wird eines gestartet, die Umgebungsvariablen werden exportiert undssh-add
aufgerufen. - Andernfalls werden die Koordinaten des vorhandenen Agenten in die Umgebungsvariablen der Anmeldesitzung exportiert.
- Wenn für meinen Benutzernamen derzeit kein Programm
Diese Funktion ist besonders dann nützlich, wenn die betreffende Box als ssh
Relaispunkt beim Einstecken in eine dritte Box verwendet wird. In diesem Fall müssen Sie die Passphrase des privaten Schlüssels nicht jedes Mal eingeben, wenn Sie sshen, und möchten dann beispielsweise git push
etwas tun oder so.
Das unten angegebene Skript erledigt dies größtenteils zuverlässig, obwohl es kürzlich verpfuscht wurde, als X abstürzte und ich dann eine weitere grafische Sitzung startete. In diesem Fall könnte eine andere Verrücktheit vor sich gegangen sein.
Hier ist mein schlechtes Skript. Ich beziehe das von meinem .bashrc
.
# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.
mkdir -p "$HOME/etc/ssh";
function ssh-procure-launch-agent {
eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
ssh-add;
}
if [ ! $SSH_AGENT_PID ]; then
if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`;
if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
# in this case the agent has already been launched and we are just attaching to it.
##++ It should check that this pid is actually active & belongs to an ssh instance
export SSH_AGENT_PID;
SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
else
# in this case there is no agent running, so the socket file is left over from a graceless agent termination.
rm ~/etc/ssh/ssh-agent-socket;
ssh-procure-launch-agent;
fi;
else
ssh-procure-launch-agent;
fi;
fi;
Sagen Sie mir bitte, dass es einen besseren Weg gibt, dies zu tun. Bitte wählen Sie auch nicht die Inkonsistenzen / Gaffes aus (zB das Einfügen von var
Sachen etc
); Ich habe das vor einiger Zeit geschrieben und seitdem viel gelernt.
Antworten:
Ich könnte genauso gut meine eigene Variation in den Mix werfen:
Und jedes Mal, wenn ich mich anmelde, tippe ich einfach ein , wenn ich möchte, dass ein Agent angehängt wird (was nicht immer der Fall ist )
sagent
.quelle
if [ ! -x "$(which ssh-add)" ];
sollte durchif ! which ssh-add;
oder ersetzt werdenif ! command -v ssh-add
. (Denken Sie daran,[
ist nur ein Befehl)if ! which ssh-add > /dev/null
zu verhindern, dass der Pfad gedruckt wird. An diesem Punkt bin ich mir nicht sicher, ob es klarer ist, obwohl ich nehme an, dass Sie dadurch einen zusätzlichen Befehlsaufruf sparen.ssh -A [user@]remotehost
Ich denke, das könnte das sein, wonach Sie suchen. Verwenden Sie die Option -A, wenn Sie ssh ausführen und Ihren ssh-agent weiterleiten. Hier ist ein Anwendungsfall:
Ich habe einen Remote-Server, auf dem sich einige Git-Repos befinden, und ein Remote-Server zeigt auf Github. Ohne einen SSH-Agenten, der in einer Bildschirmsitzung ausgeführt wird, muss ich die Passphrase für meinen Schlüssel eingeben, um einen "Git-Pull-Origin-Master" zu erstellen. Booo! Außerdem muss mein privater Schlüssel auf dem Remote-Server installiert sein - mehr Boooo!
Stattdessen benutze
ssh -A [user@]remotehost
ich einfach Pässe entlang meines lokal laufenden ssh-Agenten. Jetzt brauche ich meinen privaten Schlüssel nicht mehr, um überhaupt auf dem Remote-Host zu existieren. Ich glaube nicht, dass Sie mit ssh-agent überhaupt Skripte erstellen müssen.quelle
man 5 ssh_config
für dieForwardAgent
Konfigurationseinstellung. Es ermöglicht standardmäßig das Agent - Forwarding, wodurch die Notwendigkeit für das Entfernen-A
Argument. Beachten Sie vor der Verwendung der Agentenweiterleitung, dass ein Sicherheitsrisiko besteht, durch das andere privilegierte Benutzer auf dem Remotecomputer auf den weitergeleiteten Agenten-Socket zugreifen können. Dies wird auch auf der Manpage erwähnt. Dies wird hier gut erklärt .Hier ist eine ziemlich nette, die auch in Cygwin funktioniert:
Fügen Sie es Ihrem .bash_profile oder .bashrc hinzu
Quelle: http://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
quelle
${SSH_ENV}
muss sein,"${SSH_ENV}"
wenn Ihr Windows-Benutzername ein Leerzeichen enthältVersuchen Sie es mit Schlüsselbund, es ist dafür gemacht. http://www.gentoo.org/doc/en/keychain-guide.xml
quelle
Ich habe vor kurzem begonnen mit:
https://github.com/ccontavalli/ssh-ident
Alles was ich tun muss, ist hinzuzufügen:
In meiner .bashrc-Datei. Das Skript kümmert sich um:
quelle
Ich ziehe es vor, die Dinge so einfach wie möglich zu halten: (Ausschnitt aus
~/.profile
)Ich habe vorher nicht daran gedacht, es zu benutzen
-a
, aber es könnte einfacher sein:quelle
In meinem Fall habe ich Posh-Git in PowerShell eingerichtet und wollte, dass Cygwin denselben ssh-Agenten verwendet. Ich musste einige Pfadmanipulationen durchführen, da sie unterschiedliche tmp-Ordner verwendeten und die erstellte .env-Datei UTF16 mit BOM und CR \ LF war, so dass es Spaß machte, damit umzugehen. Das Hinzufügen des Folgenden zu der von Cygwin verwendeten .bashrc sollte funktionieren:
quelle
Nochmals ein Beispiel, um Ihr .bash_profile sofort einzutragen und Ihren Standardschlüssel bei der Anmeldung hinzuzufügen. Die Weiterleitung war in meinem Fall keine Option.
quelle
Dies ist meine Lösung, angepasst von https://superuser.com/a/141233/5255 (in diesem Thread):
quelle
Erstelle die Datei ~ / ssh-agent.sh
Fügen Sie die Datei in .bashrc ein
quelle
Dies ist etwas, das ich hinzugefügt habe und das für mich funktioniert. Zuerst wird geprüft, ob ein Agent ausgeführt wird. Wenn ja, werden die entsprechenden Umgebungen festgelegt, wenn nicht, wird er erstellt. Außerdem wird das Erstellen zusätzlicher Agenten vermieden:
Legen Sie es einfach in Ihren
.bashrc
quelle
Ich habe auch eine Variation dieses Problems, die direkt aus meiner .bashrc-Datei stammt:
Diese Lösung speichert eine Kopie der SSH-Agenteninformationen in Ihrem Ausgangsverzeichnis. Wenn Sie über ein NFS-automounted-Ausgangsverzeichnis verfügen, das möglicherweise von mehreren Hosts gemeinsam genutzt wird, wird der Hostname als Teil des Dateinamens verwendet, um zwischen diesen zu unterscheiden. Wenn Sie sich also von einem Computer aus anmelden, wird die auf einem anderen verwendete Agentendatei nicht überlastet.
Verhalten:
1) Erstbenutzersitzungen werden zur Eingabe einer Passphrase aufgefordert.
2) Die zweite, dritte und vierte Sitzung (usw.) erben den SSH-Agenten und die Schlüssel, die in der ersten hinzugefügt wurden.
3) Wenn der Agent getötet wird oder abstürzt, erstellt die erste nachfolgende Sitzung einen neuen Agenten, überschreibt die Agentendatei mit der neuen und fordert Sie zur erneuten Eingabe einer Passphrase auf. Nachfolgend erstellte Sitzungen verhalten sich wie Szenario 2), solange der neue SSH-Agent ausgeführt wird.
quelle
(Dies bezieht sich auf den Beitrag 2 höher, ich konnte keinen Kommentar hinzufügen)
@raghavan: Ihr Beispiel ist nützlich, aber es empfiehlt sich, die beiden vorhandenen Zeilen zu ändern
pgrep ssh-agent
zu
pgrep -u $ USER ssh-agent> / dev / null
Damit werden nur Agenten gefunden, die unter dem aktuellen Benutzer ausgeführt werden, und die PID wird nicht auf dem Bildschirm wiedergegeben (Bereinigung).
Empfiehlt sich auch, $ HOME / ssh-agent.out in $ HOME / .ssh-agent.out zu ändern
Grüße
quelle
Ich habe Ihre ursprüngliche Lösung und eine Reihe der vorgeschlagenen Lösungen gelesen, mich jedoch entschlossen, den Prozess für meinen eigenen Gebrauch zu vereinfachen. Das habe ich in meiner eigenen .bashrc hinzugefügt:
Ich habe hier ein paar Annahmen getroffen:
Alles in allem fühlt es sich nach einer einfachen Lösung an.
quelle
Ich stellte fest, dass häufig mehrere
ssh-agent
Prozesse ausgeführt wurden und dass die PID im Socket-Dateinamen nie mit der PID einer Ausführung übereinstimmte. Daherssh-agent
habe ich anhand zahlreicher Beispiele oben versucht, mich von diesen Bedingungen zu erholen.Es handelt sich um eine einzelne Funktion, die eine Zsh-Variable für die Benutzer-ID verwendet, wenn diese vorhanden ist, und versucht, weniger Zeit mit dem Parsen möglicherweise großer
/tmp
Verzeichnisse zu verbringen, indem siefind(1)
etwas mehr einschränkt .Es ist wahrscheinlich immer noch fehleranfällig und verworren, aber einige flüchtige Tests zeigen, dass es hauptsächlich für meine Anwendungsfälle funktioniert.
quelle
Hier ist meine Meinung dazu. I ‚ Quelle ‘ die folgenden Skript aus meinem Bash_profile :
quelle
Hier ist ein einfaches Skript, das immer denselben ssh-agent wiederverwendet oder ssh-agent startet, wenn er nicht ausgeführt wird. Der Schlüssel ist, die
-a
Option zu verwenden, um denselben Socket-Namen zu verwenden. Andernfalls wird standardmäßig jedes Mal ein zufälliger Socket-Name ausgewählt. Sie können diese 3 Zeilen auch problemlos zu einem 1-Zeilen-Alias kombinieren.Quelle
quelle