Ausführen von ssh-agent über ein Shell-Skript

19

Ich versuche ein Shell-Skript zu erstellen, das unter anderem ssh-agent startet und dem Agenten einen privaten Schlüssel hinzufügt. Beispiel:

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

Das Problem dabei ist, dass ssh-agent anscheinend eine weitere Instanz von $ SHELL startet (in meinem Fall bash) und aus der Sicht des Skripts alles und ssh-add ausgeführt und nichts darunter nie ausgeführt wird.

Wie kann ich ssh-agent von meinem Shell-Skript aus ausführen und es in der Befehlsliste in Bewegung halten?

Dan
quelle

Antworten:

8

ssh-agent soll eine Sitzung starten und wenn es beendet ist, ist die Benutzersitzung beendet. Daher würde jeder Befehl nach ssh-agent möglicherweise nach dem Abmelden ausgeführt.

Was Sie wollen, ist eine session-script, die Ihre Sitzungsbefehle wie folgt enthält:

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

Dann fang an ssh-agent session-script.

Michael Suelmann
quelle
Vielen Dank! Das Erstellen eines separaten Skripts und das Beenden des Skripts mit exithat den Trick gemacht.
Dan
2
Was ist ein Sitzungsskript?
Alexander Mills
15

Fügen Sie Folgendes oben in Ihr Skript ein:

eval `ssh-agent`

Ihr Skript sollte folgendermaßen aussehen:

#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...

Erläuterung

Die Backticks ssh-agentsammeln ihre Ausgabe. evalsammelt diese Ausgabe, verknüpft sie zu einem einzigen Befehl und führt dann den Befehl aus. Anschließend können Sie ssh-addIhre Schlüsselanmeldeinformationen eingeben.

Scottyseus
quelle
9
Dies ist genau das, was ich brauchte, danke, obwohl es sich lohnt, darauf hinzuweisen, dass Backticks auf dem Weg sind. In der neuen Bash-Form sollte eseval $(ssh-agent)
sibaz
Diese Lösung hat bei mir erst funktioniert, als ich bash -iam Ende des Skripts stand.
Adolfo Correa
6

Ich neige dazu, so etwas in Skripten zu tun, die einen Agenten erfordern.

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

Grundsätzlich überprüft das Skript als Erstes, ob ein Agent ausgeführt wird. Ist dies nicht der Fall, wird exec verwendet, um anstelle des Skripts einen neuen Prozess zu starten. Der Agent wird gestartet, Schlüssel hinzugefügt und schließlich das Skript erneut aufgerufen (siehe $0).

Zoredache
quelle
Dadurch werden jedoch keine Skriptparameter beibehalten. Und wenn einer der Parameter Leerzeichen enthält, ist es nicht einfach, sie weiterzugeben.
Denilson Sá Maia
3
Sie könnten .. "ssh-add ; $0 $*"oder .. "ssh-add ; $0 $@"stattdessen verwenden, was möglicherweise funktioniert. Was nicht perfekt wäre, aber sicherlich in vielen Fällen funktionieren würde. Die beste Lösung ist fast immer, dass Ihr Agent ohnehin vor allem anderen ausgeführt wird. Dies ist nur etwas, das in unklaren Fällen nützlich sein kann.
Zoredache
6

Ich fand das funktioniert für mich.

eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process

Ich erstelle den Prozess ssh-agent, füge den Schlüssel hinzu, tue, was ich tun muss, und beende ihn dann. Keine Notwendigkeit zu überprüfen, ob es später ausgeführt wird.

dampfbetrieben
quelle
4

In diesem Fall ist es besser, den Schlüsselbund zu verwenden

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

Fügen Sie Ihrem .bashrc Folgendes hinzu:

eval `keychain --eval id_rsa`
ZIADI Mohamed ali
quelle
Besser? Warum ist es besser?
JFlo
@JFlo "Besser" speichert die Umgebungsvariablen in $ HOME / .keychain / <file>. Wenn Sie diesen Befehl erneut ausführen, wird ein vorhandener ssh-agent abgerufen, sofern er noch ausgeführt wird. Es kann dann zwischen Shells / Skripten wiederverwendet werden. In einigen Szenarien ist das nicht besonders sicher, daher müssen Sie diesen Anruf tätigen. Für mich ist es eine Verbesserung gegenüber einigen Skripten, die ich geschrieben hatte, um die gleiche Aufgabe zu erfüllen
Scott Carlson
2

Bei der Lösung von Zoredache stellte sich heraus, dass der Schlüssel für jede Shell verfügbar ist, die denselben ssh-Agenten wie die Shell verwendet, die das Skript aufgerufen hat. Ich wollte dies in einem Skript vermeiden, das aus offensichtlichen Sicherheitsgründen Root-Zugriff auf einen Remotecomputer erforderte.

Ich habe festgestellt, dass der folgende Shebang am Anfang des Skripts steht:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"
Andy Wood
quelle
-2

Ich habe viel versucht und die Lösung, die schließlich funktionierte, bestand darin, meine Passphrase durch eine leere Zeichenfolge zu ersetzen.

ssh-keygen -p
Stephan Weinhold
quelle
Dies ist eine sehr unsichere Praxis. Warum überhaupt ssh benutzen? Wenn Sie Ihren privaten Schlüssel nicht schützen, können Sie auch im Klartext sprechen.
JFlo
@JFlo: nicht, wenn Ihr Client-System ausreichend sicher ist, wie es sein könnte. Besonders, wenn Sie ACL, SELinux oder ähnliches hinzufügen (können und tun), was mit einer statischen Datei einfach ist, mit dem zufälligen Socket von ssh-agent jedoch weniger. Das heißt, ich würde es normalerweise nicht als erste Wahl empfehlen.
Dave_thompson_085
Das ist zwar ein sehr hilfreicher Prozess, aber ich denke, er beantwortet nichts über die Frage des OP.
Alexander Bird