it-swarm.com.de

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

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 andere Instanz von $ Shell startet (in meinem Fall bash) und aus der Sicht des Skripts alles und ssh-add ausgeführt wird und alles darunter nie ausgeführt wird.

Wie kann ich ssh-agent über mein Shell-Skript ausführen und es in der Liste der Befehle weiterführen?

19
Dan

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

Was Sie wollen, ist ein session-script, das 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.

10

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
...
...

Erklärung

Die Backticks um ssh-agent Sammeln ihre Ausgabe. eval sammelt diese Ausgabe, verkettet sie zu einem einzigen Befehl und führt den Befehl dann aus. Dann können Sie ssh-add Verwenden, um Ihre Schlüsselanmeldeinformationen anzugeben.

16
scottyseus

Ich neige dazu, so etwas in Skripten zu tun, für die ein Agent erforderlich ist.

#!/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 prüft das Skript als erstes, ob ein Agent ausgeführt wird. Wenn dies nicht der Fall ist, wird exec verwendet, um anstelle des Skripts einen neuen Prozess zu starten. Der Agent wird gestartet, Schlüssel werden hinzugefügt und schließlich wird das Skript erneut aufgerufen (siehe $0).

6
Zoredache

Ich fand, dass dies für mich funktioniert.

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 ssh-agent-Prozess, füge den Schlüssel hinzu, tue, was ich tun muss, und töte ihn dann. Sie müssen nicht überprüfen, ob es später ausgeführt wird.

6
steampowered

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

Debian/Ubuntu:

apt-get install keychain

RHEL/Fedora/CentOS

yum install keychain

Fügen Sie in Ihrem .bashrc Folgendes hinzu:

eval `keychain --eval id_rsa`
4

Ich fand, dass mit Zoredaches Lösung der Schlüssel für jede Shell verfügbar ist, die zufällig 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 ganz oben im Skript steht:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh [email protected] "remote commands"
2
Andy Wood