Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—如何使用Popen获取Sudo命令的输出_Python_Linux_Macos_Sudo - Fatal编程技术网

Python—如何使用Popen获取Sudo命令的输出

Python—如何使用Popen获取Sudo命令的输出,python,linux,macos,sudo,Python,Linux,Macos,Sudo,sudo命令根据用户名验证用户的密码。我正在编写一个简单的程序,根据sudo命令检查用户的输入是否有效。我使用-S标记从外部传递输入,并使用Popen()运行脚本: import getpass import subprocess import time password = getpass.getpass() proc = subprocess.Popen('sudo -k -S -l'.split(), stdin=subprocess.PIPE, stderr=subprocess.PI

sudo
命令根据用户名验证用户的密码。我正在编写一个简单的程序,根据
sudo
命令检查用户的输入是否有效。我使用
-S
标记从外部传递输入,并使用
Popen()
运行脚本:

import getpass
import subprocess
import time

password = getpass.getpass()
proc = subprocess.Popen('sudo -k -S -l'.split(), stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
output = proc.communicate(password.encode())
print(f'This is the value of the output {output[0]}')
如果用户在
getpass.getpass()
中输入了错误的密码,我需要根据实际用户密码对其进行验证。在这种情况下,sudo应该输出
对不起,请重试
。有人能告诉我怎么读那个错误吗

当我在终端中运行此命令时:

➜  Desktop python3.8 test.py
Password: 
Sorry, try again.
This is the value of the output b''
谢谢,干杯,我真的很感谢你的帮助。

上面说:

请注意,如果要将数据发送到进程的stdin,则需要使用stdin=PIPE创建Popen对象

所以使用

proc = subprocess.Popen(['sudo', '-S', '-l'], stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
要允许使用
通信
写入密码,否则它只会等待您在终端上输入密码(捕获后不会出现提示)


任何错误消息都可以在
output
变量中找到,特别是与stderr相对应的
output[1]

命令被卡住,没有发生任何事情是的,我已经尝试过了,现在它正在接受输入,但是,我如何捕获“对不起,请重试”?您已经捕获了它。它在您的
output
变量中,但在
output[1]
中,当您刚刚查看
output[0]
时,非常感谢,现在有什么有效的方法来确认密码是否错误?当我写入错误的密码时,输出的是这个
[sudo]tejas密码:[sudo]tejas密码:sudo:没有提供密码sudo:1错误的密码尝试
您可以设置环境变量
LC_ALL=C
以确保语言始终相同,然后匹配子字符串
“错误的密码”
。希望随着时间的推移它会相当稳定。我不知道你为什么要这么做,但那是另一回事。