Как я могу очистить входной буфер в сценарии ожидания?

StackOverflow https://stackoverflow.com/questions/1877015

  •  18-09-2019
  •  | 
  •  

Вопрос

Я пишу сценарий Expect, и у меня возникают проблемы с приглашением оболочки (в Linux).Появляется скрипт My Expect rlogin и удаленная система использует ksh.Приглашение в удаленной системе содержит текущий каталог, за которым следует " > " (пространство больше пространства).Фрагмент сценария может быть:

send "some command here\r"
expect " > "

Это работает для простых команд, но все начинает идти не так, когда отправляемая мной команда превышает ширину терминала (точнее, то, что ksh думает, что это ширина терминала).В таком случае, ksh выполняет какую-то странную горизонтальную прокрутку интерактивной командной строки, которая, похоже, переписывает приглашение и добавляет в вывод дополнительный «>».Естественно, это приводит к тому, что сценарий Expect сбивается с толку и не синхронизируется, когда после выполнения команды в выходных данных появляется более одного приглашения (мой сценарий содержит несколько send/expect пары).

Я пробовал изменить PS1 в удаленной системе на что-то более характерное, например «подсказка>», но возникает аналогичная проблема, которая указывает мне на то, что это неправильный способ решения.

Я думаю, что я думаю, это возможность сценария сказать, что «я знаю, что я правильно синхронизирован с удаленной системой на данный момент, так что промыть входной буфер сейчас». А expect заявление имеет -notransfer флаг, который не делает отбросить входной буфер, даже если шаблон соответствует, поэтому я думаю, что мне нужно противоположное.

Существуют ли какие-либо другие полезные методы, которые я могу использовать, чтобы заставить удаленную оболочку вести себя более предсказуемо?Я понимаю, что Expect проделывает большую работу, чтобы убедиться, что порожденный сеанс появляется быть интерактивным для удаленной системы, но я бы предпочел, чтобы некоторые из наиболее раздражающих интерактивных функций (таких как горизонтальная прокрутка ksh) быть выключен.

Это было полезно?

Решение

Если вы хотите выбросить весь вывод, полученный Expect до сих пор, попробуйте

expect -re $

Это совпадение с регулярным выражением для $, что означает конец входного буфера, поэтому он просто пропустит все полученное до сих пор.Более подробная информация на Ожидайте справочную страницу.

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

Вы можете попробовать «set -o multiline» или COLUMNS=1000000 (или другое достаточно большое значение).

Раньше у меня были трудности с ksh и Expect.Моим решением было использовать что -то другое, кроме KSH для оболочки входа в систему.

Если вы можете изменить удаленный вход в систему на другой, кроме ksh (с помощью команды chsh или редактирования /etc/passwd), вы можете попробовать это с /bin/sh в качестве оболочки.

Другая альтернатива — сообщить KSH, что терминал является тупым терминалом — запретить ему выполнять какую-либо специальную обработку.

$ export TERM=""

может сработать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top