如果这是一个重复的问题我道歉,我尝试在网上搜索,但大多数人都使用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”时,它需要一两秒,有时甚至更少。
答案 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()
我希望这有助于其他人!