Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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 如何在linux子进程操作系统上传递密码部分_Python_Linux_Operating System_Subprocess_Python 3.4 - Fatal编程技术网

Python 如何在linux子进程操作系统上传递密码部分

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", "-

我正在尝试制作一个程序,允许我在用户需要时关闭或重新启动计算机。我会把这个发给我的朋友,这样我就不知道是哪个操作系统了。我也在使用tkinter,下面是一个示例代码

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)