У меня есть сценарий оболочки для загрузки некоторых моих вещей через Интернет. Как я могу узнать, существует ли файл через Интернет? Допустим, я хочу знать, http://192.168.1.1/backup/01012011.zip
существует или нет? Я попытался с помощью ping
команды, но она показывает ошибку, я думаю, это потому, что /
характер.
Может кто-нибудь может мне помочь? или есть другой способ?
command-line
scripts
ping
Египет Мохаммед Эрдин
источник
источник
ping
не отправляет HTTP-запросы вообще. Скорее,ping
используется протокол под названием «ICMP», чтобы определить, достижим ли хост и проверить задержку.Ответы:
Конечно, есть и другой путь - но для этого нужно понять, что на самом деле происходит, когда запрос делается через Интернет. Когда вы посещаете страницу в своем веб-браузере, данные передаются по протоколу HTTP (да, именно поэтому вы часто будете видеть
http://
в начале URL-адресов).HTTP - это текстовый протокол. Обмен информацией между клиентом и сервером осуществляется путем отправки заголовков, за которыми следует тело запроса. Заголовки содержат много информации о состоянии запроса и передаваемой информации. Заголовок, который вас заинтересует, чтобы помочь вам в решении вашей проблемы, на самом деле вовсе не является заголовком - это самая первая переданная строка, содержащая число, называемое кодом состояния. Этот номер состоит из 3 цифр и передает информацию о состоянии. Если запрос был успешным, результат обычно 200 (не всегда - есть исключения).
Одно можно сказать наверняка - если запрошенный вами файл не существует на веб-сервере, сервер должен ответить с кодом состояния 404. Это указывает на то, что ресурс не найден. (Для любопытных, вот список кодов состояния HTTP и их значения.)
Ну хватит теории. Давайте посмотрим, как мы можем сделать это на терминале. Отличным инструментом для извлечения запросов с использованием HTTP, который также дает нам возможность исследовать код состояния, является cURL, который доступен в репозиториях Ubuntu. Вы можете установить его с помощью:
После того, как он установлен, вы можете вызвать его так:
... и содержимое данного URL будет распечатано на терминале. Это информация, которую ваш веб-браузер видит при посещении этого URL. Как это поможет нам? Что ж, внимательно посмотрите на флаги для
curl
команды . Если мы передадим параметр--head
, cURL вернет только заголовки из запроса. Попробуйте это с URL. Вы получите список строк вида:Заметьте, конечно, что самая первая строка выглядит совсем не так. Помните код состояния, о котором мы говорили ранее? Вы заметите это в первой строке как трехзначное число. Теперь нам нужно извлечь его из первой строки, используя Perl - и мы можем сделать это в терминале, используя
-e
флаг Perl, который позволяет передавать код Perl непосредственно интерпретатору Perl. Нам также необходимо добавить дополнительный флаг в cURL (--silent
), чтобы он не отображал индикатор выполнения и не испортил наш Perl-скрипт.Вот что нам нужно ... это довольно сложно из-за необходимости избавиться от этого из оболочки:
Это в основном делает выборку URL с помощью cURL и запуск его через регулярное выражение Perl, которое извлекает код состояния и распечатывает его.
Теперь все, что вам нужно, это указать URL файла, который вы проверяете, и сравнить его с «404». Если вы получите «404», вы можете предположить, что файл не существует.
Конечно, это может быть очень трудно манипулировать в терминале, поэтому вы можете написать небольшой скрипт, который сделает это не только проще для понимания, но и проще для выполнения:
Просто скопируйте и вставьте это в файл. Для этого примера я назову файл
url_check
. Затем сделайте файл исполняемым с помощью:Затем вы можете проверить любой файл с помощью следующей простой команды:
Возвращаемым значением будет «0», если сервер вернул 404, и «1» в противном случае. Затем вы можете связать эту команду в оболочке так же, как и любую другую команду.
источник
cut
команд ... но все еще не работает, .. на данный момент, я просто делаю это так, как вы делали ...curl $url --head --silent | head -n 1 | cut -d ' ' -f 2
?'
) вместо двойных кавычек ("
) вокруг выражения perl.Вы можете использовать
--spider
опцию wget, которая на самом деле не загружает файл, а просто проверяет, есть ли он там. В вашем примере:wget --spider http://192.168.1.1/backup/01012011.zip
Это будет либо возвращать сообщение, содержащее,
200 OK
если файл там, или ошибку, например,404 Not Found
если его там нет, или403 Forbidden
если у вас нет разрешения на его получение.источник
Код результата 0 означает да, что-то еще - нет.
Вы можете проверить код результата внутри скрипта с помощью
$?
переменной.источник