Hallo ich bin noch sehr frisch in der Thematik und hoffe ich kann hier etwas Hilfe bekommen.
Ich möchte den ssh-agent per Script starten und mit ssh-add einen key hinzufügen, so dass spätere bash-sessions mit dem agent kommunizieren können.
Das war der erste Versuch:
1 2 3 4 5 6 7 8 9 10 11 | if pgrep -x ssh-agent >/dev/null then echo "ssh-agent is running" else echo "ssh-agent stopped" echo "starting ssh-agent" eval $(ssh-agent -s) read -p "Which key do you want to add? " -i ~/.ssh/server_rsa -e rsakey ssh-add $rsakey fi |
aber hier kann nur das Script auf den Agent zugreifen. Zwar kann ich nachdem das Script abgeschlossen wurde mit
pidof ssh-agent
sehen, dass der Agent läuft, aber wenn ich dann z.B. git clone 'GitHubSSHlink' ausführen will bekomme ich ein "permission denied (public key)".
Nun habe auch schon die technische Lösung (https://askubuntu.com/a/36302/658360)dafür gefunden, die direkt beim boot überprüft ob der Agent läuft, ihn falls nötig startet, überprüft ob ssh-keys hinterlegt sind und entsprechend ssh-add ausführt, und dabei durch die bash nutzbar ist, aber verstehen tue ich sie nicht:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | # 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 |
Ich habe mich etwas zu export -f erkundigt, aber ich verstehe noch nicht wieso das funktioniert. Immerhin ist die bash, die nachdem das Script ausgeführt wurde, gestartet wird doch kein Child von dem Script-Prozesses, und sollte deshalb doch genauso wenig Zugriff auf den ssh-agent wie vorher haben.
Edit:
Ich werde mich nochmal ausführlich mit child/parten foreground/background und sessions beschäftigen müssen.
Warum kann man nicht einfach eval $(ssh-add key) nutzen? Was unterscheidet ssh-agent und ssh-add? Warum muss ssh-agent nicht exportiert werden?
Immerhin macht es Sinn, dass wenn ein Script als Child einer Bash ausgeführt wird, und dann nachdem es abgeschlossen ist wieder zurück zur Bash wechselt, die Child-Prozesse des Scripts nicht von der Parent-Bash genutzt werden können.
Aber es wird ja mit -f exportiert, also werden die Variablennamen als Funktionen exportiert. Was das aber zu bedeuten hat verstehe ich nicht. Auch das "$@" ist mir ein Rätsel, und warum überhaupt eine ssh() oder git () definiert wird.
Und warum wird der ssh-agent nicht über einen systemd service gestartet und verwaltet?
Für eine Erklärung wäre ich sehr dankbar ☺
mfg hghtch