【问题标题】:How to pass password part on linux -subprocess-os如何在 linux -subprocess-os 上传递密码部分
【发布时间】:2015-04-16 14:52:58
【问题描述】:

我正在尝试制作一个程序,允许我在用户需要时关闭或重新启动计算机。我会把这个发给我的朋友,所以我不知道是哪个操作系统。我也在使用 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上传递这个密码?

【问题讨论】:

  • 您希望这个程序如何运行?从命令行还是从 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 进行编辑。

标签: python linux operating-system subprocess python-3.4


【解决方案1】:

我认为这是不可能的,你必须禁用密码,否则你的程序就像你说的那样毫无用处。但我可能是错的;)

【讨论】:

  • 看起来更像是评论而不是答案
【解决方案2】:

直接调用 subprocess 或 Popen 不可能处理这个问题,因为这是一个等待用户输入的交互,你可以使用 pexepct 进行这种交互模式。 http://pexpect.readthedocs.org/en/latest/examples.html

【讨论】:

【解决方案3】:

您应该configure a passwordless /sbin/shutdown via your sudoers settings 而不是在脚本中硬编码密码。

不推荐,但可以将密码传递给sudobased on sudo mount example):

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

【讨论】:

    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 2016-12-16
    • 2017-06-23
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多