web-dev-qa-db-fra.com

Comment puis-je exécuter une commande dépend de la saisie d'un mot de passe correct (Tkinter GUI)?

J'ai créé une petite interface graphique dans Tkinter/python:

import Tkinter
import tkMessageBox
import os
top = Tkinter.Tk()
top.geometry("400x250")

def root_login():
    os.system("gksudo su && Sudo su")   
    tkMessageBox.showinfo("Login successful!")

def close_window():
    top.destroy()


B = Tkinter.Button(top, text ="Login", command = root_login)
B.pack()

Q = Tkinter.Button(top, text ="Quit", command = close_window)
Q.pack()

top.mainloop()

Si un mot de passe incorrect est donné dans le gksudo su dialog, la boîte de dialogue indique toujours "Connexion réussie!".

Comment puis-je montrer que la saisie du mot de passe était incorrecte, au lieu de "Connexion réussie!". Je souhaite créer cette fenêtre en tant qu'écran de connexion pour l'application que je construis.

1
Ashwin Joshi

À la limite d'être hors sujet, mais dans l'intérêt de gksudo:

Vous ne savez pas exactement ce que vous voulez réaliser, car l'interface graphique n'a aucun effet sur ce qui se passe dans le terminal :)

Alors techniquement

Le problème est que vous ne définissez pas de condition pour l'exécution de tkMessageBox.showinfo("Login successful!"). Ainsi, quoi qu'il se passe dans os.system("gksudo su && Sudo su"), la ligne suivante sera exécutée.

def root_login():
    os.system("gksudo su && Sudo su")   
    tkMessageBox.showinfo("Login successful!")

Comment le faire fonctionner

Tout d’abord, vous ne devriez plus utiliser os.system: vraiment, vraiment à l’ancienne.

Voir ci-dessous pour un codage alternatif, en utilisant subprocess.check_call:

#!/usr/bin/env python
import subprocess
import Tkinter
import tkMessageBox

top = Tkinter.Tk()
top.geometry("400x250")

def root_login():
    try:
        subprocess.check_call(["gksudo", "su"])
    except subprocess.CalledProcessError:
        tkMessageBox.showinfo("message", "OOOOPS...\nWrong password!")
    else:
        tkMessageBox.showinfo("message", "Login successful!")

def close_window():
    top.destroy()

B = Tkinter.Button(top, text ="Login", command = root_login)
B.pack()
Q = Tkinter.Button(top, text ="Quit", command = close_window)
Q.pack()

top.mainloop()

Mais encore une fois, gksudo su n'a aucun effet, puisque vous exécutez une interface graphique :)

Explication

subprocess.check_call(["gksudo", "su"])

... lève un subprocess.CalledProcessError si le mot de passe est incorrect et affiche le message:

enter image description here

Si le mot de passe est correct, le message:

enter image description here

apparaîtra.

Remarque

La construction try/except/else, je l’ai fait pour des raisons de clarté. La fonction ci-dessous fait exactement la même chose, puisque la fonction "saute" depuis la ligne:

subprocess.check_call(["gksudo", "su"])

à

tkMessageBox.showinfo("message", "OOOOPS...\nWrong password!")

au cas et immédiatement si, le premier soulève le subprocess.CalledProcessError:

def root_login():
    try:
        subprocess.check_call(["gksudo", "su"])
        tkMessageBox.showinfo("message", "Login successful!")
    except subprocess.CalledProcessError:
        tkMessageBox.showinfo("message", "OOOOPS...\nWrong password!")
3
Jacob Vlijm