Заставьте python вводить пароль при запуске csh-скрипта - PullRequest
5 голосов
/ 23 октября 2008

Я пишу скрипт на python, который выполняет скрипт csh в Solaris 10. Скрипт csh запрашивает у пользователя пароль root (что я знаю), но я не уверен, как заставить скрипт python ответить на приглашение с пароль. Это возможно? Вот что я использую для выполнения сценария csh:

import commands

commands.getoutput('server stop')

Ответы [ 7 ]

7 голосов
/ 23 октября 2008

Посмотрите на модуль pexpect . Он предназначен для работы с интерактивными программами, что, как вам кажется.

Да, и помните, что жестко закодированный пароль пользователя root в оболочке или скрипте на python потенциально может стать дырой в безопасности: D

4 голосов
/ 23 октября 2008

Использовать подпроцесс . Вызовите Popen (), чтобы создать свой процесс, и используйте connect (), чтобы отправить ему текст. Извините, забыл включить ТРУБУ ..

from subprocess import Popen, PIPE

proc = Popen(['server', 'stop'], stdin=PIPE)

proc.communicate('password')

Лучше избегайте пароля и попробуйте такую ​​схему, как sudo и sudoers. Pexpect, упомянутый в другом месте, не является частью стандартной библиотеки.

1 голос
/ 01 мая 2009

Добавьте input= в proc.communicate() заставьте его работать, для парней, которые любят использовать стандартную библиотеку lib.

from subprocess import Popen, PIPE
proc = Popen(['server', 'stop'], stdin=PIPE)
proc.communicate(input='password')
1 голос
/ 26 ноября 2008
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 правила!

0 голосов
/ 24 октября 2008

Чтобы избежать необходимости отвечать на вопрос о пароле в скрипте Python, я просто собираюсь запустить скрипт от имени пользователя root. На этот вопрос до сих пор нет ответа, но, думаю, сейчас я просто так сделаю.

0 голосов
/ 23 октября 2008

Кажется, это работает лучше:

import popen2

(stdout, stdin) = popen2.popen2('server stop')

stdin.write("password")

Но это еще не 100%. Несмотря на то, что «пароль» является правильным паролем, я все еще получаю su: извините обратно из сценария csh, когда он пытается выполнить su для получения root-прав.

0 голосов
/ 23 октября 2008

Должен быть в состоянии передать его в качестве параметра. что-то вроде:

commands.getoutput('server stop -p password')
...