BASH Если команда содержит «этот текст», введите другую команду? - PullRequest
0 голосов
/ 10 марта 2020

Я создаю сценарий bash для проверки заголовков HTTP на удаленных хостах, я делаю это через cURL и заметил, что добавление http: // {host} будет работать только для служб, работающих на tcp \ 80 и не tcp \ 443. Например, для служб HTTPS требуется curl -I -k {host}, в отличие от служб HTTP, для которых требуется только curl -I {host}. Это мой сценарий:

for host in $(cat file.txt); do
echo " "
echo "Current host: "${host}
curl -I -k https://${host}
echo " "
echo "=============================================="
done

Теперь мне нужен оператор условия, который проверяет, что если вывод «Не удалось разрешить хост» , то сценарий должен запускаться "curl -I http: // {host}" на тех хостах, на которых stdout содержал значение str "Не удалось разрешить хост" .

Как этого добиться в bash?

1 Ответ

2 голосов
/ 10 марта 2020

stdout не будет содержать Could not resolve host, но выводится stderr. В то время как вы могли бы захватить stderr и затем выполнить сопоставление строк, существует гораздо более простое решение: код выхода.

Здесь вы можете увидеть , curl всегда завершает работу с кодом 6, когда не удается определить хост. Таким образом, достаточно просто проверить код завершения:

curl -i -k http://nowaythisthingexists.test
if [[ $? -eq 6 ]]
then
    echo "oopsie, couldn't resolve host!"
fi

В качестве альтернативы, если вы действительно хотите сделать это путем сопоставления строк, убедитесь, что перенаправили stderr в stdout (и, возможно, также уничтожите stdout, чтобы он не вмешиваться):

output=$(curl -i -k http://nowaythisthingexists.test 2>&1 >/dev/null)
if [[ "$output" = *"Could not resolve host"* ]]
then
    echo "oopsie, couldn't resolve host!"
fi

Очевидно, что вы не получаете вывод своего запроса таким образом, поэтому вам нужно перенаправить его куда-нибудь более полезное, чем /dev/null - файл или Unix труба. Теперь все становится сложнее, чем нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...