Benutzerführung GUI Passwortabfrage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
SpicySynek
User
Beiträge: 10
Registriert: Mittwoch 13. Dezember 2017, 11:14

Hallo Python Forum,
da die Benutzerführung unter Linux auf dem RaspberryPi für Programme über die Eingabeaufforderung teilweise umständlich ist, bin ich grade dabei das ganze über eine GUI mit Tkinter zu veranschaulichen . Das Öffnen/Installieren des Programmes erfolgt zwar über die GUI, wird aber durch Übergeben eines Commands und ggf. Parametern in die Eingabeaufforderung realisiert.
Der Ablauf des Commands verlangt ab einem bestimmten Zeitpunkt ein Passwort, welches ich leider nicht ohne weiteres eingeben kann. Woran liegt das?
Wenn ich das Programm in der Eingabeaufforderung öffne, wird der ganze Ablauf in einem Fenster durchgeführt -> Programmaufruf, Passwortabfrage, erneute Passwortabfrage, usw.., usw.. Wird beim Programmablauf unter der GUI jede Zeile, die ein Command an die Eingabeaufforderung übergibt, in eine eigene Instanz der Eingabeaufforerung übergeben? Stimmt mein Gedankengang? Wenn ja, wie kann ich das umgehen?
Die Befehlsübergabe an die Eingabeaufforderung erfolgt über (und klappt auch soweit, jedoch nicht zeilenübergreifend) mit :

import os
os.system('sudo apt-get update') #Willkürliches Beispiel

Wie ihr seht bin ich absoluter Novize, seid bitte nett zu mir =)

Grüße Tobi
__deets__
User
Beiträge: 14527
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ohne das genaue Kommando zu kennen, kann man dazu auch nur allgemein Stellung nehmen.

Grundsaetztlich werden Passwort-Eingaben *NICHT* an die Standard-Ein/Ausgabe eines Prozesses gestellt. Sondern an das "controlling terminal" des Prozesses. Das erlaubt es, auch tief in irgendwelchene Prozesshierarchien Passworte abzufragen, die dann trotztem "oben" im Terminal ankommen.

https://www.gnu.org/software/libc/manua ... minal.html

Wenn man das abfangen will, kann man das tun durch zB eine Python-Bibliothek "pexpect". Diese simuliert ein controlling terminal, und erlaubt es damit, auch solche Eingaben via Skripting zu taetigen.

Besser allerdings waere es, wenn du erst gar nicht in die Bedroullie kommst, das machen zu muessen. ZB indem du mit einem entsprechend aufgesetzten sudo-Mechanismus arbeitest, und keine Passworte brauchst.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

also grundsätzlich gibt es ja schon diverse Programmstarter für Desktop-Umgebungen... muss man nicht zwingend selber programmieren.

`os.system` ist veraltet - das steht sogar wörtlich in der Python-Doku, die Wahl der Waffen ist das `subprocess` Modul.

Verständnisfrage: kommt die besagte Passwortabfrage im Terminal oder in einem eigenen Fenster des gestarteten Programms?

Gruß, noisefloor
SpicySynek
User
Beiträge: 10
Registriert: Mittwoch 13. Dezember 2017, 11:14

Danke euch beiden für die rasche Antwort,

die Passwortabfrage kommt, sofern ich das Programm über das Terminal starte, im Terminal. Wenn ich es in der GUI starte passiert nichts, da es ja auf die Passworteingabe wartet.
Ich werde es allerdings mal wie von __deets__ erwähnt mit "pexpect" versuchen.

Auf das subprocess Modul bin ich auch gestoßen, allerdings fand ich os.system Anfängerfreundlicher und für meine bisherigen Zwecke ausreichend.

Ich melde mich :)
SpicySynek
User
Beiträge: 10
Registriert: Mittwoch 13. Dezember 2017, 11:14

Also ich bin es noch einmal,

vielen Dank für die Tipps. Mit dem "pexpect" Modul hat es auch endlich geklappt. Auch das Einlesen und übergeben von Kommandozeilen lässt sich damit realisieren. Allerdings sollte man darauf achten, dass man das richtige Modul bei Nutzung Python3 installiert.
Ich bin so frei und teile mit was ich herrausgefunden habe.

Code: Alles auswählen

#----- Einlesen von Antworten nach Befehl in Eingabeaufforderung (Bsp.: IP-Adresse) ---
sudo apt-get install python-pexpect                     #für Python 1/2(?)
sudo apt-get install python3-pexpect                   #für Python 3
Befehl = pexpect.spawn("hostname -I")                #Befehl in die Kommandozeile
i = child.readlines()                                             #Einlesen der Antwort und übergeben auf i
print(i)                                                               #Ausgabe 

#-----Erwarten und Antworten auf Passwortabfrage---
sudo apt-get install python3-pexpect
Befehl = pexpect.spawn(" ... ")                            #Führt Befehl aus
Befehl.expect("Password:")                                  #Erwartet vom Programmablauf (zum Beispiel!) diese Zeile, stoppt und ...
Befehl.sendline("passwort123")                            #.. gibt folgendes Passwort ein
Befehl.expect("Bitte Passwort Bestätigen")           #Erwartet wiederum diese Zeile, stoppt und ..
Befehl.sendline("passwort123")                            #.. gibt wieder Passwort ein
__deets__
User
Beiträge: 14527
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schoen das es geklappt hat.

Bitte gewoehn dir wenn moeglich gleich an, die PEP8 Konventionen einzuhalten. "Befehl" suggeriert eine Klasse, weil es am Anfang gross geschrieben ist. Das sollte klein geschrieben werden. Und auch besser beschreiben, welcher Befehl das denn ist. Also zb "hostname_prozess".

Die ganzen Kommentare erklaeren das offensichtliche. Die koennen also weg. Und eine Variable "i" ist ungewoehnlich fuer alles andere als einen Zaehler in einer for-Schleife. Da bietet sich "ausgabe" an.

Diese Tipps machen es sowohl fuer uns, als auch fuer alle anderen Programmierer verstaendlicher, was da passiert. Und andere Programmierer bist auch Zukunfts-Du in 3 Wochen oder Monaten.
Antworten