Форум сайта python.su
Суть проблемы такая, есть скрипт из которого запускается сторонний скрипт. Но этот сторонний скрипт просит несколько раз вести Y. С первым разом все впорядке, communicate(input=b'Y') выполняет задачу, после этого нужно сразу же послать еще один такой же communicate(input=b'Y'). Как это сделать?
Решения с помощью pexpect не подходит, пробовал уже.
Вот сам вызов процесса
out, err = Popen('sqlmap -u ' + '"' + site + '"' + ' --dbs', shell=True, stdin=PIPE, stdout=PIPE).communicate(input=b'Y')
Офлайн
Не используйте communicate. Вы можете вызывать
sp = subprocess.Popen(...)
Офлайн
все равно, при первой же попытке виснет
sp = subprocess.Popen(['sqlmap -u ' + '"' + site + '"' + ' --dbs'], shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) sp.stdin.write(b'Y')
Офлайн
для этого предназначен pexpect. Если он не работает то покажите как вы это делали. Если pexpect не может то скорее всего вам ничто не поможет.
Если вы управляете скриптом на питоне то правильнее будет заглянуть внутрь найти нужные фукнкции импортировать в свой скрипт и использовать (Или посмотреть документацию по АПИ). То что вы делаете напоминает удаление гландов через ж… :). Управление через pexct это крайнее средство.
Вообще нормально построенный скрипт не должен просить подтверждений. Посоветую вам поменять его или вообще сменить инструментарий.
p.s.
Абсолютно очевидно write(“Y”) недостаточно. ВЫ же реально enter нажимаете? почему вы перевод строки не отослали?
Отредактировано doza_and (Сен. 29, 2016 07:37:59)
Офлайн
Вопрос закрыт, решение нашел.
нудно было дополнить кое что, после вызова метода stdin.write('Y'), нудно было его закрыть методом stdin.close(), и тогда работает все как надо. Спасибо за помощь и советы.
Офлайн
Не надо было так делать. Давайте я вам на конкретном примере покажу как надо было. Напишем консольную программу, которая будет ожидать неоднократный ввод данных от пользователя:
john_16@Linux-home ~/bin $ cat one.py print('Enter X:') x = input() print('Enter Y:') y = input() print('x + y = {}'.format(sum(map(int, (x, y)))))
john_16@Linux-home ~/bin $ python3 one.py Enter X: 1 Enter Y: 2 x + y = 3
john_16@Linux-home ~/bin $ cat two.py from subprocess import Popen, PIPE sp = Popen('python3 one.py', shell=True, stdout=PIPE, stdin=PIPE) for value in sp.stdout: print('Get line: {}'.format(value)) if b'Enter' in value: print('Send value') sp.stdin.write(b'2\n') sp.stdin.flush() print('Finish')
john_16@Linux-home ~/bin $ python3 two.py Get line: b'Enter X:\n' Send value Get line: b'Enter Y:\n' Send value Get line: b'x + y = 4\n' Finish
Офлайн
JOHN_16Спасибо, за подробный ответ, я приму к сведению)
Не надо было так делать. Давайте я вам на конкретном примере покажу как надо было. Напишем консольную программу, которая будет ожидать неоднократный ввод данных от пользователя:
Офлайн