3

bashでexpectスクリプトを設定しようとしています。

#!/bin/bash


/usr/bin/expect <<- EOD

set router 192.168.0.251
set user admin
set pass test  
set timeout 1000  
set filesave [exec date +%m-%d-%Y]  


spawn telnet $router
send "\n"  
expect "Username:"
send "$user\n"
expect "Password:"  
send "$pass\n"  
expect ">"  
send "en\n"  
expect "Password:"  
send "$pass\n"  

send "term len 0\n"  
log_file $router--$filesave.cfg
send "show running-config\n"  
expect "end\r"  
send "\n"  
log_file
send "exit\n"  
EOD

cat /Users/test/Desktop/python/$router--$filesave.cfg | grep end
exit 0

私はちょうどこの出力を得ました

./script2 
spawn telnet

telnet> telnet> 
4

2 に答える 2

1

シバンを次の場所から変更してみてください。

#!/bin/bash

#!/bin/expect

削除します:

/usr/bin/expect <<- EOD

そして、それが機能するかどうかを確認します。

更新:expectをbashスクリプトの一部として実行する必要がある場合は、expectコードをexpect shebangを使用して別のスクリプトにカプセル化し、bashスクリプトから取得するか、次の例のようにエンコードします。

expect_sh=$(expect -c "
spawn ssh $login@$IP
expect \"password:\"
send \"$password\r\"
expect \"#\"
send \"cd $dest_dir\r\"
expect \"#\"
send \"chmod +x $server_side_script $other_script\r\"
expect \"#\"
send \"./$device_side_script\r\"
expect \"#\"
send \"cat $deploy_count\r\" 
expect \"#\"
send \"exit\r\"
")

echo "$expect_sh"
于 2012-11-01T21:25:04.677 に答える
1

問題は、bash が$variablesスクリプトを参照する前にすべてを解釈していることです。したがってtelnet、ホスト名を指定せずに単純に生成しています。変化する:

/usr/bin/expect <<- EOD

に:

/usr/bin/expect <<- 'EOD'

これには、ヒアドキュメント全体を単一引用符で囲む効果があります。
http://www.gnu.org/software/bash/manual/bashref.html#Here-Documents

次の bash コマンド ( cat /Users/...) は、Expect で定義された変数に依存していることにも注意してください。それらは bash では定義されていません。これを試して

#!/bin/bash

export router=192.168.0.251
export filesave=$(date +%m-%d-%Y)

/usr/bin/expect <<- 'EOD'

set router $env(router)
set filesave $env(filesave)
# the rest stays the same
于 2012-11-01T23:57:03.803 に答える