리디렉션 체인의 모든 URL을 표시하는 방법은 무엇입니까?

리디렉션 체인의 모든 URL을 표시하는 방법은 무엇입니까?

바람직하게는 셸에서 리디렉션 체인의 모든 URL을 표시하는 방법을 찾고 있습니다. 컬을 사용하여 거의 이 작업을 수행하는 방법을 찾았지만 첫 번째와 마지막 URL만 표시됩니다. 나는 그들 모두를 보고 싶다.

이 작업을 간단하게 수행할 수 있는 방법이 있어야 하지만 그것이 무엇인지 평생 알 수는 없습니다.

편집: 이것을 제출한 이후 Chrome(CTRL+SHIFT+I->네트워크 탭)을 사용하여 이 작업을 수행하는 방법을 알아냈습니다. 하지만 여전히 Linux 명령줄에서 이를 수행하는 방법을 알고 싶습니다.

답변1

간단하게 사용해보면 어떨까요 wget?

$ wget http://picasaweb.google.com 2>&1 | grep Location:
Location: /home [following]
Location: https://www.google.com/accounts/ServiceLogin?hl=en_US&continue=https%3A%2F%2Fpicasaweb.google.com%2Flh%2Flogin%3Fcontinue%3Dhttps%253A%252F%252Fpicasaweb.google.com%252Fhome&service=lh2&ltmpl=gp&passive=true [following]
Location: https://accounts.google.com/ServiceLogin?hl=en_US&continue=https%3A%2F%2Fpicasaweb.google.com%2Flh%2Flogin%3Fcontinue%3Dhttps%3A%2F%2Fpicasaweb.google.com%2Fhome&service=lh2&ltmpl=gp&passive=true [following]

curl -v또한 일부 정보를 표시하지만 처럼 보기에는 좋지 않습니다 wget.

$ curl -v -L http://picasaweb.google.com 2>&1 | egrep "^> (Host:|GET)"
> GET / HTTP/1.1
> Host: picasaweb.google.com
> GET /home HTTP/1.1
> Host: picasaweb.google.com
> GET /accounts/ServiceLogin?hl=en_US&continue=https%3A%2F%2Fpicasaweb.google.com%2Flh%2Flogin%3Fcontinue%3Dhttps%253A%252F%252Fpicasaweb.google.com%252Fhome&service=lh2&ltmpl=gp&passive=true HTTP/1.1
> Host: www.google.com
> GET /ServiceLogin?hl=en_US&continue=https%3A%2F%2Fpicasaweb.google.com%2Flh%2Flogin%3Fcontinue%3Dhttps%253A%252F%252Fpicasaweb.google.com%252Fhome&service=lh2&ltmpl=gp&passive=true HTTP/1.1
> Host: accounts.google.com

답변2

올바른 컬 기반 솔루션

url=https://rb.gy/x7cg8r
while redirect_url=$(
  curl -I -s -S -f -w "%{redirect_url}\n" -o /dev/null "$url"
); do
  echo "$url"
  url=$redirect_url
  [[ -z "$url" ]] && break
done

결과:

https://rb.gy/x7cg8r
https://t.co/BAvVoPyqNr
https://unix.stackexchange.com/

나보다 12% 빠르네wget 기반 솔루션.

벤치마크 세부정보

cd "$(mktemp -d)"

cat <<'EOF' >curl-based-solution
#!/bin/bash
url=https://rb.gy/x7cg8r
while redirect_url=$(
  curl -I -s -S -f -w "%{redirect_url}\n" -o /dev/null "$url"
); do
  echo "$url"
  url=$redirect_url
  [[ -z "$url" ]] && break
done
EOF
chmod +x curl-based-solution

cat <<'EOF' >wget-based-solution
#!/bin/bash
url=https://rb.gy/x7cg8r
wget -S --spider "$url" 2>&1 \
 | grep -oP '^--[[:digit:]: -]{19}--  \K.*'
EOF
chmod +x wget-based-solution

