在expect脚本中运行shell命令作为对生成操作的反应

时间:2016-12-22 12:12:12

标签: linux bash shell tcl expect

我正在尝试为FortiClient VPN连接创建一个期望脚本。我的解决方案基于https://stackoverflow.com/a/19348728/1549135,效果非常好。

成功连接后,会显示一条消息STATUS::Tunnel running然后我必须更改我的route设置,以便只有特定范围的IP可以在VPN上运行。我尝试在一个expect脚本中完成它。

我设法制定了这样一个有效的解决方案:

#!/usr/bin/expect

spawn /opt/forticlient-sslvpn/64bit/forticlientsslvpn_cli --server $server_ip --vpnuser $user
expect "Password for VPN:" {send $password}
expect "to this server? (Y/N)\r" {send "y\r"}

expect "STATUS::Tunnel running\r" 
exec >@stdout 2>@stderr ./enable_internet.sh

interact

enable_internet.sh

#!/bin/bash
sudo route del default ppp0
sudo route add -net 172.20.0.0 netmask 255.255.0.0 dev ppp0
echo "Internet Enabled"

现在我有两个问题。

  1. exec脚本会在"STATUS::Tunnel running\r"出现在屏幕上之前启动。这可能是因为没有{}但如果我添加它们 - 它根本不起作用。
  2. 我希望将所有内容都放在一个文件中,所以基本上我需要将bash命令移动到expect脚本并直接调用它们。怎么做?

1 个答案:

答案 0 :(得分:0)

好的,我已经知道发生了什么。

最终答案是:

  1. 使用set timeout -1等待文本更长时间。默认情况下,expect仅等待10秒。

  2. 使用exec中的tcl,就像使用脚本一样(来源:http://www.tek-tips.com/viewthread.cfm?qid=194125

  3. 完整答案:

    #!/usr/bin/expect -f
    
    spawn /opt/forticlient-sslvpn/64bit/forticlientsslvpn_cli --server $server_ip --vpnuser $user
    expect "Password for VPN:" {send $password}
    expect "to this server? (Y/N)\r" {send "y\r"}
    
    set timeout -1
    expect "Tunnel running" {
        sleep 2
        exec >@stdout 2>@stderr route del default ppp0 
        exec >@stdout 2>@stderr route add -net 172.20.0.0 netmask 255.255.0.0 dev ppp0
        send_user "Internet Enabled\r"
    }
    
    interact