以root用户身份运行shell命令,并使用python检测失败的密码尝试

以root用户身份运行shell命令,并使用python检测失败的密码尝试,python,shell,Python,Shell,我编写了一个python函数,它可以使用子流程以root用户身份运行shell命令。我正在尝试添加功能,以检测不正确的密码尝试。这里是函数 local_pass = None def runShellCommandAsRoot(cmd): global local_pass if local_pass == None: print "Enter admin user's password." local_pass = getpass.getpas

我编写了一个python函数,它可以使用子流程以root用户身份运行shell命令。我正在尝试添加功能,以检测不正确的密码尝试。这里是函数

local_pass = None

def runShellCommandAsRoot(cmd):
    global local_pass
    if local_pass == None:
        print "Enter admin user's password."
        local_pass = getpass.getpass()

    cmd = "echo {} | sudo -S {}".format(local_pass, cmd)
    sp = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = sp.communicate()
这个很好用。为了检测失败的密码尝试,我尝试添加的是解析stderr,但在每个循环中,我会得到不同的结果。请参阅下面的代码(我尝试将其添加到上面的函数中):


一位朋友帮我找到了一个更好的解决方案,可以运行shell命令,还可以检查用户密码的错误!见下文:

def run_shell_command_as_root(cmd):
    cmd[:0] = ['sudo']
    if not authenticate():
        print 'Unable to authenticate'
        sys.exit(1)
    sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    return sp.communicate()

def authenticate():
    pwd = ''
    for i in range(5):
        sp = subprocess.Popen(['sudo', '-S', '-v'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        sp.communicate(pwd + '\n')
        if sp.returncode == 0:
            return True
        if i == 0:
            print "Please enter user password."
        else:
            print "Incorrect password. Please try again."
        pwd = getpass.getpass()
    return False

sudo日志不应该已经有了这个吗?
def run_shell_command_as_root(cmd):
    cmd[:0] = ['sudo']
    if not authenticate():
        print 'Unable to authenticate'
        sys.exit(1)
    sp = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    return sp.communicate()

def authenticate():
    pwd = ''
    for i in range(5):
        sp = subprocess.Popen(['sudo', '-S', '-v'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        sp.communicate(pwd + '\n')
        if sp.returncode == 0:
            return True
        if i == 0:
            print "Please enter user password."
        else:
            print "Incorrect password. Please try again."
        pwd = getpass.getpass()
    return False