У меня есть следующий скрипт: 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"
Отключить и подключиться не имеют пути, если искать с помощью командыwhereis. Команды работают нормально при использовании их в терминале, но как только я добавляю их в скрипт, я получаю следующее:
./tmp/getip.sh: строка 10: отключение: команда не найдена ./tmp/getip.sh: строка 10: подключение: команда не найдена
Я пытался разбить команды на части или просто попытаться выполнить их отдельно, но по какой-то причине эти команды просто недоступны для bash.
Это файловая система Linux на маршрутизаторе USG-3P от unify.
Команды предназначены для отключения и повторного подключения интерфейса PPPoE.
Целью всех сценариев является проверка, соответствует ли IP-адрес внутреннего интерфейса PPPoE внешнему IP-адресу или нет. Это тест, чтобы узнать, получил ли я IP-адрес CGNAT или ПУБЛИЧНЫЙ 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";
Что говорит
type disconnect
?