执行subprocess.Popen('su',shell = True)时挂起

时间:2014-08-28 14:11:11

标签: python linux python-2.7

如果这是一个重复的问题我道歉,我尝试在网上搜索,但大多数人都使用sudo。

但是,我不能使用sudo,我可以使用'su'以root身份登录。我正在执行以下代码:

try:
    p_su = subprocess.Popen('su', stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
    out_su, err_su = p_su.communicate()
    # >>> The program hangs here. <<<
except:
    print "Unable to login as root (su). Consult the Software Engineer."
    sys.exit()

print out_su
if "Password" in out_su:
    try:
        p_pw = subprocess.Popen('password', stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
        out_pw, err_pw = p_pw.communicate()
    except:
        print "Unable to login as root (password). Consult the Software Engineer."
        sys.exit()

在上面提到的那个程序中,该程序至少会持续30多分钟。当我在linux终端中运行“su”时,它需要一两秒,有时甚至更少。

3 个答案:

答案 0 :(得分:1)

挂起时,su正在等待您输入密码。它没有挂,它耐心等待。

如果从命令行运行此程序(如python my_program.py),请尝试键入一行废话并点击返回。我希望err_su会有这样的内容:

Password: 
su: Authentication failure

答案 1 :(得分:0)

这还够吗?

import subprocess
p_su = subprocess.Popen('su', shell=True).communicate()

我不知道具体原因,但有一条注释in the documentation告诉我们:

  

不要将stdout = PIPE或stderr = PIPE与此函数一起使用,因为它可能会基于子进程输出卷死锁。需要管道时,请使用Popen和communic()方法。

该注释显然适用于许多子进程方法。

答案 2 :(得分:0)

总的来说,@ Thimble在我的问题下面的评论是正确的。

因此,由于subprocess.Popen无法提供我想要的输出,我需要执行以下操作:

try:
    child = pexpect.spawn("su")
expect:
    print "Unable to login as root. Consult the Software Engineer."
    sys.exit()

i = child.expect([pexpect.TIMEOUT, "Password:"])

if i == 0
    print "Timed out when logging into root. Consult the Software Engineer."
    sys.exit()
if i == 1
    child.sendline("password")
    print "Logged in as root"
    sys.exit()

我希望这有助于其他人!