jak wykryć plik przez Internet za pomocą polecenia ping lub podobnego polecenia?

10

Mam skrypt powłoki, aby pobrać niektóre moje rzeczy przez Internet. Skąd mam wiedzieć, czy plik istnieje w Internecie? Powiedzmy, że chcę wiedzieć, czy http://192.168.1.1/backup/01012011.zipistnieje, czy nie? Próbowałem użyć pingpolecenia, ale pokazuje błąd, myślę, że to dlatego, że /znak.

Czy ktoś może mi pomóc? czy jest inny sposób?

Egy Mohammad Erdin
źródło
Należy zauważyć, że w pingogóle nie wysyła żądań HTTP. Zamiast tego pingużywa protokołu o nazwie „ICMP”, aby ustalić, czy host jest osiągalny i sprawdzić opóźnienie.
Nathan Osman

Odpowiedzi:

8

Z pewnością istnieje inny sposób - ale wymaga to zrozumienia, co faktycznie dzieje się, gdy żądanie jest przesyłane przez Internet. Gdy odwiedzasz stronę w przeglądarce, dane są przesyłane za pomocą protokołu o nazwie HTTP (tak, dlatego często widzisz http://na początku adresów URL).

HTTP jest protokołem tekstowym. Informacje są wymieniane między klientem a serwerem poprzez wysyłanie nagłówków, a następnie treści żądania. Nagłówki zawierają wiele informacji o stanie dotyczących żądania i przesyłanych informacji. Nagłówek, który będziesz zainteresowany, aby pomóc Ci w rozwiązaniu problemu, nie jest tak naprawdę nagłówkiem - jest to pierwszy przeniesiony wiersz i zawiera numer zwany kodem statusu. Ta liczba składa się z 3 cyfr i przekazuje informacje o stanie. Jeśli żądanie zakończyło się powodzeniem, wynik wynosi zwykle 200 (nie zawsze - są wyjątki).

Jedno jest pewne - jeśli żądany plik nie istnieje na serwerze WWW, serwer powinien odpowiedzieć kodem stanu 404. Oznacza to, że nie można znaleźć zasobu. (Dla ciekawskich oto lista kodów stanu HTTP i ich znaczenia).

Cóż, dość teorii. Zobaczmy, jak możemy to zrobić na terminalu. Świetnym narzędziem do pobierania żądań za pomocą protokołu HTTP, które umożliwia nam również sprawdzenie kodu stanu, jest cURL, który jest dostępny w repozytoriach Ubuntu. Możesz go zainstalować za pomocą:

sudo apt-get install curl

Po zainstalowaniu możesz wywołać go w następujący sposób:

curl [website]

... a treść podanego adresu URL zostanie wydrukowana na terminalu. Są to informacje, które przeglądarka przegląda podczas odwiedzania tego adresu URL. Jak nam to pomaga? Cóż, przyjrzyj się bliżej flagom curlpolecenia . Jeśli przekażemy parametr --head, cURL zwróci tylko nagłówki z żądania. Wypróbuj z adresem URL. Otrzymasz listę wierszy formularza:

header-name: header-value

Zauważ oczywiście, że pierwsza linia nie wygląda tak. Pamiętasz kod statusu, o którym rozmawialiśmy wcześniej? Zauważysz to w pierwszym wierszu jako trzycyfrowa liczba. Teraz musimy wyodrębnić go z pierwszego wiersza za pomocą Perla - i możemy to zrobić w terminalu za pomocą -eflagi Perla, która pozwala nam przekazać kod Perla bezpośrednio do interpretera Perla. Musimy również dodać dodatkową flagę do cURL ( --silent), aby nie wyświetlała paska postępu i nie zepsuła naszego skryptu Perl.

Oto, czego potrzebujemy ... jest to dość skomplikowane ze względu na konieczność ucieczki dużej części z powłoki:

perl -e "\ $ s = \` curl [URL] --head --silent \ `; \ $ s = ~ m / (\\ d {3}) /; print \ $ 1"

W zasadzie polega to na pobraniu adresu URL za pomocą cURL i uruchomieniu go za pomocą wyrażenia regularnego Perla, które wyodrębnia kod stanu i drukuje go.

Teraz wystarczy wpisać adres URL sprawdzanego pliku i porównać go z „404”. Jeśli otrzymasz „404”, możesz założyć, że plik nie istnieje.

Oczywiście może to być bardzo trudne do manipulowania w terminalu, więc możesz napisać mały skrypt, który sprawia, że ​​jest to nie tylko łatwiejsze do zrozumienia, ale także łatwiejsze do wykonania:

#!/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);

Po prostu skopiuj i wklej to do pliku. W tym przykładzie wywołam plik url_check. Następnie uczyń plik wykonywalnym za pomocą:

chmod 755 url_check

Następnie możesz sprawdzić dowolny plik za pomocą następującego prostego polecenia:

./url_check [URL]

Zwracana wartość będzie wynosić „0”, jeśli serwer zwrócił 404, a w przeciwnym razie „1”. Następnie możesz połączyć to polecenie w powłokę, tak jak każde inne polecenie.

Nathan Osman
źródło
dziękuję bardzo za teorię i rozwiązanie, ... ale część perla ... zastanawiam się, czy mogę to zrobić za pomocą prostego skryptu powłoki, .. na temat pracy, ...
Egy Mohammad Erdin
@Warung: Cóż ... skrypt powłoki będzie musiał wywołać zewnętrzne polecenie, aby nie tylko zapytać o zdalny adres URL, ale także przeanalizować odpowiedź.
Nathan Osman,
tak ... i moe mogę spróbować przeanalizować odpowiedź za pomocą cutkomend ... ale nadal nie działa, ... na razie po prostu robię to tak, jak zrobiłeś ...
Egy Mohammad Erdin
@ WarungNasi49: coś w stylu curl $url --head --silent | head -n 1 | cut -d ' ' -f 2?
zpea
@GeorgeEdison: Ładna odpowiedź! Jak wspomniałeś, cytując kod perla z bash: Możesz pozbyć się wielu ukośników odwrotnych, jeśli pojedyncze cudzysłowy ( ') zamiast podwójnych cudzysłowów ( ") wokół wyrażenia perla.
zpea
13

Możesz skorzystać z --spideropcji wget, która tak naprawdę nie pobiera pliku, a jedynie sprawdza, czy on tam jest. W twoim przykładzie:

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

To zwróci komunikat zawierający informację, 200 OKczy plik istnieje, lub błąd, np. 404 Not FoundJeśli go nie ma, lub 403 Forbiddenjeśli nie masz pozwolenia na jego pobranie.

Marios Zindilis
źródło
1
wget http://192.168.1.1/backup/01012011.zip

Kod wyniku 0 oznacza tak, coś innego - nie.

Możesz sprawdzić kod wyniku w skrypcie za pomocą $?zmiennej.

mikhailgarber
źródło
1
Hej Mikail! Interpretacja zwracanych wartości jest dobrym pomysłem. Jednak to polecenie pobierałoby cały plik, a nie tylko sprawdzało, czy jest dostępny.
zpea