在PyCharm中使用子进程执行sudo命令

Yan*_*ick 6 python ubuntu subprocess pycharm

我试图从Python 3执行sudo命令.我通常使用子进程在Python中运行我的终端命令.讨论这个话题已经有很多问题,但我找不到任何适合我的解决方案.

我的Os是Ubuntu 18.04,我正在使用Python 3.6和PyCharm.

无论我如何尝试,我都无法使用子进程输入密码.尝试输入sudo密码时,我的脚本总是卡住了.在第一个答案之后,我意识到问题不在于我的代码,问题在于PyCharm.从Console运行它们时,以下所有尝试都可以正常工作,但是当我从PyCharm Interpreter运行它们时它们会卡住.以下是我尝试过的所有版本:

尝试1:

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)

这似乎是解决问题的最简单方法,但不知何故,子进程无法输入密码,在我杀死进程之前它总会卡住.

尝试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
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)

尝试3:

我知道我可以将密码从终端传递到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)

但是,这种方法再次陷入困境,就像所有其他方法一样.

尝试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")
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)

编辑2:

好了,我发现,如果你从终端运行脚本,我的所有尝试以及第一个答案的建议都会有效:

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)

当然,请确保您在代码中输入了正确的密码。