як виявити файл через Інтернет за допомогою ping або подібної команди?


10

У мене є сценарій оболонки, щоб завантажити деякі мої речі через Інтернет. Як я можу дізнатися, чи існує файл через Інтернет? Скажімо, я хочу знати, чи http://192.168.1.1/backup/01012011.zipіснує чи ні? Я спробував використовувати pingкоманду, але вона показує помилку, я думаю, це тому, що /характер.

Хтось може мені допомогти? чи є інший спосіб?


Слід зазначити, що pingHTTP-запити взагалі не надсилають. Швидше, pingвикористовує протокол під назвою "ICMP", щоб визначити, чи доступний хост, і перевірити затримку.
Натан Осман

Відповіді:


8

Звичайно, є й інший спосіб - але це вимагає розуміння того, що насправді відбувається, коли запит робиться через Інтернет. Коли ви відвідуєте сторінку у своєму веб-браузері, дані передаються за допомогою протоколу 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" в іншому випадку. Потім ви можете зав'язати цю команду в оболонці так само, як і будь-яка інша команда.


велике спасибі про теорію та рішення, ... але детально, ... мені цікаво зробити це просто за допомогою простого сценарію оболонки, .. про роботу, ....
Єгипет Мохаммед Ердін

@Warung: Ну ... скрипту оболонки потрібно буде викликати зовнішню команду, щоб не лише запитувати віддалену URL-адресу, але і проаналізувати відповідь.
Натан Осман

yups ... і mybe я можу спробувати розібрати відповідь за допомогою cutкоманд ... але все одно не виходить, .. поки що я просто роблю це так, як ти робив ..
Єгипет Мохаммед Ердін

@ WarungNasi49: щось на кшталт curl $url --head --silent | head -n 1 | cut -d ' ' -f 2?
zpea

@GeorgeEdison: Приємна відповідь! Як ви вже згадували, цитуючи код perl від bash: Ви можете позбутися від великої кількості зворотних косих рядків, якщо 'замість подвійних лапок ( ") навколо виразу perl ви будете одинарні ( ( )).
zpea

13

Ви можете скористатися --spiderпараметром wget, який фактично не завантажує файл, а просто перевіряє, чи він є. У вашому прикладі:

wget --spider http://192.168.1.1/backup/01012011.zip

Це або поверне повідомлення, яке містить, 200 OKякщо файл є, або помилку, наприклад, 404 Not Foundякщо його немає, або 403 Forbiddenякщо у вас немає дозволу на його отримання.


1
wget http://192.168.1.1/backup/01012011.zip

Код результату 0 означає «так», щось інше - «ні».

Ви можете перевірити код результату всередині сценарію зі $?змінною.


1
Гей, Мікайле! Інтерпретація повернених значень - хороша ідея. Однак ця команда буде завантажувати весь файл, а не просто перевіряти, чи він доступний.
zpea
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.