期待在bash脚本×16172

时间:2012-11-01 21:22:04

标签: bash

我尝试在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> 

2 个答案:

答案 0 :(得分:1)

尝试更改你的shebang:

#!/bin/bash

#!/bin/expect

并删除:

/usr/bin/expect <<- EOD

看看是否有效。

更新:如果您需要运行作为bash脚本的一部分,请将期望代码封装在一个单独的脚本中,期望shebang并从bash脚本中获取它,或者按照以下示例对其进行编码: / p>

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"

答案 1 :(得分:1)

问题是bash在期望看到脚本之前解释所有$variables。因此,您只是在没有给出主机名的情况下生成telnet。变化:

/usr/bin/expect <<- EOD

为:

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

这具有单引号整个here-document的效果 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
相关问题