2012-02-27 14 views
1

Linuxマシンがログイン後にパスワードを要求すると、次のexpectスクリプトがうまく動作します。しかし、私たちのLinuxマシンの中には、SSHのパスワードを必要としないものがあります(私たちはパスワードなしでログインできます)ので、パスワードなしのマシンをサポートするためにexpectスクリプトを変更する必要があります。どうやってやるの?パスワードを必要としないマシンでexpectベースのSSHスクリプトが動作するように変更する

$ expect_test=`cat << EOF 
set timeout -1 
spawn ssh $IP hostname 
    expect { 
       ")?" { send "yes\r" ; exp_continue } 
       word: {send "pass123\r"  } 
    } 
expect eof 
EOF` 

$ expect -c "$expect_test" 

パスワードを必要とするマシン上で実行されている:パスワードを必要としないマシン上で実行している場合

$ IP=10.17.18.6 
$ expect -c "$expect_test" 
spawn ssh 10.17.18.6 hostname 
sh: /usr/local/bin/stty: not found 
This computer system, including all related equipment, networks and network devices  (specifically including Internet access),is pros 
yes 
Password: 
Linux1_machine 

:あなたからタイムアウト

$ IP=10.10.92.26 
$ expect -c "$expect_test" 
spawn ssh 10.10.92.26 hostname 
sh: /usr/local/bin/stty: not found 
Linux15_machine 
expect: spawn id exp5 not open 
while executing 
"expect eof" 

答えて

1

このコマンドを期待して使用します。

expect { 
    ")?" {send "yes\r";  exp_continue} 
    word: {send "pass123\r"; exp_continue} 
    eof 
} 

そのように、EOFが前に遭遇した場合は、 "パスワード:"、スクリプトが正常に動作します。

+0

パスワードは一度だけ送信することにします。幸いにも、それは少し余分なロジックで実行するのは簡単です。 –

+0

すばらしい答えがうまくいった –

0

変更を-1これは、期待される文字列が指定されたタイムアウト内に現れない場合、次の行に移動することを期待します。

現在の値-1は、パスワードが要求されない場合、永久にブロックされます。

UPDATE:

set timeout 5 
spawn ssh $IP hostname 
     expect { 
       ")?" { send "yes\r" ; exp_continue } 
       word: {send "pass123\r"  } 
       eof {exit} 
     } 
+0

私は10に設定しましたが、引き続きエラーが発生します:> expect:spawn id exp5 "expect eof"を実行していません –

+0

スクリプト内のタイムアウト行のすぐ上にexp_internal 1を追加し、また、単語 " – Kristofer

+0

"の下の新しい行に最初のexpect部分の中にeof {exit}を追加してください。どこに "eof"を追加すればいいですか?あなたのスクリプトをaddtional eofで更新できますか? –

関連する問題