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