Как реализовать stdin, stdout обертку?

У меня есть интерактивная программа, которая запускает stdin и stdout. Мне нужно создать упаковщик, который будет отправлять X на его стандартный ввод, проверить, что он печатает Y, а затем перенаправить stdin и stdout оболочки на стандартный вывод и стандартный вывод программы так же, как программа будет выполняться напрямую.

Как это реализовать? X и Y могут быть жестко закодированы. Bash? Python?

Редактировать: Я не могу запустить программу дважды. Это должен быть один экземпляр. Вот псевдокод:

def wrap(cmd, in, expected_out):
  p = exec(cmd)
  p.writeToStdin(in)
  out = p.readBytes (expected_out.size())
  if (out != expected_out) return fail;
  # if the above 4 lines would be absent or (in == "" and out == "")
  # then this wrapper would be exactly like direct execution of cmd
  connectpipe (p.stdout, stdout)
  connectpipe (stdin, p.stdin)
  p.continueExecution() 
 Thanatos11 дек. 2009 г., 22:06
О, вау, я смотрел по этому вопросу всего несколько месяцев назад. (Создание сценариев для устройств Cisco, ограниченных сеансами Telnet ...) Хотел иметь сценарий для входа в систему (и, возможно, очистки) маршрутизатора, а затем сбросить консоль для меня. +1 тебе.

Ответы на вопрос(4)

Вы можете перезаписать sdin и stdout модуля sys

import sys
sys.stdin, sys.stdout = wrapper.stdin, wrapper.stdout

Это должны быть файловые объекты, открытые для чтения и записи соответственно. Оригинальные stdin и stdout находятся по адресу

sys.stdin, sys.stdout = sys.__stdin__, sys.__stdout__
 Łukasz Lew11 дек. 2009 г., 22:22
Оболочка может быть написана на python, но программа не может быть изменена.

что X и Y являются файлами, и что вы можете вызывать программу более одного раза:

#!/bin/bash

test "`program <X`" = "`cat Y`" && program

Или более подробно потерпеть неудачу:

#!/bin/bash

if [[ `program <X` != `cat Y` ]]; then
    echo -e "Assertion that input X produces Y failed, exiting."
    exit 1
fi

program

Если вы вызываете программу только один раз, Expect является гораздо более простой альтернативой, чем переназначение стандартного файлового ввода-вывода на лету.

 system PAUSE11 дек. 2009 г., 22:26
@ Лукаш, не могли бы вы отредактировать свой вопрос, чтобы добавить это требование?
 Łukasz Lew11 дек. 2009 г., 22:22
Это неправильное решение, так как второй экземпляр программы не будет иметь состояние первой программы.
Решение Вопроса

ожидать предназначен для автоматизации запуска других программ - по сути, вы пишете что-то вроде, в виде простого текста,

Запустите эту программу. Когда он напечатает слово «имя пользователя», отправьте ему мое имя пользователя. Когда он отправляет «пароль», отправьте ему мой пароль.

Это действительно здорово для вождения других программ.

 Baffe Boyois12 дек. 2009 г., 16:07
Да, сinteract команда.
 Łukasz Lew11 дек. 2009 г., 22:25
Может ли он (после выполнения некоторых команд) передать управление stdin / stdout?

что именно вы пытаетесь достичь; как я понимаю, вы хотите:

Запустите программу-оболочку, указав ввод X и ожидаемый вывод Y.Пусть обертка запустит целевую программу, подключив ввод X к ее стандартному входу и проверив, что ее вывод соответствует Y.Верните целевую программу и после проверки вывода перезапустите ее из того же экземпляра программы-оболочки, на этот раз с помощью программ-оболочек stdin и stdout.

Если это так, вы хотите сделать это:

Попросите программу-оболочку открыть каналы для стандартного ввода и вывода целевой программы.Вилкой и закройте соответствующие концы указанных труб.Имейте родительский процесс и проверьте вывод, в то время как дочернийexec()s и выполняет целевую программу.Дождитесь завершения дочернего процесса, когда закроется его стандартный вывод.Есть программа-оберткаexec() в целевую программу.Теперь целевая программа будет выполняться в обычном режиме.

Если это правильно, я могу предоставить ~ 30-строчную C-программу или ~ 10-строчную Python-программу, которая достигает этого.

 Łukasz Lew13 дек. 2009 г., 03:20
Это близко, я обновлю свой вопрос с псевдокодом.

Ваш ответ на вопрос