Ich habe versucht, dieses Problem zu lösen, als ich Schlüsselpaare generiert und mit Python in einer Datenbank gespeichert habe. Im Folgenden sind einige der Schritte aufgeführt, die ich letztendlich ausgeführt habe, nämlich das Starten ssh-agent
und Interagieren damit. Es ist in Python, aber vermutlich können Sie es in alles andere übersetzen. Ein weiteres Merkmal ist, dass keines dieser Elemente verwendet wird shell=True
, sodass sie vor Injektionsangriffen sicherer sind.
import subprocess
import os
sockfile = '/some/place.sock'
agent = subprocess.Popen(['ssh-agent',
'-D', # foreground mode
'-a', sockfile, # bind address (socket file)
])
subprocess.check_call(['ssh-add',
'-D', # delete all identities from the agent
],
env={'SSH_AUTH_SOCK': sockfile},
)
Das löst ein ssh-agent
Programm aus, das nur für unser Programm bestimmt ist, und löscht es (ich glaube, es lädt meine Benutzerschlüssel hinein, bin mir aber nicht sicher). Die Umgebungsvariable, die SSH_AUTH_SOCK
normalerweise von festgelegt wird ssh-agent
(aber die wir manuell erstellt haben), geben wir an andere weiter Programme.
Als nächstes geben wir ssh-add
ihm den privaten Schlüssel (hier wird er dr.private_key
als Zeichenfolge gespeichert , aber ich muss ihn serialisieren, damit ich ihn als ASCII codiere).
adder = subprocess.Popen(['ssh-add',
'-', # read key from stdin
],
env={'SSH_AUTH_SOCK': sockfile},
stdin=subprocess.PIPE,
)
adder.communicate(dr.private_key.encode('ascii'))
retval = adder.wait()
assert retval == 0 # added successfully
Wenn ich jetzt eine SSH-verwendende Anwendung verwende, z. B. Git, beziehe ich mich darauf, denselben SSH-Agent-Socket zu verwenden:
gitp = subprocess.Popen(
['git', '-C', os.path.abspath('../some-repo') ,'fetch'],
env={'SSH_AUTH_SOCK': sockfile},
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
print(gitp.communicate()[0].decode('ascii'))
und es funktioniert gut. Die einzige "temporäre Datei" ist der Socket, der von verwendet wird. Sie ssh-agent
wird jedoch erstellt, sodass nur der Eigentümer über Berechtigungen verfügt. Sie wird entfernt, wenn Sie den Agenten beenden.