[bash] URL 목록의 HTTP 상태 코드를 가져 오는 스크립트?

URL이 여전히 작동하는지 확인하기 위해 확인해야하는 URL 목록이 있습니다. 나를 위해 그렇게하는 bash 스크립트를 작성하고 싶습니다.

반환 된 HTTP 상태 코드 (예 : 200, 404, 500 등) 만 필요합니다. 더 이상은 없습니다.

편집 페이지에 “404 찾을 수 없음”이라고 표시되지만 200 OK 메시지가 반환되면 문제가있는 것입니다. 잘못 구성된 웹 서버이지만이 경우를 고려해야 할 수도 있습니다.

이에 대한 자세한 내용 은 URL이 “404”라는 텍스트가 포함 된 페이지로 이동하는지 확인을 참조 하십시오.



답변

Curl에는 다음과 같은 특정 옵션 --write-out이 있습니다.

$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
  • -o /dev/null 일반적인 출력을 버립니다.
  • --silent 진행 표시기를 버립니다.
  • --head GET 대신 HEAD HTTP 요청을합니다.
  • --write-out '%{http_code}\n' 필요한 상태 코드를 인쇄합니다.

이것을 완전한 Bash 스크립트로 마무리하려면 :

#!/bin/bash
while read LINE; do
  curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE"
done < url-list.txt

(독수리 독자는 이것이 URL 당 하나의 curl 프로세스를 사용하므로 포크 및 TCP 연결 페널티가 부과됨을 알 수 있습니다. 여러 URL을 단일 컬로 결합하면 더 빠르지 만 괴물 같은 반복을 작성할 공간이 없습니다. 컬에 필요한 옵션이 있습니다.)


답변

wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'

상태 코드 만 인쇄합니다.


답변

Phil이 이미 제공 한 답변을 확장합니다. 호출에 xargs를 사용하는 경우 병렬 처리를 추가하는 것은 bash에서 생각할 필요가 없습니다.

여기에 코드 :

xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' < url.lst

-n1 : 목록에서 하나의 값만 curl 호출에 대한 인수로 사용합니다.

-P10 : 언제든지 10 개의 curl 프로세스를 유지합니다 (예 : 10 개의 병렬 연결).

write_out더 많은 데이터를 사용하여 추출 할 수있는 데이터 (시간 등)는 curl 매뉴얼의 매개 변수를 확인하십시오 .

누군가에게 도움이되는 경우 이것은 현재 사용중인 전화입니다.

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

Office 도구로 가져올 수있는 CSV 파일로 데이터를 출력합니다.


답변

이것은 wgetAlpine Linux에서도 거의 모든 곳에 존재 하는 널리 사용 가능한에 의존합니다 .

wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'

설명은 다음과 같습니다.

--quiet

Wget의 출력을 끕니다.

Source-wget 매뉴얼 페이지

--spider

[…] 페이지를 다운로드하지 않고 페이지가 있는지 확인합니다. […]

Source-wget 매뉴얼 페이지

--server-response

HTTP 서버에서 보낸 헤더와 FTP 서버에서 보낸 응답을 인쇄합니다.

Source-wget 매뉴얼 페이지

그들이 말하지 않은 것은 --server-response해당 헤더 출력이 표준 오류 (sterr)에 인쇄 되므로 stdin 으로 리디렉션 해야한다는 것 입니다.

표준 입력으로 전송 된 출력 awk은 HTTP 상태 코드를 추출 하기 위해 파이프 할 수 있습니다 . 그 코드는 다음과 같습니다.

  • 두 번째 ( $2) 공백이 아닌 문자 그룹 :{$2}
  • 헤더의 첫 번째 줄에 : NR==1

그리고 우리가 그것을 인쇄 할 때문에 … {print $2}.

wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'


답변

사용 curl은 HTTP 헤더 만 (안 전체 파일)을 가져오고 그것을 구문 분석 :

$ curl -I  --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2
200


답변

wget -S -i *file* 파일의 각 URL에서 헤더를 가져옵니다.

grep상태 코드를 구체적으로 필터링 하십시오.


답변

Python으로 작성된 “webchk”도구를 찾았습니다. URL 목록에 대한 상태 코드를 반환합니다.
https://pypi.org/project/webchk/

출력은 다음과 같습니다.

▶ 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)

도움이 되었기를 바랍니다.