2012-11-01 73 views
3

我尝试在bash中设置期望脚本。期望在bash脚本中×16172

#!/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> 
+0

你希望那么输出什么。 –

回答

1

尝试从改变你的家当:

#!/bin/bash 

#!/bin/expect 

,并删除:

/usr/bin/expect <<- EOD 

然后看看是否有效。

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

expect_sh=$(expect -c " 
spawn ssh [email protected]$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" 
+0

是的,这工作,但我想继续与bash脚本。所以我决定把它放在一个脚本中。 – Reelx

+0

@Reelx看看更新的答案是否对ya有帮助。 –

1

的问题是,庆典正在解释所有$variables之前期望看到的脚本。因此你只是产生了telnet而没有给出主机名。更改:

/usr/bin/expect <<- EOD 

到:

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

这有单引号整个here文档的效果。也
http://www.gnu.org/software/bash/manual/bashref.html#Here-Documents

注意,接下来的bash命令(cat /Users/...)依赖于定义的变量期待 - 他们不是在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