我试图从Python 3执行sudo命令。我通常使用子进程在Python中运行终端命令。讨论这个主题的问题已经很多,但是我找不到适合我的解决方案。
我的操作系统是Ubuntu 18.04,我正在使用Python 3.6和PyCharm。
无论如何尝试,我都无法使用子过程输入密码。我的脚本总是在尝试输入sudo密码时卡住。在第一个答案之后,我意识到问题不关我的代码,问题出在 PyCharm 。从控制台运行以下所有尝试都可以正常工作,但是当我从PyCharm解释器运行它们时,它们会卡住。这是我尝试过的所有版本:
import subprocess
sudo_password = b"myPassword\n"
print(subprocess.check_output('sudo -S echo success', shell=True, input=sudo_password)) #stuck here
这似乎是解决问题的最简单方法,但是子进程无法输入密码,在我杀死该进程之前,它总是会卡住。
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
在我第二次尝试时,我试图自己处理似乎也不起作用的流。读取下游行时,程序将卡住。当我中止代码时,我收到以下错误消息,指示已提示控制台输入密码,但无法输入。
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
所以我尝试使用子过程做同样的事情:
import subprocess
sudo_password = "myPassword"
print(subprocess.check_output("echo {} | sudo -S echo success".format(sudo_password), shell=True)) #stuck here
但是,与其他所有方法一样,这种方法也被卡住了。
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")
因此,在我的最后一次绝望尝试中,我认为如果将命令放入外壳文件并使用子进程执行该命令,则可能会成功,因为我不会直接将任何sudo命令输入到子进程。当我自己在终端中尝试时,效果很好:
anon@anon:~$ sh temp.sh
[sudo] password for anon: success
但是Python脚本与以前一样卡在了同一位置。
有人知道这些尝试为什么失败以及我如何才能实现目标吗?在此先感谢:)
有人联系我有关此主题的旧帖子,该帖子使用os而不是子流程。不推荐使用os,而应使用子进程,这就是为什么我本来没有在此问题中显示任何尝试的原因,但是在使用os时,它也卡住了:
import os
sudo_password = "myPassword"
p = os.system('echo {} | sudo -S echo success'.format(sudo_password)) #stuck here
好了,现在我想通了,如果您使用以下命令从终端运行脚本,则所有尝试以及第一个答案的建议都将有效:
anon@anon:~$ python3 checksudo.py
所以问题似乎出在我的口译员 PyCharm 上。这也是让我的问题对this question独有的原因,因为他们的问题并非来自他们的解释者。
有人对如何使代码在PyCharm中工作有任何建议吗?还是应该从控制台运行我所有的脚本?谢谢您抽出宝贵的时间。
答案 0 :(得分:0)
怎么样:
caServer
当然,请确保在代码中输入了正确的密码。