2008-10-23 9 views
5

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

import commands 

commands.getoutput('server stop') 
+0

Я ушел из PIPE, новая версия работает ... – 2008-10-23 19:05:45

+0

Первый раз, когда вы видите используемые команды. BTW - вы можете использовать модуль getpass для захвата пароля из командной строки без его отображения. – monkut 2008-10-24 03:20:30

+1

[Обязательная ссылка] (http://www.perl.com/doc/FMTEYEWTK/versus/csh.whynot) – 2013-09-02 18:28:38

ответ

7

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

О, и помните, что пароль жесткого декодирующиющим Рута в раковине или питона скрипт потенциально дыра в безопасности: D

0

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

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

наш скрипт остановки сервера не имеет флага -p и вряд ли получит его. – darrickc 2008-10-29 21:11:31

3

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

from subprocess import Popen, PIPE 

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

proc.communicate('password') 

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

+0

Это не работает. Однако я продолжу расследование. – darrickc 2008-10-23 18:34:53

0

Это, кажется, работает лучше:

import popen2 

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

stdin.write("password") 

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

0

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

1
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

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

from subprocess import Popen, PIPE 
proc = Popen(['server', 'stop'], stdin=PIPE) 
proc.communicate(input='password')