我有以下脚本: getip.sh
#!/bin/bash
int_ip_addr=`/sbin/ifconfig pppoe0 | grep 'inet addr:' | cut -d: -f2| cut -d' ' -f1`
pb_ip_addr=`curl ipinfo.io/ip`
echo "Internal IP Address is $int_ip_addr"
echo "External IP Address is $pb_ip_addr"
if [ "$int_ip_addr" == "$pb_ip_addr" ]; then
echo "PPPoE IP is Public - $int_ip_addr";
else
echo "PPPoE IP is not Public - $int_ip_addr";
disconnect interface pppoe0; connect interface pppoe0
fi
除了执行命令“断开接口 pppoe0;连接接口 pppoe0”之外,它运行良好
Disconnect 和 Connect 用 whereis 搜索都没有路径。这些命令在终端中使用它们时工作正常,但是一旦我将它们放入脚本中,我就会得到这个:
./tmp/getip.sh:第 10 行:断开连接:找不到命令 ./tmp/getip.sh:第 10 行:连接:找不到命令
我尝试分解这些命令,或者只是尝试单独执行它们,但由于某种原因,这些命令对于 bash 根本不可用。
这是来自 unify 的 USG-3P 路由器上的 Linux 文件系统。
这些命令用于断开和重新连接 PPPoE 接口。
整个脚本的目的是检查内部 PPPoE 接口 IP 是否与外部看到的 IP 匹配。这是一个测试,看看我是否获得了 CGNAT IP 或 PUBLIC IP。
我想使用脚本重新连接,直到获得公共 IP。
我设法找到了罪魁祸首,看来该设备对这些命令有一些混淆保护,一些包装器之类的,我最终通过论坛找到了它。
这是脚本的最终版本,其中包含一个循环,该循环会重新连接,直到获得匹配的 IP 地址。
#!/bin/bash
int_ip_addr=`/sbin/ifconfig pppoe0 | grep 'inet addr:' | cut -d: -f2| cut -d' ' -f1`
pb_ip_addr=`curl ipinfo.io/ip`
echo "Internal IP Address is $int_ip_addr"
echo "External IP Address is $pb_ip_addr"
while [ "$int_ip_addr" != "$pb_ip_addr" ]; do
echo "PPPoE IP is not Public - $int_ip_addr";
/opt/vyatta/bin/vyatta-op-cmd-wrapper disconnect interface pppoe0;
/opt/vyatta/bin/vyatta-op-cmd-wrapper connect interface pppoe0;
echo "Sleeping for 30 seconds"
sleep 30s
int_ip_addr=`/sbin/ifconfig pppoe0 | grep 'inet addr:' | cut -d: -f2| cut -d' ' -f1`
pb_ip_addr=`curl ipinfo.io/ip`
echo "Internal IP Address is $int_ip_addr"
done
echo "PPPoE IP is Public - $int_ip_addr";