同じことに関するいくつかの投稿がありますが、それでも期待スクリプトを正しく機能させることができません。私の意図はすべてを自動化することですが、パスワードはユーザーに入力したままにしておきます。したがって、スクリプトには3つの部分があります。
だから私はスポーンされ、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を使用しています
あなたは読むことができます (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] #
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
の下に置くことができるため、スクリプトで実行できます。