使用subprocess.call时如何输入sudo密码?

时间:2017-06-21 19:30:51

标签: python subprocess call

我定义了一个偶尔切换我的代理设置的函数, 问题是我希望它在没有人工干预的循环中运行。但是当我在sudo中执行程序时,它会在第一次顺利运行时调用,第二次它会询问我的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密码,以便它在函数的开头运行?

2 个答案:

答案 0 :(得分:6)

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

from subprocess import call    

pwd='my password'
cmd='ls'

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

答案 1 :(得分:0)

将密码通过python传递给shell命令的另一种方法是不将其显示在任何命令历史记录或ps输出中:

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

请注意,使用communicate仅允许将一个输入提供给stdin。还有其他获取可重用输入的方法。