web-dev-qa-db-ja.com

期待し、相互作用し、そして再び期待する

同じことに関するいくつかの投稿がありますが、それでも期待スクリプトを正しく機能させることができません。私の意図はすべてを自動化することですが、パスワードはユーザーに入力したままにしておきます。したがって、スクリプトには3つの部分があります。

  1. 自動ログイン
  2. パスワードを入力するためのユーザーインタラクションを提供する
  3. 作業を続行するには、Expectスクリプトに制御を戻します

だから私はスポーンされ、3つの読み取りコマンドを持つスクリプトを持っています。最初と最後はExpectで満たされ、2番目は自分自身に入りたいと思います。

#!/bin/ksh
read user?User:
echo "Expect entered the username $user"
read pass?Password:
echo "User entered the password $pass"
read command?"Shell>"
echo "Expect entered the command $command"

私の期待するスクリプト:

#!/usr/bin/expect
spawn ./some_script
expect User
send I-am-expect\r
expect Password
interact
expect Shell
send I-am-expect-again

残念ながら、パスワードを入力した後、スクリプトは続行されず、対話モードのままになります。

[root@localhost ~]# ./my-expect
spawn ./some_script
User:I-am-expect
Expect entered the username I-am-expect
Password:i am user
User entered the password i am user
Shell>

そして最後に、「シェル」に何かを入力して[ENTER]を押すと、次のエラーで終了します。

Expect entered the command
expect: spawn id exp4 not open
    while executing
"expect Shell"
    (file "./my-expect" line 7)
[root@localhost ~]#

私はこの問題の説明や解決策を認めます。私はexpectバージョン5.45を使用しています

5
Petras L

あなたは読むことができます (expect_user)ユーザーのパスワードを自分で作成してから、生成されたプログラムにsendします。例えば:

[STEP 101] # cat foo.exp
proc expect_Prompt {} \
{
    global spawn_id
    expect -re {bash-[.0-9]+(#|\$)}
}

spawn ssh -t 127.0.0.1 bash --noprofile --norc
expect "password: "

stty -echo
expect_user -timeout 3600 -re "(.*)\[\r\n]"
stty echo
send "$expect_out(1,string)\r"

expect_Prompt
send "exit\r"
expect eof
[STEP 102] # expect foo.exp
spawn ssh -t 127.0.0.1 bash --noprofile --norc
[email protected]'s password:
bash-4.3# exit
exit
Connection to 127.0.0.1 closed.
[STEP 103] #
3
pynexj

interactは、終了基準に適切な条件で指定する必要があります。

次のスクリプトは、シェルでユーザーコマンドを実行します

exeCmds.sh

#!/bin/bash
read -p "User: " user
echo "Expect entered the username $user"
read -p "Password: " pass
echo "User entered the password $pass"
while :
do
        # Simply executing the user inputs in the Shell
        read -p "Shell> " command
        $command
done

automateCmdsExec.exp

#!/usr/bin/expect 
spawn ./exeCmds.sh
expect User
send dinesh\r
expect Password
send welcome!2E\r
expect Shell>
puts "\nUser can interact now..."
puts -nonewline "Type 'proceed' for the script to take over\nShell> "
while 1 {
        interact "proceed" {puts "User interaction completed.";break}
}
puts "Script take over the control now.."

# Now, sending 'whoami' command from script to Shell
send "whoami\r"
expect Shell>

# Your further code here...

スクリプト automateCmdsExec.expはbashスクリプトのログインニーズに対応し、プロンプトが到着すると、ユーザーに制御を渡します。

Word interactを使用したproceedの終了基準を定義する必要があります。 (必要に応じて変更できます)。

interactが単語proceedと一致したら。コントロールをexpectスクリプトに戻します。

デモの目的で、もう1つのsend-expectペアのコマンドを保持しました。

つまり.

send "whoami\r"
expect Shell>

さらにコードをinteractの下に置くことができるため、スクリプトで実行できます。

2
Dinesh