Конечно, есть и другой путь - но для этого нужно понять, что на самом деле происходит, когда запрос делается через Интернет. Когда вы посещаете страницу в своем веб-браузере, данные передаются по протоколу HTTP (да, именно поэтому вы часто будете видеть http://
в начале URL-адресов).
HTTP - это текстовый протокол. Обмен информацией между клиентом и сервером осуществляется путем отправки заголовков, за которыми следует тело запроса. Заголовки содержат много информации о состоянии запроса и передаваемой информации. Заголовок, который вас заинтересует, чтобы помочь вам в решении вашей проблемы, на самом деле вовсе не является заголовком - это самая первая переданная строка, содержащая число, называемое кодом состояния. Этот номер состоит из 3 цифр и передает информацию о состоянии. Если запрос был успешным, результат обычно 200 (не всегда - есть исключения).
Одно можно сказать наверняка - если запрошенный вами файл не существует на веб-сервере, сервер должен ответить с кодом состояния 404. Это указывает на то, что ресурс не найден. (Для любопытных, вот список кодов состояния HTTP и их значения.)
Ну хватит теории. Давайте посмотрим, как мы можем сделать это на терминале. Отличным инструментом для извлечения запросов с использованием HTTP, который также дает нам возможность исследовать код состояния, является cURL, который доступен в репозиториях Ubuntu. Вы можете установить его с помощью:
sudo apt-get install curl
После того, как он установлен, вы можете вызвать его так:
curl [website]
... и содержимое данного URL будет распечатано на терминале. Это информация, которую ваш веб-браузер видит при посещении этого URL. Как это поможет нам? Что ж, внимательно посмотрите на флаги для curl
команды . Если мы передадим параметр --head
, cURL вернет только заголовки из запроса. Попробуйте это с URL. Вы получите список строк вида:
header-name: header-value
Заметьте, конечно, что самая первая строка выглядит совсем не так. Помните код состояния, о котором мы говорили ранее? Вы заметите это в первой строке как трехзначное число. Теперь нам нужно извлечь его из первой строки, используя Perl - и мы можем сделать это в терминале, используя -e
флаг Perl, который позволяет передавать код Perl непосредственно интерпретатору Perl. Нам также необходимо добавить дополнительный флаг в cURL ( --silent
), чтобы он не отображал индикатор выполнения и не испортил наш Perl-скрипт.
Вот что нам нужно ... это довольно сложно из-за необходимости избавиться от этого из оболочки:
perl -e "\ $ s = \` curl [URL] --head --silent \ `; \ $ s = ~ m / (\\ d {3}) /; печать \ $ 1"
Это в основном делает выборку URL с помощью cURL и запуск его через регулярное выражение Perl, которое извлекает код состояния и распечатывает его.
Теперь все, что вам нужно, это указать URL файла, который вы проверяете, и сравнить его с «404». Если вы получите «404», вы можете предположить, что файл не существует.
Конечно, это может быть очень трудно манипулировать в терминале, поэтому вы можете написать небольшой скрипт, который сделает это не только проще для понимания, но и проще для выполнения:
#!/usr/bin/perl
# Get the URL
$url = $ARGV[0];
# Fetch the header
$header = `curl $url --head --silent`;
# Try to find the status code
$header =~ m/(\d{3})/;
# Return the result
exit(0) if $1 == 404;
exit(1);
Просто скопируйте и вставьте это в файл. Для этого примера я назову файл url_check
. Затем сделайте файл исполняемым с помощью:
chmod 755 url_check
Затем вы можете проверить любой файл с помощью следующей простой команды:
./url_check [URL]
Возвращаемым значением будет «0», если сервер вернул 404, и «1» в противном случае. Затем вы можете связать эту команду в оболочке так же, как и любую другую команду.
ping
не отправляет HTTP-запросы вообще. Скорее,ping
используется протокол под названием «ICMP», чтобы определить, достижим ли хост и проверить задержку.