Как получить исходный URL-адрес из записи журнала выходных данных cURL?

#bash #curl

Вопрос:

Я загружаю cURL несколькими URL-адресами одновременно и испытываю трудности с анализом выходного журнала, чтобы вернуть исходные адреса. А именно, если URL-адрес разрешен, вывод выглядит следующим образом:

 $ curl --head --verbose https://www.google.com/
*   Trying 64.233.165.106...
* TCP_NODELAY set
* Connected to www.google.com (64.233.165.106) port 443 (#0)
<...>
> HEAD / HTTP/2
> Host: www.google.com
<...>
 

которые в конечном итоге могут быть проанализированы обратно в https://www.google.com/.

Однако с неверным URL-адресом это не работает:

 $ curl --head --verbose --connect-timeout 3 https://imap.gmail.com/
*   Trying 74.125.131.109...
* TCP_NODELAY set
* After 1491ms connect time, move on!
* connect to 74.125.131.109 port 443 failed: Operation timed out
<...>
* Failed to connect to imap.gmail.com port 443: Operation timed out
 

В этом случае сообщение об ошибке содержит URL-адрес, но в других случаях это не так. Я не могу на это положиться.

Итак, мне нужно либо отключить разрешение URL-адреса на IP в выходных данных, например

 *   Trying https://imap.gmail.com/...
 

или каким-то образом добавьте каждый URL-адрес из списка в соответствующий вывод, например:

 $ curl --head --verbose --connect-timeout 3 https://imap.gmail.com/ https://www.google.com/

https://imap.gmail.com/
*   Trying 64.233.162.108...
* TCP_NODELAY set
* After 1495ms connect time, move on!
* connect to 64.233.162.108 port 443 failed: Operation timed out
<...>

https://www.google.com/
*   Trying 74.125.131.17...
* TCP_NODELAY set
* Connected to www.gmail.com (74.125.131.17) port 443 (#0)
<...>
 

Wget или HTTPie-это не вариант. Как этого можно достичь с помощью cURL?

Комментарии:

1. Получение только одного URL-адреса одним curl вызовом не является опцией?

2. @user1934428, да, спасибо, я ответил на свой вопрос, используя этот подход.

Ответ №1:

Возможно, это и есть решение:

 while read LINE ; do
    print "REQUESTED URL: $LINE" >> output.txt;
    curl $LINE >> output.txt 2>amp;1;
done < url-list.txt
 

Ответ №2:

Начиная с curl v.7. 75.0, можно с --write-out '%{url}' помощью опции заставить curl отображать полученный URL-адрес.