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 quero saber se http://192.168.1.1/backup/01012011.zip
existe ou não? Eu tentei usar o ping
comando, mas mostra erro, acho que isso porque /
personagem.
Alguém pode me ajudar? Ou existe outra maneira?
command-line
scripts
ping
Egy Mohammad Erdin
fonte
fonte
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.Respostas:
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:
Depois de instalá-lo, você pode invocá-lo da seguinte forma:
... 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: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:
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:
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:Em seguida, você pode verificar qualquer arquivo com o seguinte comando simples:
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.
fonte
cut
comandos ... mas ainda não trabalho, .. por enquanto, eu só fazê-lo como o que você fez ..curl $url --head --silent | head -n 1 | cut -d ' ' -f 2
?'
) em vez de aspas duplas ("
) em torno de sua expressão perl.Você pode usar a
--spider
opção wget, que na verdade não baixa o arquivo, mas apenas 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 está lá, ou um erro, por exemplo,404 Not Found
se ele não403 Forbidden
estiver lá ou se você não tem permissão para obtê-lo.fonte
O código de resultado 0 significa sim, outra coisa - não.
Você pode verificar o código do resultado dentro do script com a
$?
variávelfonte