gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:18:32 31 4
gpt4 key购买 nike

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

我的操作系统是 Ubuntu 18.04,我正在使用 Python 3.6 和 PyCharm。

无论我如何尝试,我都无法使用子进程输入密码。我的脚本总是在尝试输入 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

在我的第二次尝试中,我尝试自己处理内流,但似乎也没有用。程序在读取外流的行时会卡住。当我中止代码时,我收到以下错误消息,表明已提示控制台输入密码但无法输入密码。

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

尝试 3:

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

但是,与所有其他方法一样,这种方法再次陷入困境。

尝试 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 文件并使用子进程执行它,我可能会成功,因为我不会将任何 sudo 命令直接输入到子进程。当我自己在终端中尝试时,效果很好:

anon@anon:~$ sh temp.sh 
[sudo] password for anon: success

但是 Python 脚本和以前一样卡在了同一个地方。

有谁知道为什么这些尝试失败了以及我如何才能实现我的目标?

编辑:

有人给我链接了一篇有关此主题的旧帖子,该帖子使用 os 而不是子进程。 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 上。这也是我的问题对 this question 独一无二的原因。 ,因为他们的问题不是来自他们的口译员。

有没有人对如何使代码在 PyCharm 中工作有任何建议,还是我应该只从控制台运行我的所有脚本?

最佳答案

怎么样:

# 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!')

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

关于python - 在 PyCharm 中使用子进程执行 sudo 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51224674/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com