Skip to main content
 首页 » 编程设计

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

2025年05月04日9lonelyxmas

我写了一个 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() 

这很好用。我尝试添加以检测失败的密码尝试是解析标准错误,但我会在每个循环中得到不同的结果。请参阅下面的代码(我尝试将其添加到上面的函数中):

for i in range(5): 
    if err == "Password:Sorry, try again.\nPassword:\nsudo: 1 incorrect password attempt\n": 
        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() 
    elif err == None or err == "": 
        return out, err 
        break 
    if i == 4: 
        print "Exceeded password attempts." 
        exit() 

请您参考如下方法:

一个 friend 帮我想出了一个更好的解决方案来运行 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