Certamente existe outra maneira - mas isso requer entender o que realmente acontece quando uma solicitação é feita pela Internet. Quando você visita uma página no seu navegador da Web, os dados são transferidos usando um protocolo chamado HTTP (sim, é por isso que você geralmente vê http://
no início dos URLs).
HTTP é um protocolo baseado em texto. As informações são trocadas entre o cliente e o servidor enviando cabeçalhos seguidos pelo corpo da solicitação. Os cabeçalhos contêm muitas informações de status sobre a solicitação e as informações que estão sendo transferidas. O cabeçalho no qual você estará interessado para ajudá-lo com o seu problema não é realmente um cabeçalho - é a primeira linha transferida e contém um número chamado código de status. Esse número tem três dígitos e transmite informações de status. Se uma solicitação foi bem-sucedida, o resultado é geralmente 200 (nem sempre - há exceções).
Uma coisa é certa - se o arquivo solicitado não existir no servidor da Web, o servidor deverá responder com um código de status 404. Isso indica que o recurso não foi encontrado. (Para os curiosos, aqui está uma lista de códigos de status HTTP e seu significado.)
Bem, basta teoria. Vamos ver como podemos fazer isso no terminal. Uma ótima ferramenta para buscar solicitações usando HTTP que também nos fornece a capacidade de examinar o código de status é o cURL, que está disponível nos repositórios do Ubuntu. Você pode instalá-lo com:
sudo apt-get install curl
Depois de instalá-lo, você pode invocá-lo da seguinte forma:
curl [website]
... e o conteúdo do URL fornecido será impresso no terminal. Essas são as informações que o seu navegador vê quando visita esse URL. Como isso nos ajuda? Bem, dê uma olhada nas bandeiras do curl
comando . Se passarmos o parâmetro --head
, cURL retornará apenas os cabeçalhos da solicitação. Experimente com um URL. Você obterá uma lista de linhas do formulário:
header-name: header-value
Observe, é claro, que a primeira linha não se parece nada com isso. Lembra do código de status que falamos anteriormente? Você o notará na primeira linha como o número de três dígitos. O que precisamos fazer agora é extraí-lo da primeira linha usando o Perl - e podemos fazê-lo no terminal usando o -e
sinalizador do Perl, que vamos passar o código Perl diretamente para o intérprete do Perl. Também precisamos adicionar um sinalizador extra ao cURL ( --silent
) para impedir que ele exiba uma barra de progresso e atrapalhe nosso script Perl.
Aqui está o que precisamos ... é bastante complicado devido à necessidade de escapar muito do shell:
perl -e "\ $ s = \` enrolar [URL] --head --silent \ `; \ $ s = ~ m / (\\ d {3}) /; imprimir \ $ 1"
O que isso está basicamente fazendo é buscar a URL com cURL e executá-la através de uma expressão regular Perl que extrai o código de status e o imprime.
Agora tudo o que você precisa é colocar o URL do arquivo que você está procurando e compará-lo com '404'. Se você receber '404', poderá assumir que o arquivo não existe.
Obviamente, isso pode ser muito difícil de manipular no terminal, para que você possa escrever um pequeno script que torne isso não apenas mais fácil de entender, mas também mais fácil de executar:
#!/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);
Simplesmente copie e cole isso em um arquivo. Para este exemplo, eu vou chamar o arquivo url_check
. Em seguida, torne o arquivo executável com:
chmod 755 url_check
Em seguida, você pode verificar qualquer arquivo com o seguinte comando simples:
./url_check [URL]
O valor de retorno será '0' se o servidor retornou um 404 e '1' caso contrário. Em seguida, você pode encadear esse comando no shell como faria com qualquer outro comando.
ping
não envia solicitações HTTP. Em vez disso,ping
usa um protocolo chamado 'ICMP' para determinar se um host está acessível e para verificar a latência.