Использование traceroute в операторе if в сценарии bash

Я пытаюсь выполнить код в зависимости от того, получает ли traceroute ответ с определенного IP-адреса. Так:

if traceroute 123.456.78.9
then
   option 1
else
   option 2

Моя проблема в том, что независимо от того, получаю я ответ с IP-адреса или нет, всегда выполняется вариант 1.

Я пробовал использовать ping вместо traceroute, и он работает, но у меня нет возможности использовать ping в окончательном коде.

Подробнее:

  1. Работает в ОС QNX
  2. Успех определяется ответом хоста, а неудача - отсутствием ответа хоста.
  3. Результат успеха:

    traceroute to 123.456.78.9 (123.456.78.9), 1 hops max, 40 byte packets
     1  123.456.78.9 (123.456.78.9)  0.000 ms  1.000 ms  0.000 ms
    
  4. Вывод отказа:

    traceroute to 123.456.78.90 (123.456.78.90), 1 hops max, 40 byte packets
     1  *
    

Запустите traceroute 123.456.78.9, а затем echo $?, чтобы проверить статус выхода. Если это 0, это считается успехом. Если это 1, это считается отказом.

Charles Duffy 03.10.2018 15:32

Если traceroute всегда сообщает об успешном завершении работы, даже если он не может связаться с удаленной системой, сообщите об этом поставщику операционной системы - это они предоставили вам traceroute; это не часть bash. OTOH, если вы хотите прочитать стандартный вывод traceroute и оттуда определить успех или неудачу, мы можем это сделать, но вам нужно будет предоставить много дополнительную информацию в вашем вопросе (в частности, образец вывода как в случае успеха, так и в случае неудачи, а также подробности о что вы ожидаете считать неудачей). Без этих подробностей ответы будут работать только в ОС, запущенной отвечающим.

Charles Duffy 03.10.2018 15:32

Спасибо за ваш ответ. Я добавил больше деталей на основе вашего комментария. Кроме того, я не совсем уверен, как проверить статус выхода с помощью echo $, как вы упомянули выше.

Jon B. Jones 03.10.2018 16:39
echo $?. ? является его частью. Сравните true; echo $? с false; echo $?. Вы увидите, что первое значение равно 0 (статус выхода, который if и другие условные выражения будут рассматривать как успех), а второе - 1 (которое, как и любое другое ненулевое значение, рассматривается как сбой).
Charles Duffy 03.10.2018 17:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
1 163
1

Ответы 1

Проблема в том, что traceroute всегда отображает вывод, даже если нет действительного хоста, поэтому вам нужно сначала проверить действительные ответы.

Вы должны проверить, получен ли действительный ответ или нет

Попробуйте использовать

n=`traceroute 123.456.78.9|grep ms|wc|sed 's/ //g' |cut -d ' ' -f 1`

if [ $n -eq 0 ]                                                         
then
    echo 'failed'
else
    echo 'success'
fi

Если ms вообще обнаруживается только в случае успеха, не может ли это быть просто if traceroute 123.456.78.9 | grep -q ' ms'; then echo success; else echo failed; fi? Трубопровод кажется излишним.

Charles Duffy 03.10.2018 17:10

(Кроме того, как заметил бы shellcheck.net, лучше цитировать расширения, как в [ "$n" -eq 0 ]; таким образом, если вы каким-то образом закончили с пустым значением для n, вы получите более полезное сообщение об ошибке от test).

Charles Duffy 03.10.2018 17:12

Спасибо за это уточнение

Yasien Dwieb 03.10.2018 22:40

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