Заставить Python вводить пароль при запуске сценария csh
Вопрос
Я пишу сценарий Python, который выполняет сценарий csh в Solaris 10.Сценарий csh запрашивает у пользователя пароль root (который я знаю), но я не уверен, как заставить сценарий Python ответить на запрос паролем.Это возможно?Вот что я использую для выполнения сценария csh:
import commands
commands.getoutput('server stop')
Решение
Ознакомьтесь с pexpect модулем. Он предназначен для работы с интерактивными программами, что, как вам кажется.
Да, и помните, что жестко закодированный пароль пользователя root в скрипте оболочки или Python потенциально является дырой в безопасности: D
Другие советы
Использовать подпроцесс.Вызовите Popen(), чтобы создать свой процесс, и используйте communication(), чтобы отправить ему текст.Извините, забыл включить ТРУБУ..
from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate('password')
Вам лучше избегать пароля и попробовать такую схему, как sudo и sudoers.Pexpect, упомянутый в другом месте, не является частью стандартной библиотеки.
import pexpect
child = pexpect.spawn('server stop')
child.expect_exact('Password:')
child.sendline('password')
print "Stopping the servers..."
index = child.expect_exact(['Server processes successfully stopped.', 'Server is not running...'], 60)
child.expect(pexpect.EOF)
Сделал трюк! Pexpect правила!
Добавьте input =
в proc.communicate ()
для тех, кто любит использовать стандартную библиотеку lib.
from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate(input='password')
Должен быть в состоянии передать его как параметр. что-то вроде:
commands.getoutput('server stop -p password')
Кажется, это работает лучше:
import popen2
(stdout, stdin) = popen2.popen2('server stop')
stdin.write("password")
Но это еще не 100%. Даже при том, что " пароль " правильный пароль, который я до сих пор получаю su: Извините обратно из сценария csh, когда он пытается выполнить su для получения root-прав.
Чтобы избежать необходимости отвечать на вопрос о пароле в скрипте Python, я просто собираюсь запустить скрипт от имени пользователя root. На этот вопрос до сих пор нет ответа, но, думаю, сейчас я просто так сделаю.