【问题标题】:how to type sudo password when using subprocess.call?使用 subprocess.call 时如何输入 sudo 密码?
【发布时间】:2017-11-24 20:51:44
【问题描述】:

我定义了一个不时切换代理设置的函数, 问题是我希望它在没有人工干预的情况下循环运行。但是当我在 sudo 中执行程序时,它第一次被调用 en 运行顺利,第二次它要求我输入我的 sudo 密码。这是一段代码:

def ProxySetting(Proxy):
    print "ProxyStetting(Proxy)"
    call("networksetup -setwebproxy 'Wi-Fi' %s" "on" % Proxy, shell = True)
    call("networksetup -setsecurewebproxy 'Wi-Fi' %s" "on" % Proxy, shell = True)
    call("networksetup -setftpproxy 'Wi-Fi' %s" "on" %Proxy , shell=True)

我可以使用线程,但我确信有一种方法不会导致问题。如何对我的 sudo 密码进行硬编码,使其在函数开头运行?

【问题讨论】:

  • 最好使用systemd创建服务,并在服务配置文件中添加权限。
  • 我不知道我是否正确理解了您的问题,但您可能想看看我的回答stackoverflow.com/a/44540122/7738328,它谈到在subprocess 中使用sudo。但是,如上所述,最好完全避免使用sudo 执行命令。
  • 简单地说,除非我输入密码,否则这段代码不会运行。我想自动化该脚本意味着永远不必手动输入该密码。我将尝试 Mikael 解决方案,但不想为每个需要 root 命令的文件添加权限。
  • 但您可能更不想要的是将您的sudo 密码以明文形式保存在 Python 脚本中。
  • 可能将您的文件添加到 sudoers 会有所帮助。

标签: python subprocess call


【解决方案1】:

您可以在此处执行命令 sudo,而无需交互式提示要求您输入密码:

from subprocess import call    

pwd='my password'
cmd='ls'

call('echo {} | sudo -S {}'.format(pwd, cmd), shell=True)

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
  • 应该注意,在代码中以明文形式存储密码是一个安全问题,通常是不好的做法。
【解决方案2】:

另一种通过 python 将密码传递给 shell 命令的方法是:

p = subprocess.Popen(['sudo', self.resubscribe_script], stdin=subprocess.PIPE)
p.communicate('{}\n'.format(self.sudo_password))

请注意,使用communicate 将只允许向标准输入提供一个输入;还有其他获取可重用输入的方法。

【讨论】:

    猜你喜欢
    • 2012-03-31
    • 2018-10-17
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 2017-11-12
    相关资源
    最近更新 更多