У меня есть сценарий оболочки для загрузки части моего материала по Интернету. Как я могу знать, существует ли файл по Интернету? Скажем, я хочу знать если http://192.168.1.1/backup/01012011.zip
существует или нет? У меня есть использование попытки ping
команда, но это показывает ошибку, я предполагаю это потому что /
символ.
Может кто-либо может помочь мне? или есть ли иначе?
Конечно, существует иначе - но это требует понимания, что на самом деле происходит, когда запрос выполнен по Интернету. При посещении страницы в веб-браузере данные переданы с помощью протокола под названием HTTP (да, это - то, почему Вы будете часто видеть http://
в начале URL).
HTTP является основанным на тексте протоколом. Информацией обмениваются между клиентом и сервером путем отправки заголовков, сопровождаемых телом запроса. Заголовки содержат большую информацию о статусе о запросе и передаваемой информации. Заголовок, что Вы будете интересоваться помочь Вам с Вашей проблемой, не является действительно заголовком вообще - это - самая первая переданная строка и содержит число, названное кодом состояния. Это число является 3 цифрами и передает информацию о статусе. Если запрос был успешен, результат обычно 200 (не всегда - существуют исключения).
Одна вещь наверняка - если файл, который Вы запросили, не существует на веб-сервере, сервер должен ответить с кодом состояния 404. Это указывает, что ресурс не мог быть найден. (Для любопытного вот список кодов состояния HTTP и их значения.)
Ну, достаточно теории. Давайте посмотрим, как мы можем сделать это на терминале. Большой инструмент для выборки запросов с помощью HTTP, который также предоставляет нам способность исследовать код состояния, является ЗАВИХРЕНИЕМ, которое доступно в Ubuntu repos. Можно установить его с:
sudo apt-get install curl
После того как Вам установили его, можно вызвать его как так:
curl [website]
... и содержание данного URL будет распечатано к терминалу. Это - информация, которую видит Ваш веб-браузер, когда это посещает тот URL. Как это помогает нам? Ну, внимательно изучите флаги для curl
команда. Если мы передаем параметр --head
, cURL возвратит только заголовки из запроса. Попробуйте его URL. Вы получите список строк формы:
header-name: header-value
Заметьте, конечно, что самая первая строка не смотрит ничто как это. Помните код состояния, о котором мы говорили ранее? Вы заметите его в первой строке как трехзначное число. Что мы должны сделать, теперь извлечение это от первой строки с помощью Perl - и мы можем сделать это в терминальном Perl использования -e
флаг, которые позволяют нам нас код Perl передачи непосредственно к интерпретатору Perl. Мы должны будем также добавить дополнительный флаг для ЗАВИХРЕНИЯ (--silent
) чтобы помешать ему отображать индикатор выполнения и портить наш сценарий Perl.
Вот то, в чем мы нуждаемся..., это вполне усложнило из-за потребности выйти из большого количества его от оболочки:
perl -e "\$s=\`curl [URL] --head --silent\`; \$s=~m/(\\d{3})/;print \$1"
То, что это в основном делает, выбирает URL с ЗАВИХРЕНИЕМ и выполняет его через регулярное выражение 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' иначе. Можно затем объединить эту команду в цепочку в оболочке точно так же, как Вы были бы любая другая команда.
Можно использовать --spider
опция wget, который на самом деле не загружает файл, но просто проверяет, там ли это. В Вашем примере:
wget --spider http://192.168.1.1/backup/01012011.zip
Это или возвратит сообщение, содержащее 200 OK
если файл там, или ошибка, например. 404 Not Found
если это не там, или 403 Forbidden
если у Вас нет разрешения получить его.
wget http://192.168.1.1/backup/01012011.zip
Код результата 0 средств да, что-то еще - нет.
Можно проверить код результата в сценарии с $?
переменная.