cURL 리디렉션을 추적하고 모든 URL을 가져옵니다.

cURL 리디렉션을 추적하고 모든 URL을 가져옵니다.

나는 URL 목록을 가져와서 각 URL에 대한 일부 데이터(URL, 상태 코드 및 대상 URL)가 포함된 CSV를 출력하는 간단한 bash 스크립트를 작성했습니다.

while read url
do
    urlstatus=$(curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --insecure --write-out '%{http_code} , %{redirect_url}' "$url" -I )
    echo "$url , $urlstatus" >> "$1-out.csv"
done < $1

때로는 URL에 2~3개의 리디렉션이 있고 모든 리디렉션을 가져와서 출력 파일에 인쇄하고 싶을 때가 있습니다.

-L마지막 URL에 대한 옵션과 필터를 찾았습니다 .%{url_effective}

    urlstatus2=$(curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --insecure --write-out ' , %{url_effective}' "$url" -L -I )

하지만 시작 주소부터 최종 주소까지 모든 URL을 갖고 csv에 추가하고 싶습니다.

답변1

재귀 함수를 만듭니다.

#!/bin/bash
get_redirects(){
    i=${2:-1}
    read status url <<< $(curl -H 'Cache-Control: no-cache' -o /dev/null --silent --head --insecure --write-out '%{http_code}\t%{redirect_url}\n' "$1" -I)
    printf '%d: %s --> %s\n' "$i" "$1" "$status";
    if [ "$1" = "$url" ] || [ $i -gt 9 ]; then
        echo "Recursion detected or more redirections than allowed. Stop."
    else
      case $status in
          30*) get_redirects "$url" "$((i+1))"
               ;;
      esac
    fi
}

용법:

$ get_redirects https://aep-beta.onpc.fr/lycees/dom/region/DOM/ECOL
https://aep-beta.onpc.fr/lycees/dom/region/DOM/ECOL --> 301
https://aep-beta.onpc.fr/onglet/lycee/dom --> 301
https://aep-beta.onpc.fr/onglet/lycee/outre-mer --> 200

답변2

확립된@pLumo답변, 이 함수는 재귀를 제거하고 사용자 정의 매개변수를 컬링에 제공할 수 있도록 합니다.

#!/bin/bash
get_redirects(){
  url=$1
  declare -a params=("${@:2}")

  for i in {1..100}; do
    read status url <<< $(curl "$url" -H 'Cache-Control: no-cache' -o /dev/null --silent --write-out '%{http_code}\t%{redirect_url}\n' "${params[@]}");
    printf '%d: %s --> %s\n' "$i" "$url" "$status";
    if (( status < 300 || status >= 400 )); then break; fi
  done
}

용법:

get_redirects http://example.com/endpoint -X POST -H "Authentication: Bearer ..." -d "param=value"

관련 정보