Tenho uma lista de URLs que preciso verificar, para ver se ainda funcionam ou não. Eu gostaria de escrever um script bash que faça isso para mim.
Eu preciso apenas do código de status HTTP retornado, ou seja, 200, 404, 500 e assim por diante. Nada mais.
EDITAR Observe que há um problema se a página diz "404 não encontrado", mas retorna uma mensagem 200 OK. É um servidor da web mal configurado, mas você pode ter que considerar este caso.
Para obter mais informações, consulte Verificar se um URL leva para uma página que contém o texto "404"
bash
curl
http-status-codes
Manu
fonte
fonte
Respostas:
O Curl tem uma opção específica
--write-out
, para isso:$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url> 200
-o /dev/null
joga fora a saída normal--silent
joga fora o medidor de progresso--head
faz uma solicitação HEAD HTTP, em vez de GET--write-out '%{http_code}\n'
imprime o código de status necessárioPara encerrar isso em um script Bash completo:
#!/bin/bash while read LINE; do curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE" done < url-list.txt
(Leitores com olhos de águia perceberão que isso usa um processo de curl por URL, o que impõe penalidades de bifurcação e conexão TCP. Seria mais rápido se vários URLs fossem combinados em um único curl, mas não há espaço para escrever a repetição monstruosa de opções que o curl requer para fazer isso.)
fonte
http://example.com/\r
durante o ciclowget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'
imprime apenas o código de status para você
fonte
Ampliando a resposta já fornecida por Phil. Adicionar paralelismo a ele é um acéfalo no bash se você usar xargs para a chamada.
Aqui está o código:
xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' < url.lst
-n1 : usa apenas um valor (da lista) como argumento para a chamada curl
-P10 : Mantenha 10 processos curl a qualquer momento (ou seja, 10 conexões paralelas)
Verifica a
write_out
parâmetro no manual do curl para mais dados que você pode extrair usando (tempos, etc).Caso ajude alguém, esta é a chamada que estou usando no momento:
xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective};%{http_code};%{time_total};%{time_namelookup};%{time_connect};%{size_download};%{speed_download}\n' < url.lst | tee results.csv
Ele apenas produz um monte de dados em um arquivo csv que pode ser importado para qualquer ferramenta de escritório.
fonte
Isso depende amplamente disponível
wget
, presente em quase todos os lugares, mesmo no Alpine Linux.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
As explicações são as seguintes:
--quiet
--spider
--server-response
O que eles não dizem
--server-response
é que a saída desses cabeçalhos é impressa no erro padrão (sterr) , portanto, a necessidade de redirecionar para stdin.A saída enviada para a entrada padrão, podemos canalizá-la
awk
para extrair o código de status HTTP. Esse código é:$2
) grupo de caracteres não em branco:{$2}
NR==1
E porque queremos imprimi-lo ...
{print $2}
.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
fonte
2>&1 | head -1 | awk '{ print $2 }'
Use
curl
para buscar apenas o cabeçalho HTTP (não o arquivo inteiro) e analisá-lo:$ curl -I --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2 200
fonte
-I
sinalizador faz com que curl faça uma solicitação HTTP HEAD, que é tratada separadamente de um HTTP GET normal por alguns servidores e pode, portanto, retornar valores diferentes. O comando ainda deve funcionar sem ele.wget -S -i *file*
obterá os cabeçalhos de cada url em um arquivo.Filtre
grep
pelo código de status especificamente.fonte
Encontrei uma ferramenta "webchk" escrita em Python. Retorna um código de status para uma lista de urls. Https://pypi.org/project/webchk/
A saída é semelhante a esta:
▶ webchk -i ./dxieu.txt | grep '200' http://salesforce-case-status.dxi.eu/login ... 200 OK (0.108) https://support.dxi.eu/hc/en-gb ... 200 OK (0.389) https://support.dxi.eu/hc/en-gb ... 200 OK (0.401)
Espero que ajude!
fonte
Devido a https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P (saída de trabalhos paralelos em
xargs
riscos sendo misturados), eu usaria GNU Parallel em vez dexargs
paralelizar:cat url.lst | parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile
Neste caso específico, pode ser seguro usar
xargs
porque a saída é muito curta, então o problema com o usoxargs
é que se alguém alterar o código posteriormente para fazer algo maior, ele não será mais seguro. Ou se alguém lê esta pergunta e pensa que pode substituí-lacurl
por outra, então isso também pode não ser seguro.fonte