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


88

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

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

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

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


2
공정하게 말하면, 내 스크립트의 "버그"는 서버가 HTTP 코드 200을 반환하지만 본문 텍스트에 "404 not found"라고 표시되는 경우에만 발생하며 이는 웹 서버가 잘못 작동하는 것입니다.
— Phil

2
wget의 종료 상태는 응답 코드가 200 인 경우 0, 404 인 경우 8, 302 인 경우 4 ... $? 변수를 사용하여 이전 명령의 종료 상태에 액세스합니다.
— Casey Watson

답변:


195

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을 단일 컬로 결합하면 더 빠르지 만 괴물 같은 반복을 작성할 공간이 없습니다. 컬에 필요한 옵션이 있습니다.)


아주 좋아. 내 파일의 모든 URL에서 해당 명령을 실행할 수 있습니까?
— Manu

1
@Manu : 예, curl 명령을 마무리하는 한 가지 가능한 방법을 보여주기 위해 내 대답을 편집했습니다. url-list.txt에 한 줄에 하나의 URL이 포함되어 있다고 가정합니다.
— Phil

1
위의 스크립트와 swer가 항상 출력에 000을 표시하는 이유를 모르겠지만 명령을 루프없이 한 번만 실행하면 작동합니다 ...
— Karol F

1
@KarolFiturski 나는 같은 문제가 있었다 (아마도 고쳐졌지만 다른 누군가가 이것을 우연히 발견하는 경우 ...) 내 경우에는 입력 파일의 줄 끝에 캐리지 리턴이있어 URL이 http://example.com/\r루프를 통과 할 때
— Jordan Robinson

1
이 문제가 있었는데 Windows 유형에서 Linux 유형으로 끝나는 행을 전환하여 해결할 수있었습니다.
— Tristan

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

상태 코드 만 인쇄합니다.


9
+1 URL이 리디렉션 될 때 각각 새 줄에 여러 코드를 표시합니다.
— Ashfame 2012

내가하려는 요청과 함께 작동하려면 --spider를 제거해야했지만 작동합니다.
— amitavk

30

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 파일로 데이터를 출력합니다.


2
병렬 처리, 파일 입력 및 csv. 내가 찾던 바로 그것.
— Agey

훌륭합니다.
— xlttj

이것은 대단합니다. 제가 찾던 것입니다. 감사합니다. 한 가지 질문, csv 결과에 페이지 제목을 어떻게 포함시킬 수 있습니까?
— MitchellK

@estani - stackoverflow.com/users/1182464/estani 하나는 .csv 파일로 페이지의 페이지 제목을 받고 포함 할 수 방법에 대해 설명합니다. 다시 게시해서 죄송합니다. 태그를 잊고이 질문에 대한 알림을받을 수 있습니다. 감사합니다.
— MitchellK

@MitchellK 이것은 http 호출의 내용을 전혀 처리하지 않습니다. "페이지 제목"(그것이 무엇이든)이 URL에 있으면 추가 할 수 있습니다. 그렇지 않은 경우 전체 페이지를 구문 분석하여 "제목"을 추출해야합니다 (http에 의해 검색된 html 페이지를 의미한다고 가정). 스택 오버플로에서 다른 답변을 찾거나 특정 질문을하십시오.
— estani

16

이것은 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}'

1
나는 이것을 사용2>&1 | head -1 | awk '{ print $2 }'
— Evhz

7

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

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

wget이 404라고 말하면 curl이 200을 알려줍니다 ... :(
— Manu

이 -I플래그는 curl이 HTTP HEAD 요청을 수행하게하는데, 이는 일부 서버에서 일반 HTTP GET과 별도로 처리되므로 다른 값을 리턴 할 수 있습니다. 명령은이 명령 없이도 작동합니다.
— lambshaanxy 2012

4

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

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


1

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)

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


0

https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P ( xargs위험이 혼합 된 병렬 작업의 출력) 로 인해 병렬화하는 대신 GNU Parallel을 사용 xargs합니다.

cat url.lst |
  parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile

이 특별한 경우 xargs에는 출력이 너무 짧기 때문에 사용하는 것이 안전 할 수 있으므로 xargs나중에 누군가가 더 큰 일을하기 위해 코드를 변경하면 더 이상 안전하지 않다는 것이 사용 문제입니다. 또는 누군가이 질문을 읽고 그가 curl다른 것으로 대체 할 수 있다고 생각 한다면 그것은 안전하지 않을 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.