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.zip
istnieje, czy nie? Próbowałem użyć ping
polecenia, ale pokazuje błąd, myślę, że to dlatego, że /
znak.
Czy ktoś może mi pomóc? czy jest inny sposób?
command-line
scripts
ping
Egy Mohammad Erdin
źródło
źródło
ping
ogóle nie wysyła żądań HTTP. Zamiast tegoping
używa protokołu o nazwie „ICMP”, aby ustalić, czy host jest osiągalny i sprawdzić opóźnienie.Odpowiedzi:
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ą:
Po zainstalowaniu możesz wywołać go w następujący sposób:
... 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
curl
polecenia . Jeśli przekażemy parametr--head
, cURL zwróci tylko nagłówki z żądania. Wypróbuj z adresem URL. Otrzymasz listę wierszy formularza: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ą
-e
flagi 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:
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:
Po prostu skopiuj i wklej to do pliku. W tym przykładzie wywołam plik
url_check
. Następnie uczyń plik wykonywalnym za pomocą:Następnie możesz sprawdzić dowolny plik za pomocą następującego prostego polecenia:
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.
źródło
cut
komend ... ale nadal nie działa, ... na razie po prostu robię to tak, jak zrobiłeś ...curl $url --head --silent | head -n 1 | cut -d ' ' -f 2
?'
) zamiast podwójnych cudzysłowów ("
) wokół wyrażenia perla.Możesz skorzystać z
--spider
opcji 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 OK
czy plik istnieje, lub błąd, np.404 Not Found
Jeśli go nie ma, lub403 Forbidden
jeśli nie masz pozwolenia na jego pobranie.źródło
Kod wyniku 0 oznacza tak, coś innego - nie.
Możesz sprawdzić kod wyniku w skrypcie za pomocą
$?
zmiennej.źródło