Seite 1 von 1

subprocess richtig einsetzen

Verfasst: Dienstag 10. März 2020, 11:03
von dd3oc
Hallo,

wie setze ich subprocess richtig ein?
Wie hier starte ich plink.exe um dem Passwort-Prompt der remoten Maschine zu erreichen.
....Code Ausschnitt...
if fimodule.pingHost(ip):
args = [p+'\plink.exe','-2','-ssh','-no-antispoof','-x','-l',username,ip,]
ssh = subprocess.Popen(args,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
universal_newlines = True)
if xmodule.checkState('Password:',ssh.communicate('\n', timeout=30)

...bisher funktioniert alles super. Mit dem \n in ssh.communicate() wird kein Passwort (nur Return) eingegeben und das remote System ändert den Prompt auf "Enter old Password". Mit dem Modul CheckState wird nur geprüft, ob im stdout der String "Password:" steht.
Dieser nächste Schritt funktioniert nicht mehr als ob die Instanz "ssh" nicht mehr aktiv ist. Im Pycharm Debug ist bei "ssh" der Status von stdout Closed von False nach True gewechselt
if ximodule.checkState('Enter Old Password:',ssh.communicate(Password+'\n', timeout=30)):

Mein Ziel ist, dass ich mit der Shell kommunizieren kann. Habt ihr eine Idee?

Klemens

Re: subprocess richtig einsetzen

Verfasst: Dienstag 10. März 2020, 11:09
von sparrow
Poste deinen Code bitte in Code-Tags, damit die Einrückung erhalten bleibt. Die werden automatisch eingefügt wenn du in "Vollständiger Editor & Vorschau" den </> Knopf klickst.

Warum zeigst du nur den Code, der funktioniert, und nicht die Zeilen, die dann nicht mehr gehen?

Re: subprocess richtig einsetzen

Verfasst: Dienstag 10. März 2020, 11:22
von Sirius3
Wenn Du ssh benutzen willst, warum nimmst Du kein Python-Modul wie paramiko?

Re: subprocess richtig einsetzen

Verfasst: Dienstag 10. März 2020, 11:23
von __blackjack__
@dd3oc: Mit `communicate()` kannst Du danach nicht mehr mit dem Prozess kommunizieren weil der dann zuende ist nach dem `communicate()` zum Aufrufer zurückkehrt. Es kann sein dass das mit `subprocess` auch gar nicht geht was Du willst und Du so etwas wie `subprocess` verwenden musst.

``p+'\plink.exe`` sieht auch falsch aus. Pfadteile setzt man nicht mit ``+`` zusammen. Dafür ist `pathlib.Path` da.

Namen schreibt man in Python klein_mit_unterstrichen.

Re: subprocess richtig einsetzen

Verfasst: Dienstag 10. März 2020, 12:11
von dd3oc
Mit Paramiko ist es nicht möglich das Kennwort zu ändern, zumindest habe ich es nicht hinbekommen.

Re: subprocess richtig einsetzen

Verfasst: Dienstag 10. März 2020, 12:21
von dd3oc
Gibt es denn ein anderes Modul mit dem ich mit der Shell "kommunizieren" kann? Das os() soll man ja nicht mehr nutzen.

Re: subprocess richtig einsetzen

Verfasst: Dienstag 10. März 2020, 12:31
von __blackjack__
@dd3oc: Mit dem `os`-Modul geht das ja auch gar nicht, es sei denn man benutzt das um so etwas wie das `pexpect`-Modul zu schreiben. Das gibt es ja aber schon fertig, also warum sollte man das selbst noch mal erfinden wollen.

Was meinst Du mit „nicht möglich das Kennwort zu ändern” bei Paramiko?

Re: subprocess richtig einsetzen

Verfasst: Dienstag 10. März 2020, 13:09
von dd3oc
Hi,
bei Paramiko gibst du im Connect den User und das Kennwort mit:

remote_conn_pre.connect(ip, username=username, password=password, look_for_keys=False, allow_agent=False)

und nur dann kann ich mit dem System kommunizieren. Wenn ich aber das Kennwort ändern will, muss erst ein "leeres" Passwort senden.
Das funktioniert mit Paramiko nicht. Im speziellen geht es hier um Cisco Devices in Verbindung mit einem Tacacs Server. Da wird mit einen
"leeren" Passwort der Kennwortänderungsprocess angestoßen.

Klemens

Re: subprocess richtig einsetzen

Verfasst: Dienstag 10. März 2020, 13:27
von Sirius3
Was passiert denn bei leerem Passwort?
auth_interactive sollte auf jeden Fall funktionieren. Hier ein Beispiel für die nicht ganz triviale Anwendung: https://stackoverflow.com/questions/439 ... entication