Как обнаружить файл через Интернет с помощью команды ping или аналогичной?

10

У меня есть сценарий оболочки для загрузки некоторых моих вещей через Интернет. Как я могу узнать, существует ли файл через Интернет? Допустим, я хочу знать, http://192.168.1.1/backup/01012011.zipсуществует или нет? Я попытался с помощью pingкоманды, но она показывает ошибку, я думаю, это потому, что /характер.

Может кто-нибудь может мне помочь? или есть другой способ?

Египет Мохаммед Эрдин
источник
Следует отметить, что pingне отправляет HTTP-запросы вообще. Скорее, 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}) /; печать \ $ 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» в противном случае. Затем вы можете связать эту команду в оболочке так же, как и любую другую команду.

Натан Осман
источник
Большое спасибо за теорию и решение, ... но часть perl, .. я хотел бы сделать это с помощью простого сценария оболочки, .. на работе, ...
Egy Мохаммад Эрдин
@Warung: Ну ... сценарий оболочки должен будет вызывать внешнюю команду, чтобы не только запросить удаленный URL, но и проанализировать ответ.
Натан Осман
да ... и, может быть, я могу попытаться разобрать ответ с помощью 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 означает да, что-то еще - нет.

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

mikhailgarber
источник
1
Привет, Микаил! Интерпретация возвращаемых значений - это хорошая идея. Однако эта команда загрузит весь файл, а не просто проверит, доступен ли он.
zpea