como detectar um arquivo pela internet usando ping ou comando similar?

9

Eu tenho um script de shell para baixar algumas das minhas coisas pela Internet. Como posso saber se existe um arquivo na Internet? Digamos que eu queira saber se http://192.168.1.1/backup/01012011.zip existe ou não? Eu tentei usar o comando ping , mas ele mostra erro, acho que porque / character.

Alguém pode me ajudar? ou há outro jeito?

    
por Egy Mohammad Erdin 09.07.2011 / 05:34

3 respostas

8

Certamente existe outra maneira - mas isso requer compreensão do que realmente acontece quando uma solicitação é feita pela Internet. Quando você visita uma página em seu navegador da Web, os dados são transferidos usando um protocolo chamado HTTP (sim, é por isso que você geralmente verá 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 que você estará interessado em 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 é de 3 dígitos e transmite informações de status. Se uma solicitação foi bem-sucedida, o resultado normalmente é 200 (nem sempre - há exceções).

Uma coisa é certa - se o arquivo que você solicitou não existir no servidor web, o servidor deve responder com um código de status 404. Isso indica que o recurso não foi encontrado. (Para os curiosos, aqui é uma lista de códigos de status HTTP e seu significado.)

Bem, teoria suficiente. 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 assim:

curl [website]

... e o conteúdo do URL fornecido será impresso no terminal. Estas são as informações que seu navegador da web vê quando visita esse URL. Como isso nos ajuda? Bem, dê uma olhada nos sinalizadores para o comando curl . Se passarmos o parâmetro --head , cURL retornará somente os cabeçalhos da solicitação. Experimente com um URL. Você receberá uma lista de linhas do formulário:

header-name: header-value

Repare, claro, que a primeira linha não se parece com isso. Lembre-se do código de status que falamos anteriormente? Você notará na primeira linha como o número de três dígitos. O que precisamos fazer agora é extraí-lo da primeira linha usando Perl - e podemos fazê-lo no terminal usando o flag -e do Perl, que nos permite passar o código Perl diretamente para o interpretador Perl. Também precisaremos adicionar um sinalizador extra para cURL ( --silent ) para evitar que ele exiba uma barra de progresso e atrapalhe nosso script Perl.

Aqui é o que precisamos ... é bastante complicado devido à necessidade de escapar muito do shell:

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

O que isso basicamente faz é buscar a URL com cURL e executá-la por meio de uma expressão regular Perl que extrai o código de status e o imprime.

Agora, tudo o que você precisa é colocar na URL do arquivo que está verificando e compará-lo com '404'. Se você obtiver '404', você pode assumir que o arquivo não existe.

Claro, isso pode ser muito difícil de manipular no terminal, então você pode escrever um pequeno script que torna 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  == 404;
exit(1);

Basta copiar e colar isso em um arquivo. Para este exemplo, chamarei o arquivo url_check . Em seguida, torne o arquivo executável com:

chmod 755 url_check

Depois, 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. Você pode encadear este comando no shell como faria com qualquer outro comando.

    
por Nathan Osman 09.07.2011 / 09:22
12

Você pode usar a opção --spider do wget, que não faz o download do arquivo, mas verifica se está lá. No seu exemplo:

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

Isso retornará uma mensagem contendo 200 OK se o arquivo estiver lá ou um erro, por exemplo, 404 Not Found se não estiver lá ou 403 Forbidden se você não tiver permissão para obtê-lo.

    
por Marios Zindilis 09.07.2011 / 07:51
1
wget http://192.168.1.1/backup/01012011.zip

O código de resultado 0 significa sim, algo mais - não.

Você pode verificar o código de resultado dentro do script com a variável $? .

    
por mikhailgarber 09.07.2011 / 05:54