Warum speichert ssh-agent meinen unverschlüsselten Schlüssel nicht zur späteren Verwendung?

12

Jedes Mal, wenn ich von unserem kopflosen Ubuntu-Server aus einen SSH-Vorgang auf einem anderen Server durchführe, werde ich nach dem Kennwort für meine Schlüsseldatei gefragt. Auch wenn ich vorher eine Verbindung zum Server hergestellt habe.

Hast du vielleicht eine Idee warum das so ist? Es könnte etwas so Einfaches sein, als würde ssh-agentes gerade nicht laufen oder so.

Der gleiche Schlüssel auf meinem Ubuntu Gnome-Desktop funktioniert einwandfrei. Sowohl auf dem Server als auch auf dem Desktop wird Ubuntu 10.10 ausgeführt.

ps -ef | grep '[s]sh-agent'
simon     3219     1  0 12:46 ?        00:00:00 ssh-agent
Treffynnon
quelle
1
Überprüfen Sie zunächst, wie Sie sagten, ob ssh-agentFolgendes ausgeführt wird:ps -ef | grep '[s]sh-agent'
Scott Severance,
@mssever Yep es scheint zu sein. Siehe aktualisierte Frage.
Treffynnon

Antworten:

10

Auch wenn der Agent aktiv ist und bestimmte Umgebungsvariablen nicht festgelegt sind, haben Sie keinen Verweis auf den Agenten. Darüber hinaus wird die Identität nicht automatisch an den Agenten gesendet, auch wenn alles in Ordnung ist, der Agent und die Variablen. Dies ist eine Aufgabe ssh-askpass, die nur in X-Sitzungen ausgeführt wird.

Wenn Sie bash verwenden, erstellen Sie die Datei ~/.bash_profilemit folgendem Inhalt:

# File: ~/.bash_profile

# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
  . ~/.profile
fi

# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
  echo "Starting ssh agent"
  eval $(ssh-agent -s)
  agent_started=1
fi

# ssh become a function, adding identity to agent when needed
ssh() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/ssh "$@"
}
export -f ssh

# another example: git
git() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/git "$@"
}
export -f git

Ändern Sie den Dateinamen ~/.ssh/id_dsanach Ihren Wünschen und fügen Sie diese Zeile hinzu~/.bash_logout

# stuff to add at end of ~/.bash_logout
if ((agent_started)); then
  echo "Killing ssh agent"
  ssh-agent -k
fi

Ein letzter Hinweis: Dies stört eine Gnomensitzung nicht, da in diesem Fall nur ~/.profileQuellen verwendet werden und Sie von der ssh-askpassgrafischen Oberfläche profitieren können, die nach einer Passphrase fragt und diese an das sendet ssh-agent.

Enzotib
quelle
Dank @enzotib funktioniert es hervorragend, um sshin andere Maschinen einzusteigen . Bei Verwendung gitvon Push oder Pull für ein öffentliches Repository ist dies jedoch nicht der Fall . Haben Sie Ideen, wie ich das auch lösen könnte?
Treffynnon
Fügen Sie eine Funktion hinzu, die mit identisch ist ssh(), rufen Sie sie auf git()und ändern Sie die letzte Zeile von /usr/bin/sshin /usr/bin/git. Fügen Sie auch eine letzte Zeile mit hinzu export -f git.
Enzotib
@enzotib Ich habe das versucht, aber jetzt, als ich sshin den Computer mit der bash_profileoben erstellten Datei einsteige, fragt er mich nach dem Kennwort des Schlüssels. Aus irgendeinem Grund frage ich jetzt jedes Mal, wenn ich ssh drin habe, noch bevor ich sshoder ausgeführt habe git. Unter gist.github.com/942082 finden Sie die Eingabeaufforderung, die ich erhalte, wenn ich mich beim fehlerhaften Computer anmelde .
Treffynnon
@ Treffynnon: Ich weiß nicht genau, wie ich gitmit interagiere ssh, und ich benutze es nicht, gitdamit ich es nicht versuchen kann. Ich habe das geändert ~/.bash_profile, um die git()oben erwähnte Funktion aufzunehmen, um sicherzugehen, dass meine vorherige Erklärung klar war. Aus der von Ihnen angezeigten Ausgabe geht außerdem hervor, dass Sie den Server-Computer geändert haben, aber alle meine Ratschläge waren nur an den Client-Computer gerichtet.
Enzotib
@enzotib Das ist richtig. Der Server, bei dem ich mich anmelde, wird zu meinem Client, wenn ich von dort aus gitauf ein zentrales Forge / Repository schiebe, damit die Datei am richtigen Ort ist. Ich denke, du hast mir gerade den Hinweis gegeben / meine Gedanken aufgerüttelt. Ich habe eine spezielle Bash-Eingabeaufforderung, die den Git-Zweig der anzeigt pwd. Ich wette, das ist es, was die Passwortanforderung bei der Bash-Anmeldung auslöst, wenn versucht wird, stat zu setzen, bevor die Bash-Eingabeaufforderung ausgegeben wird!
Treffynnon
2

Ich habe kürzlich begonnen, ssh-ident zu verwenden:

https://github.com/ccontavalli/ssh-ident

Alles was Sie tun müssen, ist etwas hinzuzufügen wie:

alias ssh="/path/to/ssh-ident"

in deinem .bashrc. Alternativ können Sie ln -s /path/to/ssh-ident ~/bin/sshvor /binund auch ein anderes Verzeichnis in Ihrem PATH verwenden /usr/bin.

rabexc
quelle