Как заставить "ожидать" включения и выключения интерактивного режима? - PullRequest
0 голосов
/ 29 марта 2012

Я пишу свой первый ожидаемый скрипт для запуска gvfs-mount.Я бы хотел, чтобы ожидаемый текст отвечал на запросы до «Пароль:», чтобы я мог ввести пароль, а затем переключился обратно в неинтерактивный режим для завершения.

Я хочу изменить этот сценарий, сгенерированныйautoexpect и немного обезличено мной:

#!/usr/bin/expect -f
set timeout -1
spawn gvfs-mount {smb://my-userid@10.253.x.y/my-userid$}
match_max 100000
expect -exact "Password required for share my-userid\$ on 10.253.x.y\r\nDomain \[WORKGROUP\]: "
send -- "my-domain\r"
expect -exact "my-domain\r\nPassword: "
send -- "my-password\r"
expect eof

Простое изменение -exact на -i во время второй отправки переводит весь скрипт в состояние, в котором он ожидает ввода домена, но не читает клавиатуруили «отправить».Я предполагаю, что это связано с тем, что gvfs-mount вызывается в фоновом процессе, не привязанном к стандартному стандартному стандарту.

Итак, как мне переключать интерактивность некоторых «ожидаемых»?

1 Ответ

1 голос
/ 29 марта 2012

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

expect "*?assword:*" {
  stty -echo
  if {[string length $lpass] < 1} {
    expect_user {
      -re "(.*)\n" {set lpass "$expect_out(1,string)"}
      timeout {exp_continue}
    }
  }
  send -- "$lpass\r"
}
stty echo

Вы также можете переходить и выходить из взаимодействий, помещая возврат внутрьблок, подобный следующему:

interact -nobuffer -re "goodbye\r" {
  return
}
send_user -- "you're no longer interacting with the spawned process\n"

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

...