Yan*_*ick 6 python ubuntu subprocess pycharm
我试图从Python 3执行sudo命令.我通常使用子进程在Python中运行我的终端命令.讨论这个话题已经有很多问题,但我找不到任何适合我的解决方案.
我的Os是Ubuntu 18.04,我正在使用Python 3.6和PyCharm.
无论我如何尝试,我都无法使用子进程输入密码.尝试输入sudo密码时,我的脚本总是卡住了.在第一个答案之后,我意识到问题不在于我的代码,问题在于PyCharm.从Console运行它们时,以下所有尝试都可以正常工作,但是当我从PyCharm Interpreter运行它们时它们会卡住.以下是我尝试过的所有版本:
import subprocess
sudo_password = b"myPassword\n"
print(subprocess.check_output('sudo -S echo success', shell=True, input=sudo_password)) #stuck here
Run Code Online (Sandbox Code Playgroud)
这似乎是解决问题的最简单方法,但不知何故,子进程无法输入密码,在我杀死进程之前它总会卡住.
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
Run Code Online (Sandbox Code Playgroud)
在我的第二次尝试中,我试图自己处理这个似乎也没有工作的内流.在阅读流出线时,程序会卡住.当我中止代码时,我得到以下错误消息,表明控制台已被提示输入密码,但它可能以某种方式不能输入.
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
Run Code Online (Sandbox Code Playgroud)
我知道我可以将密码从终端传递到sudo命令:
anon@anon:~$ echo myPassword | sudo -S echo success
[sudo] password for anon: success
Run Code Online (Sandbox Code Playgroud)
所以我尝试使用子进程做同样的事情:
import subprocess
sudo_password = "myPassword"
print(subprocess.check_output("echo {} | sudo -S echo success".format(sudo_password), shell=True)) #stuck here
Run Code Online (Sandbox Code Playgroud)
但是,这种方法再次陷入困境,就像所有其他方法一样.
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")
Run Code Online (Sandbox Code Playgroud)
因此,在我最后一次绝望的尝试中,如果我将命令放入shell文件并使用子进程执行,我认为可能会成功,因为我不会将任何sudo命令直接输入到子进程中.当我在终端自己尝试时,这很好用:
anon@anon:~$ sh temp.sh
[sudo] password for anon: success
Run Code Online (Sandbox Code Playgroud)
但Python脚本与以前一样卡在同一个地方.
有谁知道为什么这些尝试失败以及我如何能够实现我的目标呢?提前致谢 :)
有人把我关于这个主题的旧帖子联系起来,后者使用的是os而不是subprocess.os已被弃用,并且应该使用子进程,这就是为什么我最初没有在这个问题中显示任何这些尝试,但是在使用os时它也会被卡住:
import os
sudo_password = "myPassword"
p = os.system('echo {} | sudo -S echo success'.format(sudo_password)) #stuck here
Run Code Online (Sandbox Code Playgroud)
好了,我发现,如果你从终端运行脚本,我的所有尝试以及第一个答案的建议都会有效:
anon@anon:~$ python3 checksudo.py
Run Code Online (Sandbox Code Playgroud)
所以问题似乎在于我的翻译,PyCharm.这也是我的问题与这个问题的独特之处,因为他们的问题不是来自他们的翻译.
有没有人有任何建议如何使代码在PyCharm中工作或我应该从控制台运行我的所有脚本?感谢您抽出宝贵时间.
小智 2
怎么样:
# coding=utf-8
from subprocess import Popen, PIPE
sudo_password = 'mypass'
command = 'echo success'.split()
p = Popen(['sudo', '-S'] + command, stdin=PIPE, stderr=PIPE,
universal_newlines=True)
sudo_prompt = p.communicate(sudo_password + '\n')[1]
print('Done!')
Run Code Online (Sandbox Code Playgroud)
当然,请确保您在代码中输入了正确的密码。
| 归档时间: |
|
| 查看次数: |
914 次 |
| 最近记录: |