Выполнение системных команд в сценарии bash — команда не найдена

У меня есть следующий скрипт: 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-адрес.

Что говорит type disconnect?

Barmar 07.05.2024 19:26

Я предполагаю, что это псевдоним или функция оболочки. Обычно они недоступны в сценариях.

Barmar 07.05.2024 19:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось найти виновника, похоже, на устройстве есть какая-то защита от обфускации этих команд, какая-то обертка, в итоге я нашел ее через форумы.

Вот окончательная версия сценария с циклом, который повторно подключается до тех пор, пока не будет получен соответствующий 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";

Другие вопросы по теме