Bash скрипт для проверки связи с условием while - PullRequest
1 голос
/ 04 апреля 2020

Во-первых, я хотел бы сказать, что ничего не знаю о bash, но я пытаюсь учиться на практике.

Итак, я пытаюсь создать сценарий, который пошлет волхвов c пакет на удаленный хост. Пока запускается удаленный хост, я хотел бы печатать точки на дисплее.

У меня действительно нет проблем с частью wakeonlan, и, конечно, мне не нужен скрипт для этого. Однако, чтобы узнать что-то полезное, я пытаюсь создать скрипт.

Итак, мой код:

#!/bin/bash 

! timeout 0.5 ping -c1 8.8.8.8 > /dev/null 2>&1
if [ $? -eq 1 ]
then
    echo "Host is up"
else
    wakeonlan FF:FF:FF:FF:FF:FF
    echo "Host is starting ..." 
    while ! ping -c1 -w1 -n 8.8.8.8 > /dev/null 2&>1
    do
            printf "%c" "."
    done
    echo "Host is up!\n\n"

fi
exit 0

Теперь, когда хост уже подключен, в то время как l oop выходит без печать. Но когда хост не работает, он выводит бесконечно точек на дисплей, даже если хост работает. Я действительно не понимаю, почему время l oop не останавливается при выполнении условия.

Буду признателен за ваш ответ, особенно если он будет соответствовать моей реализации.

1 Ответ

1 голос
/ 05 апреля 2020

Хорошо, думаю, я понял, что здесь происходит. В команде

while ! ping -c1 -w1 -n 8.8.8.8 > /dev/null 2&>1

& и > расположены в неправильном порядке. Это вызывает цепную реакцию путаницы и неожиданных интерпретаций.

В частности, bash анализирует 2&>1 в качестве аргумента "2", за которым следует перенаправление &>1, которое отправляет как stdout, так и stderr в файл названный "1". Таким образом, он запускает эту команду со всеми выходными данными, равными «1»:

ping -c1 -w1 -n 8.8.8.8 2

Некоторые версии ping будут выдавать здесь сообщение об ошибке / использовании, поскольку они принимают только один целевой IP-адрес (а затем выйдите с состоянием ошибки, заставив l oop работать вечно).

Другие версии будут интерпретировать 8.8.8.8 как переход на конечный пункт назначения 2, который является старым сокращением для IP-адреса 0.0.0.2. Который на самом деле не существует на Inte rnet. Это означает, что ping завершится с ошибкой и завершится с ошибкой, в результате чего l oop будет работать вечно.

Я подозреваю, что если вы посмотрите в файл "1", вы сможете сказать, какие из них (или, возможно, что-то еще) происходит.

Здесь можно выучить несколько уроков написания сценариев:

  • Все эти крипты c груды символов материи , и если вы немного ошиблись, вы можете сделать что-то очень отличное от того, что планировали.
  • Отбрасывание вывода (особенно вывод ошибок) - это хороший способ скрыть, что идет не так. Если у скрипта возникли проблемы, запишите и изучите все ошибки, которые его компоненты вызывают.
  • set -x велит оболочке печатать то, что, по ее мнению, он выполняет при выполнении команд, и помещать это перед разделами проблемы в скриптах (и set +x потом выключить) это хорошее слово, чтобы узнать, что происходит. Вот как я понял, что bash рассматривал «2» как аргумент, а не как часть перенаправления.
  • shellcheck. net удобно!
...