Как ввести пароль sudo при использовании 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 ответа

Решение

Здесь вы можете выполнить команду sudo без интерактивной подсказки с просьбой ввести ваш пароль:

from subprocess import call    

pwd='my password'
cmd='ls'

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

Другой способ передачи вашего пароля в команду оболочки через python, который не включает его появление в истории команд или ps вывод:

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

Обратите внимание, что с помощью communicate разрешит вводить только один ввод в stdin; Существуют и другие способы получения многократного ввода.

Другие вопросы по тегам