Я совершенно новичок в использовании "ожидаю" и совершенно не понимаю этого. Моя проблема в том, что я использовал "encfs" для защиты некоторых файлов некоторое время назад, и хотя я оставил себе текстовый файл, который содержал запутанные подсказки о пароле, я не могу вспомнить / угадать его. Итак, я почти уверен, что это одна из серии, возможно, сотни перестановок, и я подумал, что будет легко использовать, ожидаю попробовать их для меня. Пока что там тоже не повезло!

Я думаю, у ожидаемого есть язык сценариев, но я не вижу, где он определен (и я надеялся не изучать весь язык программирования только для этого!)

Во всяком случае, я создал этот сценарий с помощью копирования-угадай-и-скрипки:

#!/usr/bin/expect
set password [lindex $argv 0]
spawn echo Trying $password
spawn /usr/bin/encfs /home/simon/.safe /home/simon/safe
expect "Password: "
send "$password\r";
interact

Который проверяет один пароль и, кажется, работает, когда я использую его во вновь созданной системе Encfs. Однако затем я попытался запустить его для всех перестановок, которые я создал в файле под названием "попытки". Я сделал это, используя другой скрипт:

#!/bin/bash

while read line
do
  echo trying $line
#  ./breakone.sh "$line"
  echo Status is $?
done < tries

(первый файл называется «breakone.sh»). Если я запускаю скрипт в показанной форме, он перебирает строки текста в файле "try". Но если я раскомментирую вызов ожидаемого сценария, он сразу же выпадет после первого ввода ожидающего сценария. Кроме того, он выпадает сразу. Обычно ожидают, что сделают короткую паузу (возможно, ~ 1/2 секунды) и сообщат, что пароль неверный. Но при запуске из основного сценария он немедленно возвращается к вызывающему сценарию (я знаю, что он возвращается к вызывающей программе, поскольку он печатает состояние, и итерация немедленно завершается.

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

Любые предложения будут приветствоваться!

(Правка, я пытался перейти от чтения файла к использованию здесь-документа, но это ничего не изменило).

1 ответ1

1

Быстрое решение состоит в том, чтобы использовать другой дескриптор файла для цикла чтения:

while read line <&3
do
  echo trying $line
  ./breakone.sh "$line"
  echo Status is $?
done 3< tries

Это оставляет стандартный по умолчанию

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .