Заставить python ввести пароль при запуске csh-скрипта

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

import commands

commands.getoutput('server stop')

Я пропустил PIPE, новая версия работает ...

Douglas Mayle 23.10.2008 23:05

Впервые вижу используемые команды. Кстати, вы можете использовать модуль getpass, чтобы получить пароль из командной строки, не отображая его.

monkut 24.10.2008 07:20
Обязательная ссылка
Keith Thompson 02.09.2013 22:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
4
14 362
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

наш сценарий остановки сервера не имеет флага -p и, скорее всего, не получит его.

darrickc 30.10.2008 00:11

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

from subprocess import Popen, PIPE

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

proc.communicate('password')

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

Похоже, это не работает. Я продолжу исследовать popen.

darrickc 23.10.2008 22:34

Я получаю такой же ответ при использовании PIPE, как вы рекомендуете здесь. Сценарий останавливается с приглашением Пароль :.

darrickc 24.10.2008 00:08

Я не думаю, что это сработает, потому что сценарий csh выполняет команду su root -c "$ cmd0 $ *", чтобы попытаться выполнить su для получения root-прав. Процесс su будет отличаться от сценария остановки сервера.

darrickc 24.10.2008 00:19

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

import popen2

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

stdin.write("password")

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

Я думаю, вы перевернули stdin и stdout.

Federico A. Ramponi 23.10.2008 23:04

Нет, из API: возвращает файловые объекты (child_stdout, child_stdin)

darrickc 24.10.2008 00:03

К вашему сведению - popen2: «Не рекомендуется, начиная с версии 2.6: этот модуль устарел. Используйте модуль подпроцесса. Особенно проверьте раздел« Замена старых функций с модулем подпроцесса ».

monkut 24.10.2008 07:17

Да, я только что это заметил. Я переключил свой код обратно на модуль подпроцесса. Спасибо!

darrickc 24.10.2008 18:12

@darrick: Я неправильно сослался на os.popen2 вместо popen2.popen2. Как ни странно, порядок stdin и stdout в двух библиотеках разный ...

Federico A. Ramponi 24.10.2008 19:31
Ответ принят как подходящий

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

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

Да, pexpect был подходящим вариантом ... Я опубликовал ответ в конце этой ветки.

darrickc 26.11.2008 22:59

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

Не могли бы вы очистить и обобщить свои ответы?

Roman 05.10.2015 17:55
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(), чтобы запустить его, для парней, которым нравится использовать стандартную библиотеку.

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

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