hyperfine --warmup 5 ./wget-based-solution ./curl-based-solution
$ hyperfine --warmup 5 ./wget-based-solution ./curl-based-solution
Benchmark #1: ./wget-based-solution
  Time (mean ± σ):      1.397 s ±  0.025 s    [User: 90.3 ms, System: 19.7 ms]
  Range (min … max):    1.365 s …  1.456 s    10 runs
 
Benchmark #2: ./curl-based-solution
  Time (mean ± σ):      1.250 s ±  0.015 s    [User: 72.4 ms, System: 23.4 ms]
  Range (min … max):    1.229 s …  1.277 s    10 runs
 
Summary
  './curl-based-solution' ran
    1.12 ± 0.02 times faster than './wget-based-solution'

답변3

표시하다모두첫 번째 URL을 포함하여 리디렉션 체인의 URL 수:

wget -S --spider https://rb.gy/x7cg8r 2>&1 \
 | grep -oP '^--[[:digit:]: -]{19}--  \K.*'

결과(Fedora Linux에서 테스트):

https://rb.gy/x7cg8r
https://t.co/BAvVoPyqNr
https://unix.stackexchange.com/

사용된 wget 옵션:

-S
--server-response

    Print the headers sent by HTTP servers and responses sent by FTP servers.

--spider

    When invoked with this option, Wget will behave as a Web spider, which
    means that it will not download the pages, just check that they are there
    ...

원천:https://www.mankier.com/1/wget

이것콤비네이션요청 -S대신 요청 이 발행되도록 --spider합니다 .wgetHEADGET

사용된 GNU grep 옵션:

-o
--only-matching

    Print only the matched (non-empty) parts of a matching line, with each such
    part on a separate output line.

-P
--perl-regexp

    Interpret PATTERNS as Perl-compatible regular expressions (PCREs).

원천:https://www.mankier.com/1/grep

우리가 관심 있는 행은 다음과 같습니다.

--2021-12-07 12:29:25--  https://rb.gy/x7cg8r

타임스탬프는 숫자, 하이픈, 콜론, 공백을 포함하여 19자로 구성되어 있습니다. 그래서 [[:digit:]-: ]{19}우리가 사용한 곳 과 일치합니다고정 수량자19.

이것\K 일치하는 섹션의 시작 부분 재설정.

grep을 sed로 교체

원하는 경우 파이프라인 grep단계를 다음으로 대체할 수 있습니다.sed

wget -S --spider https://rb.gy/x7cg8r 2>&1 \
 | sed -En 's/^--[[:digit:]: -]{19}--  (.*)/\1/p'

다음 을 기반으로 한 솔루션과 비교 curl:

Curl 기반 솔루션은 리디렉션 체인의 첫 번째 URL을 생략합니다.

$ curl -v -L https://rb.gy/x7cg8r 2>&1 | grep -i "^< location:"
< Location: https://t.co/BAvVoPyqNr
< location: https://unix.stackexchange.com/

또한 두 번째 파이프라인 단계로 전송된 바이트 수가 4354.99% 증가했습니다.

$ wget -S --spider https://rb.gy/x7cg8r 2>&1 | wc -c
2728

$ curl -v -L https://rb.gy/x7cg8r 2>&1 | wc -c
121532

$ awk 'BEGIN {printf "%.2f\n", (121532-2728)/2728*100}'
4354.99

내 벤치마크에서는 wget 솔루션이 컬 기반 솔루션보다 약간 더 빨랐습니다(4%).

고쳐 쓰다:바라보다컬을 기반으로 한 내 대답가장 빠른 솔루션을 위해.

답변4

curl -vHTTP 리디렉션 체인의 모든 URL이 표시될 수 있습니다.

$ curl -v -L https://go.usa.gov/W3H 2>&1 | grep -i "^< location:"
< location: http://hurricanes.gov/nhc_storms.shtml
< Location: https://www.hurricanes.gov/nhc_storms.shtml
< location: https://www.nhc.noaa.gov:443/nhc_storms.shtml
< location: http://www.nhc.noaa.gov/cyclones
< Location: https://www.nhc.noaa.gov/cyclones
< location: http://www.nhc.noaa.gov/cyclones/
< Location: https://www.nhc.noaa.gov/cyclones/

관련 정보