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.