linux - 在 expect 脚本中运行 shell 命令作为对生成操作的 react

标签 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. 使用set timeout -1 来等待更长时间的文本。默认情况下,expect 只等待 10 秒。

  2. 像脚本一样使用 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

关于linux - 在 expect 脚本中运行 shell 命令作为对生成操作的 react ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41282935/

相关文章:

linux - 从文件中读取零长度

bash - 在执行命令之前等待网络接口(interface)

arrays - bash 将 XML 解析为多维数组

linux - 如何在 Linux 中安排作业和传递参数并并行运行

linux - 我的模式匹配出了什么问题?

c++ - 在 linux ubuntu 服务器 11.10 (vps) 上使用 asio 使用 C++ 进行编译

python - 降级python版本

linux - linux fsync 会同步文件的 xattr 吗?

php - 检查 rtmp-stream 是否正在运行并使用 PHP/Shell-Script/Ruby 启动 ffmpeg

交互式代码中的pythonrc