Python 如何在linux子进程操作系统上传递密码部分
我正在尝试制作一个程序,允许我在用户需要时关闭或重新启动计算机。我会把这个发给我的朋友,这样我就不知道是哪个操作系统了。我也在使用tkinter,下面是一个示例代码Python 如何在linux子进程操作系统上传递密码部分,python,linux,operating-system,subprocess,python-3.4,Python,Linux,Operating System,Subprocess,Python 3.4,我正在尝试制作一个程序,允许我在用户需要时关闭或重新启动计算机。我会把这个发给我的朋友,这样我就不知道是哪个操作系统了。我也在使用tkinter,下面是一个示例代码 import subprocess import os time = "10" if os.name == "posix": subprocess.call(["shutdown", "-h", time]) elif os.name == "nt": subprocess.call(["shutdown", "-
import subprocess
import os
time = "10"
if os.name == "posix":
subprocess.call(["shutdown", "-h", time])
elif os.name == "nt":
subprocess.call(["shutdown", "-s", "-t", time])
然而,在linux上,它在关机前向用户询问密码。所以,如果在关机前询问密码,这个程序是无用的。我尝试在
if
语句之后使用%admin ALL=NOPASSWD:/sbin/shutdown
,但也不起作用。如何在linux上传递这个密码?我认为这是不可能的,你必须禁用密码,否则你的程序就会像你说的那样毫无用处。但我可能错了;) 对子流程或Popen的直接调用不可能处理此问题,因为这是一个等待用户输入的交互模式,您可以使用pexepct进行此类交互模式 您不应该在脚本中硬编码密码
不建议这样做,但您可以将密码传递到sudo
():
它看起来更像是一个评论而不是一个答案。你到底希望这个程序如何运行?从命令行还是从GUI?为什么密码提示会使程序无效?@texasflood因为这个想法来自懒惰:-)当我懒得站起来关机时,我想设置一个计时器。你可以用sudo运行python程序,然后你只需要在运行时输入密码,而不是在它真正关闭时输入密码。Sudo应该为孩子们继承。你真正的问题似乎是“如何在没有密码的情况下关闭电脑”。“我尝试在if语句后使用%admin ALL=NOPASSWD:/sbin/shutdown,但它也不起作用。”--应该没有
if
语句,您应该将此行保存到/etc/sudoers.d/shutdown
(在Debian上)或类似的位置。确保文件模式为0440
,并且您的/etc/sudoers
文件末尾包含#includedir/etc/sudoers.d
。如果需要,可以使用visudo
对其进行编辑。如果使用pty
模块,则可以进行编辑,但pexpect
更方便。这是一个例子。
#!/usr/bin/env python
from getpass import getpass
from subprocess import Popen, PIPE
command = 'shutdown -P now'.split()
sudo_password = getpass('Sudo password: ')
p = Popen(['sudo', '--stdin'] + command, stdin=PIPE, stderr=PIPE,
universal_newlines=True)
sudo_prompt = p.communicate(sudo_password + '\n')[1]
# should not get here
print('sudo return code = {}'.format(p.returncode))
print('sudo stderr = ' + sudo_prompt)