我正在尝试从Python 3执行sudo命令。我通常使用subprocess在Python中运行我的终端命令。已经有许多讨论此主题的问题,但我找不到适合我的解决方案。
我使用的操作系统是Ubuntu 18.04,并且我正在使用Python 3.6和PyCharm。
无论我如何尝试,我都不能使用subprocess输入密码。我的脚本总是在尝试输入sudo密码时卡住。在第一个答案后,我意识到问题不在于我的代码,而是在于PyCharm。从控制台运行以下所有版本都能正常工作,但当我从PyCharm解释器运行它们时,它们就会卡住。以下是我尝试的所有版本:
尝试1:
import subprocess
sudo_password = b"myPassword\n"
print(subprocess.check_output('sudo -S echo success', shell=True, input=sudo_password)) #stuck here
这似乎是解决问题最简单的方法,但一些子进程无法输入密码,会一直卡住直到我杀死该进程。
尝试2:
import subprocess
sudo_password = b"myPassword\n"
proc = subprocess.Popen('sudo -S echo success', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
proc.stdin.write(sudo_password)
proc.stdin.flush()
print(proc.stdout.readlines()) #stuck here
第二次尝试时,我试图自己处理流,但似乎也不起作用。程序在读取outstream的行时会卡住。当我中止代码时,我会收到以下错误消息,指示控制台已提示输入密码,但某种方式无法输入。
Traceback (most recent call last):
File "/home/anon/sudo.py", line 7, in <module>
[sudo] password for anon: print(proc.stdout.readlines()) #stuck here
KeyboardInterrupt
尝试三:
我知道我可以从终端将密码输入到sudo命令中:
anon@anon:~$ echo myPassword | sudo -S echo success
[sudo] password for anon: success
所以我尝试使用subprocess做同样的事情:
import subprocess
sudo_password = "myPassword"
print(subprocess.check_output("echo {} | sudo -S echo success".format(sudo_password), shell=True)) #stuck here
但是,这种方法又像所有其他方法一样被卡住了。
尝试 4:
import subprocess
import os
sudo_password = "myPassword"
with open("temp.sh", 'w') as file:
file.write("echo {} | sudo -S echo success".format(sudo_password))
print(subprocess.check_output("sh temp.sh", shell=True)) #stuck here
os.remove("temp.sh")
所以在我最后的绝望尝试中,我认为如果将我的命令放入一个shell文件中并使用subprocess执行它,那么我就有可能成功,因为我不会直接在subprocess中输入任何sudo命令。当我自己在终端中尝试时,这个方法行得通:
anon@anon:~$ sh temp.sh
[sudo] password for anon: success
但是Python脚本仍然卡在之前的同一个位置。
有人知道为什么这些尝试失败以及我如何无论如何都能实现我的目标吗?
编辑:
有人给我链接了一篇关于这个主题的旧帖子,其中使用了os而不是subprocess。 os已弃用,应改用subprocess,这就是为什么我最初没有显示这些尝试的原因,但使用os也会卡住:
import os
sudo_password = "myPassword"
p = os.system('echo {} | sudo -S echo success'.format(sudo_password)) #stuck here
编辑2:
好的,现在我找到了解决方法,如果你在终端中运行脚本,则我所有的尝试以及第一个答案的建议都可以正常工作:
anon@anon:~$ python3 checksudo.py
问题似乎出在我的解释器 PyCharm上。这也是使我的问题与这个问题不同的原因,因为他们的问题并非起源于解释器。
有没有人有建议如何使代码在PyCharm中运行,或者我应该始终从控制台运行所有脚本?
.format(sudo_password)
。 - ducminhvisudo
修复/etc/sudoers
文件以抑制密码提示吗?此外,你是否考虑过使用pexpect
而不是subprocess
,因为pexpect
旨在处理交互式CLI(https://dev59.com/_Jvga4cB1Zd3GeqP1mkx)? - tk421