Звичайно, є й інший спосіб - але це вимагає розуміння того, що насправді відбувається, коли запит робиться через Інтернет. Коли ви відвідуєте сторінку у своєму веб-браузері, дані передаються за допомогою протоколу 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}) /; print \ $ 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", щоб визначити, чи доступний хост, і перевірити затримку.