Ich schreibe eine GUI, die SSH-Befehle verwendet. Ich habe versucht, das Subprozess-Modul zu verwenden, um ssh aufzurufen und die Umgebungsvariable SSH_ASKPASS zu setzen, so dass meine Anwendung ein Fenster öffnen kann, in dem nach dem SSH-Passwort gefragt wird. Ich kann jedoch nicht machen, dass ssh das Passwort mit dem gegebenen SSH_ASKPASS-Befehl liest: es wird immer im Terminal-Fenster angezeigt, egal wie ich die Umgebungsvariablen DISPLAY, SSH_ASKPASS, TERM oder wie ich die Standard-Eingabe / Ausgabe pipe. Wie kann ich sicherstellen, dass ssh von der aktuellen TTY getrennt ist und das angegebene Programm verwendet, um das Passwort zu lesen?
Mein Testcode war:
%Vor%SSH verwendet die Variable SSH_ASKPASS nur dann, wenn der Prozess tatsächlich von TTY getrennt ist (Standardumleitung und Festlegen von Umgebungsvariablen ist nicht ausreichend). Um einen Prozess von der Konsole zu trennen, sollte er fork und os.setsid () aufrufen. Die erste Lösung, die ich fand, war:
%Vor%Es gibt auch eine elegante Möglichkeit, dies mit dem Subprozessmodul zu tun: Im preexec_fn-Argument können wir eine Python-Funktion übergeben, die im Subprozess aufgerufen wird, bevor der externe Befehl ausgeführt wird. Die Lösung für die Frage ist also eine zusätzliche Zeile:
%Vor% Ihr Problem besteht darin, dass SSH Ihr TTY erkennt und direkt mit ihm kommuniziert (wie es auf der Man-Page eindeutig angegeben ist). Sie können versuchen, ssh ohne ein Terminal auszuführen - die man-Seite schlägt vor, dass es notwendig sein könnte stdin
auf /dev/null
umzuleiten, damit ssh denkt, dass es kein Terminal hat.
Sie können dafür auch pexcept verwenden, es ist bekannt, mit SSH zu arbeiten - Beispiel Nutzung .
Der Richtige Weg (TM), um das zu tun, was Sie versuchen, ist entweder:
Wenn Sie eine schnelle und schmutzige Art und Weise für Ihre persönliche Verwendung verwenden möchten, können Sie eine passwortlose Anmeldung zwischen diesen beiden Computern aktivieren, indem Sie dies in Ihrem Terminal tun:
%Vor% Dann können Sie ssh-Befehle durchgehen lassen (subprocess kann ssh-Befehle nicht direkt akzeptieren), indem Sie ein Skript erstellen (denken Sie daran, es als ausführbar zu markieren, zB chmod 755 my_script.sh
) mit den gewünschten Dingen wie:
und rufen Sie es aus Ihrem Programm:
%Vor%Für den produktiven Einsatz von Apps, die auf den Rechnern anderer Leute installiert werden müssen, würde ich mit dem Ansatz von abyx arbeiten, eine SSH-Bibliothek zu verwenden. Viel einfacher als das Mischen mit einigen Umgebungsvariablen.
Tags und Links python ssh subprocess