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

9

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

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

    
задан Egy Mohammad Erdin 09.07.2011 в 03:34
источник

3 ответа

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  == 404;
exit(1);

Просто скопируйте и вставьте это в файл. В этом примере я вызову файл url_check . Затем сделайте исполняемый файл с помощью:

chmod 755 url_check

Затем вы можете проверить любой файл с помощью следующей простой команды:

./url_check [URL]

Возвращаемое значение будет «0», если сервер возвратил 404 и «1» в противном случае. Затем вы можете связать эту команду в оболочке так же, как и любую другую команду.

    
ответ дан Nathan Osman 09.07.2011 в 07:22
источник
12

Вы можете использовать опцию --spider для wget, которая фактически не загружает файл, а просто проверяет, существует ли она. В вашем примере:

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

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

    
ответ дан Marios Zindilis 09.07.2011 в 05:51
1
wget http://192.168.1.1/backup/01012011.zip

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

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

    
ответ дан mikhailgarber 09.07.2011 в 03:54