2009-12-11 5 views
3

У меня есть интерактивная программа, которая запускает stdin и stdout. Мне нужно создать оболочку, которая отправит X в stdin, проверьте, что она печатает Y, а затем перенаправляет stdin и stdout обертки на stdout и stdout программы, так же, как программа будет выполняться напрямую.Как реализовать 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() 
+2

О, ничего себе, я рассматривал линии этого вопроса всего несколько месяцев назад. (Сценарии устройств Cisco ограничены сеансами Telnet ...) Хотелось иметь скрипт для входа (и, возможно, очистки) маршрутизатора, а затем отпустите консоль для меня. +1 к вам. – Thanatos

ответ

3

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

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

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

+0

Может ли он (после выполнения некоторых команд) управлять stdin/stdout? –

+1

Да, с командой 'interactive'. –

1

Предполагая, что 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 является гораздо более простой альтернативой, чем переназначение стандартных операций ввода-вывода файлов на лету.

+0

Это неправильное решение, так как второй экземпляр программы не будет иметь состояние первой программы. –

+0

@ Łukasz, не могли бы вы отредактировать свой вопрос, чтобы добавить это требование? –

0

Вы можете перезаписать стандартный ввод модуля SYS, и стандартного вывод

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

Они должны быть объекты файла открыты для чтения и записи соответственно. Оригинальный STDIN и STDOUT найдены в

sys.stdin, sys.stdout = sys.__stdin__, sys.__stdout__ 
+0

Wrapper может быть написан на python, но программа не может быть изменена. –

0

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

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

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

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

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

+0

Точно, я обновляю свой вопрос с псевдокодом. –

Смежные вопросы