运行 shell 期望脚本中的命令作为对衍生动作的反应
Run shell commands in expect script as reaction to spawned action
我正在尝试为 FortiClient VPN
连接创建期望脚本。我的解决方案基于 ,效果非常好。
连接成功后,会提示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"
现在我有两个问题。
exec
脚本在 "STATUS::Tunnel running\r"
出现在屏幕上之前启动。这可能是因为没有 {}
但如果我添加它们 - 它根本不起作用。
- 我想将所有内容都放在一个文件中,所以基本上我需要将
bash
命令移动到 expect
脚本并直接调用它们。怎么做?
好的,我知道是怎么回事了。
最终答案是:
使用set timeout -1
等待更长时间的文本。默认情况下 expect
只等待 10 秒。
使用 tcl
中的 exec
就像使用脚本一样(来源:http://www.tek-tips.com/viewthread.cfm?qid=194125)
完整答案:
#!/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
我正在尝试为 FortiClient VPN
连接创建期望脚本。我的解决方案基于 ,效果非常好。
连接成功后,会提示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"
现在我有两个问题。
exec
脚本在"STATUS::Tunnel running\r"
出现在屏幕上之前启动。这可能是因为没有{}
但如果我添加它们 - 它根本不起作用。- 我想将所有内容都放在一个文件中,所以基本上我需要将
bash
命令移动到expect
脚本并直接调用它们。怎么做?
好的,我知道是怎么回事了。
最终答案是:
使用
set timeout -1
等待更长时间的文本。默认情况下expect
只等待 10 秒。使用
tcl
中的exec
就像使用脚本一样(来源:http://www.tek-tips.com/viewthread.cfm?qid=194125)
完整答案:
#!/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