Действительно ли возможно заставить сценарий оболочки удара взаимодействовать с другой программой командной строки?

Я использую интерактивную программу командной строки в терминале Linux выполнение оболочки удара. У меня есть определенная последовательность команды, которую я ввел к программной оболочке. Программа пишет свой вывод в стандартный вывод. Одна из этих команд является командой 'сохранения', которая пишет вывод предыдущей команды, которая была выполнена в файл к диску.

Типичный цикл:

$prog
$$cmdx
$$<some output>
$$save <filename>
$$cmdy
$$<again, some output>
$$save <filename>
$$q
$<back to bash shell>
  • $ является подсказкой удара
  • $$ является подсказкой программы
  • q является командой выхода для прогр
  • прогр такова, что добавляет вывод предыдущей команды к имени файла

Как я могу автоматизировать этот процесс? Я хотел бы записать сценарий оболочки, который может запустить эту программу и цикл через шаги, подав его команды один за другим и, и затем выход. Я надеюсь, что команда сохранения работает правильно.

8
задан rup 10 August 2010 в 11:35
поделиться

5 ответов

Если вашей команде все равно, насколько быстро вы вводите ее, и вам действительно не нужно взаимодействовать с ней , тогда вы можете использовать heredoc.

Пример:

#!/bin/bash
prog <<EOD
cmdx
save filex
cmdy
save filey
q
EOD

Если вам нужно ветвление на основе вывода программы, или если ваша программа вообще чувствительна к времени выполнения ваших команд, тогда Expect - это то, что вам нужно.

15
ответ дан 5 December 2019 в 04:59
поделиться

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

11
ответ дан 5 December 2019 в 04:59
поделиться
echo "cmdx\nsave\n...etc..." | prog

..?

0
ответ дан 5 December 2019 в 04:59
поделиться

Для простых случаев использования вы можете использовать комбинацию подоболочки, эха и сна:

# in Terminal.app
telnet localhost 25
helo localhost
ehlo localhost
quit

(sleep 5; echo "helo localhost"; sleep 5; echo "ehlo localhost"; sleep 5; echo quit ) | 
   telnet localhost 25 
1
ответ дан 5 December 2019 в 04:59
поделиться

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

for i in <list of machines> ; do expect_script.sh $i ; exit

Это установит ssh в каждое поле, запустит команды резервного копирования, скопирует соответствующие файлы, а затем перейдет к следующему ящику.

2
ответ дан 5 December 2019 в 04:59
поделиться