Использование curl в Linux

Конспект в доработке

    Общие сведения

    Сurl и браузеры не всегда одинаково обрабатывают URL-адреса
    Иногда разница между тем, что вы видите в адресной строке браузера, и тем, что вы можете передать в curl, может быть значительной


    Curl поддерживает следующие протоколы: DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS и WSS
    Синтаксис URL-адреса зависит от протокола
    Можно указать любое количество URL-адресов в командной строке. Они извлекаются последовательно в указанном порядке, если не используется -Z, --parallel. Можно указать параметры командной строки и URL-адреса в смешанном виде и в любом порядке в командной строке
    Когда клиент подключается к «example.com» и запрашивает ресурс «/», он отправляет запрос GET без тела запроса:

    GET / HTTP/1.1 User-agent: curl/2000 Host: example.com

    При этом сервер может ответить так:

    HTTP/1.1 200 OK Server: example-server/1.1 Content-Length: 5 Content-Type: plain/text hello

    Заголовок сервера содержить код ответа и поддерживаемую версию

    Установка
    #Установка apt install curl #Если есть необходимость создавать приложения на основе libcurl apt install libcurl4-openssl-dev
    Подробный режим

    В режиме verbos curl выводит информацию о том, как имя соотносится с IP-адресом и к какому порту он подключился
    Если используется URL-адрес HTTPS:// вместо HTTP-адреса, то увидим множество строк, объясняющих, как curl использует сертификаты центра сертификации для проверки сертификата сервера, а также некоторые сведения из сертификата сервера и т. д. В том числе выбранные шифры и другие сведения о TLS.

    curl -v http://example.com

    Опция -s (или --silent), напротив отображает меньше информации, но вывод ошибок можно оставить с помощью опции -S или --show-error.

    Ошибки

    curl возвращает код завершения своей работы для последнего использованного URL-адреса. Чтобы curl завершал работу с ошибкой для первого неудачного URL-адреса в наборе, необходимо использовать опцию --fail-early

    Трассировки

    Бывают случаи, когда -v недостаточно
    --trace [filename] сохраняет полную трассировку в заданном имени файла. Вы также можете использовать '-' (один минус) вместо имени файла, чтобы передать его в стандартный вывод.
    Каждый отправленный и полученный байт отображается отдельно в шестнадцатеричном формате. Полученные заголовки выводятся построчно.
    Если шестнадцатеричные числа не помогают, можно попробовать --trace-ascii [filename] вместо них.
    Параметр --trace-ids позволяет увидеть, как curl добавляет два числа во все трассировки: номер подключения и номер передачи. Это два отдельных идентификатора, потому что подключения могут использоваться повторно, а несколько передач могут использовать одно и то же подключение

    curl --trace dump http://example.com

    Если объёма данных трассировки недостаточно. Например, возникла проблема на более низком уровне протокола, и хотите её отладить, curl предоставляет опцию --trace-config С помощью этой опции можно указать curl, что нужно также включать в журнал сведения о компонентах, которые по умолчанию не включаются, например, сведения о протоколе TLS, HTTP/2 или HTTP/3. Также есть удобные опции для добавления идентификаторов подключения и передачи данных, а также отметок времени.
    Опция --trace-config принимает аргумент, в котором указывается разделённый запятыми список областей, которые необходимо отслеживать
    Например:

    curl --trace-config ids,http/2 https://example.com

    ids те же идентификаторы, что и --trace-ids предоставляет
    time тот же выходной сигнал по времени, что и --trace-time обеспечивает
    all покажите все возможное
    tls Сведения об обмене по протоколу TLS
    http/2 Информация о кадре HTTP/ 2
    http/3 Информация о кадре HTTP/ 3
    * дополнительные в будущих версиях

    Перенаправление
    #Следовать за перенаправлением curl -vL http://example.com
    Сохранить в файл

    Опция -o указывает где сохранять вывод
    Если вы используете командную строку с двумя URL-адресами, вы должны указать curl, как обрабатывать оба из них. Параметры -o и -O указывают curl, как сохранять вывод для одного из URL-адресов, поэтому вы можете использовать столько этих параметров, сколько URL-адресов в командной строке.
    Если в командной строке URL-адресов, чем вариантов вывода, содержимое URL-адреса без соответствующей инструкции по выводу отправляется в стандартный вывод.
    Использование флага --remote-name-all автоматически заставляет curl действовать так, как если бы -O использовался для всех указанных URL-адресов, для которых не задана опция вывода.


    Подробнее об этом в источнике: https://everything.curl.dev/cmdline/urls/options.html

    curl -o curl.out https://netbash.ru #Пример использования команды curl с опцией --remote-name для загрузки файла с сохранением вывода под именем, указанным в URL curl --remote-name https://example.com/filename.zip #В этом примере файл будет сохранён в директорию /tmp. #Если директория не существует, для её создания используется опция --create-dirs curl --remote-name --output-dir /tmp http://httpbingo.org/uuid #Сохранение разных страниц сайта curl "http://example.com/{one,two}" -o "file_#1.txt" #Сохранение страниц двух разных сайтов curl "http://{one,two}.example.com" -o "file_#1.txt" # curl "http://{site,host}.host[1-5].example.com" -o "subdir/#1_#2"
    Аргументы с пробелами
    #Пример1 curl -A "I am your father" http://example.com
    JSON
    #post запрос в виде json curl -d '{ "name": "Darth" }' http://example.com
    Отправка данных из файла
    #Предположим, что файл, содержащий вышеупомянутые данные, называется «json»: curl -d @json http://example.com
    Отрицание
    curl --no-verbose http://example.com
    Запрос

    Часть URL-адреса, содержащая запрос, — это данные, которые находятся справа от знака вопроса (?), но слева от фрагмента, который начинается с хэша (#)
    Запрос может представлять собой любую последовательность символов, если они закодированы в URL. Обычно используется последовательность пар «ключ-значение», разделённых амперсандами (&). Например, https://example.com/?name=daniel&tool=curl
    Чтобы помочь пользователям создавать такие наборы запросов с правильной кодировкой, curl предлагает параметр командной строки --url-query [content]. Этот параметр добавляет содержимое, обычно пару «имя + значение», в конец части запроса в указанном URL-адресе
    При добавлении частей запроса curl добавляет разделители амперсандов
    Синтаксис идентичен тому, что используется в --data-urlencode с одним дополнением: префиксом +


    content: закодировать содержимое URL-адреса и добавить его в запрос. Содержимое не должно содержать символов = или @, так как в этом случае синтаксис будет соответствовать одному из других вариантов ниже
    =content: закодировать содержимое и добавить его в запрос. Первый символ = не включается в данные
    name=content: закодировать часть содержимого в URL и добавьте её в запрос. Часть имени уже должна быть закодирована в URL
    @filename: загрузить данные из указанного файла (включая все символы новой строки), закодировать эти данные в URL и добавьте их в запрос
    name@filename: загрузить данные из указанного файла (включая все новые строки), закодировать эти данные в URL-адресе и добавить их в запрос. К имени добавляется знак равенства, в результате чего получается name=urlencoded-file-content. Имя уже должно быть закодировано в URL-адресе.
    +content: Добавить содержимое в запрос, не выполняя никакого кодирования.

    Фрагмент

    URL-адреса могут содержать фрагментную часть. Которая начинается с символа решетки (#) и имени для конкретного элемента на веб-странице в браузерах. Пример такого URL-адреса может выглядеть так:
    https://www.example.com/info.html#the-plot
    curl отлично поддерживает фрагменты, когда ему передаётся URL-адрес, но часть с фрагментом на самом деле никогда не отправляется по сети, поэтому для операций curl не имеет значения, присутствует она или нет
    Если необходимо чтобы символ # был частью пути, а не разделял фрагмент, необходимо передать его в URL-кодировке как %23:
    curl https://www.example.com/info.html%23the-plot

    Url globbing

    Иногда есть необходимость получить набор URL-адресов, которые в основном одинаковы, лишь небольшая часть url меняется между запросами. Возможно, это числовой диапазон или набор имён. Curl предлагает «globbing» как способ легко указать множество таких URL-адресов
    Для этого используются зарезервированные символы [] и {}, которые обычно не могут быть частью допустимого URL, за исключением числовых IPv6-адресов. Если подстановка мешает, отключите её с помощью -g, --globoff
    При использовании последовательностей [ ] или {}, необходимо заключать полный URL-адрес в двойные кавычки, чтобы оболочка не вмешивалась в него. Это также относится к другим специальным символам, таким как, например, '&', '?' и '*'
    В то время как большинство функций, связанных с передачей данных в curl, предоставляются библиотекой libcurl, функция сопоставления URL-адресов — нет

    Числовой диапазон
    curl -O "http://example.com/[1-100].png" #изображения с чётными номерами curl -O "http://example.com/[0-100:2].png"
    Алфавитные диапазоны
    curl -O "http://example.com/section[a-z].html"
    Список
    curl -O "http://example.com/{one,two,three,alpha,beta}.html"
    Комбинации
    curl -O "http://example.com/{Ben,Alice,Frank}-{100x100,1000x1000}.jpg" #или curl -O "http://example.com/chess-[0-7]x[0-7].jpg"
    Кодирование скобок

    [ %5b
    ] %5d
    { %7b
    } %7d
    Или отключить глобализацию с помощью -g или --globoff

    Параллельные передачи

    curl предлагает опцию -Z (или --parallel), которая указывает на необходимость выполнения указанных операций параллельно. Если эта опция включена, curl выполняет множество операций одновременно, а не последовательно. По умолчанию он выполняет до 50 операций одновременно, и как только одна из них завершается, запускается следующая.
    В случаях, когда есть необходимость загрузить много файлов из разных источников, некоторые из которых могут загружаться медленно, а некоторые — быстро, это может значительно ускорить процесс
    Если 50 параллельных переводов недостаточно, можно изменить это с помощью опции --parallel-max

    curl --parallel "http://{site,host}.host[1-5].example.com" -o "subdir/#1_#2"
    trurl

    Подробнее об вспомогательном инструменте trurl, в источнике: https://everything.curl.dev/cmdline/urls/trurl.html


    Конфигурационный файл

    Использование опции -K или длинной формы --config указывает curl на необходимость чтения из файла конфигурации
    Указанный путь к файлу относится к текущему каталогу

    curl \ --config configFile.txt \ --url https://example.com

    Сам конфиграционный файл может выглядеть примерно следующим образом:

    # curl config file # Follow redirects --location # Do a HEAD request --head user-agent "Everything-is-an-agent" #Или user-agent = "Everything-is-an-agent" url = https://example.com
    Когда использовать кавычки

    Когда параметр содержит пробелы или начинается с символов : или =.
    Когда нужно использовать управляющие последовательности (доступные варианты: \\, \", \t, \n, \r и \v. Обратная косая черта перед любой другой буквой игнорируется)
    Если параметр, содержащий пробелы, не заключён в двойные кавычки, curl считает следующий пробел или новую строку концом аргумента

    Конфигурационный файл по умолчанию

    При вызове curl он всегда (если не используется -q), проверяет наличие файла конфигурации по умолчанию и использует его, если находит.
    Curl ищет файл конфигурации по умолчанию в следующих местах в указанном порядке:
    $CURL_HOME/.curlrc
    $XDG_CONFIG_HOME/.curlrc (Добавлено в версии 7.73.0)
    $HOME/.curlrc

    Global

    Можно указать несколько URL-адресов или их частей, заключив списки в фигурные скобки или диапазоны в квадратные скобки. Это называется "глобализацией"

    #Пример1 curl http://crm.{mail,yandex}.ru #Пример2 curl ftp://ftp.example.com/file[1-100].txt #Пример3 curl ftp://ftp.example.com/file[a-z].txt #Пример4, можно использовать несколько шаблонов рядом друг с другом http://example.com/archive[1996-1999]/vol[1-4]/part{a,b,c}.html

    При использовании последовательностей [] или {} при вызове из командной строки вам, вероятно, придется заключить полный URL-адрес в двойные кавычки, чтобы избежать вмешательства оболочки в его работу. Это также относится к другим символам, которые считаются специальными, например, "&", "?" и "*"
    При необходимости Отключите глобализацию с помощью -g, --globoff

    Переменные

    curl поддерживает переменные командной строки. Задать переменные можно с помощью --variable name=content или --variable name@file Содержимое переменной может быть расширено в параметрах опции с помощью "{{name}}", если имя опции имеет префикс "--expand-". При этом будет вставлено содержимое переменной "name" или пустое поле, если имя не существует в качестве переменной. Вставьте "{{" в строку дословно, добавив к ней обратную косую черту, например "\{{"
    Переменные среды можно определять с помощью --variable %VARNAME
    Например: --variable '%USER'
    Пользователь также может задать значение по умолчанию, если переменная среды не существует, с помощью =content или @file
    Далее переменную можно вставить в url
    --expand-url = "https://example.com/api/{{USER}}/method"

    #Пример1 curl --variable host=netbash --expand-url "https://{{host}}.ru" #Пример2 curl --variable %USER --expand-url "https://netbash.ru/{{USER}}" #Пример3 curl --variable %HOME --expand-variable test@{{HOME}}/text.txt --expand-data "{{fix:trim:url}}" https://netbash.ru #присвоить переменной содержимое обычного текстового файла curl --variable %USER@filename.txt --expand-url "https://netbash.ru/{{USER}}" #Сам параметр --variable также можно расширить, что позволяет присваивать переменным содержимое других переменных curl \ --expand-variable var1={{var2}} \ --expand-variable fullname="Mrs {{first}} {{last}}" \ --expand-variable source@{{filename}} #В конфигурационном файле это будет выглядить так: # Curl config file variable host=example expand-variable url=https://{{host}}.com expand-variable source@{{filename}}

    Источник1: https://daniel.haxx.se/blog/2023/07/31/introducing-curl-command-line-variables/

    Функции

    При расширении переменных curl предлагает набор функций для изменения способа их расширения. Функции применяются с помощью двоеточия + имени функции после переменной, например так: {{varName:function}}
    К переменной можно применить несколько функций. Они применяются в порядке слева направо: {{varName:func1:func2:func3}}
    Доступны следующие функции: trim, json, url и b64

    Функция trim

    Функция: trim
    Расширяет переменную без начальных и конечных пробелов. Пробелы определяются как:
    горизонтальные выступы
    пробелы
    новые линии
    вертикальные выступы
    подача формы и возврат каретки
    Это особенно полезно при чтении данных из файлов.
    --expand-url "https://example.com/{{path:trim}}"


    Полный разбор функций можно увидеть в источнике: https://everything.curl.dev/cmdline/variables.html

    Пароли

    Один из способов избежать передачи имени пользователя и пароля в командной строке — использовать файл .netrc или файл конфигурации. Можно также использовать опцию -u без указания пароля, и тогда curl будет запрашивать его у пользователя при запуске.
    Командная строка отправляет учётные данные пользователя на HTTP-сервер, который использует протокол передачи данных в открытом виде, что позволяет злоумышленникам перехватывать соединение и видеть, что отправляется. В этом примере командной строки curl использует базовую аутентификацию HTTP, которая совершенно небезопасна
    Самый простой способ — использовать зашифрованные версии протоколов. Используйте HTTPS вместо HTTP, FTPS вместо FTP и так далее
    Если нужен HTTP, следует использовать такие методы как: Digest (--digest), Negotiate (--negotiate.) и NTLM (--ntlm)

    Прогресс

    В curl есть встроенный индикатор выполнения. Когда curl вызывается для передачи данных (загрузки или выгрузки), он может отображать этот индикатор на экране терминала
    Можно принудительно отключить индикатор выполнения с помощью опции -s / --silent
    В Curl также есть альтернативный и более простой индикатор выполнения, который можно включить с помощью -# / --progress-bar
    Индикатор выполнения отображает количество байт в секунду
    Но можно использовать другие еденицы:
    K 2^10 килобайт
    M 2^20 мегабайт
    G 2^30 гигабайт
    T 2^40 терабайт
    P 2^50 петабайт


    % Total % Received % Xferd Average Speed Time Curr. Dload Upload Total Current Left Speed 0 151M 0 38608 0 0 9406 0 4:41:43 0:00:04 4:41:39 9287

    % Процент выполненного перевода от общего объема перевода
    Total Общий размер всего ожидаемого перевода (если известен)
    % Процент завершения загрузки
    Received Количество загруженных в данный момент байт
    % Процент завершенной загрузки
    Xferd Текущее загруженное количество байт
    Average Speed Dload Средняя скорость передачи данных за всё время загрузки, в байтах в секунду
    Average Speed Upload Средняя скорость передачи данных на данный момент, в байтах в секунду
    Time Total Ожидаемое время выполнения операции в формате HH:MM:SS для обозначения часов, минут и секунд
    Time Current Время, прошедшее с начала передачи, в формате HH:MM:SS для обозначения часов, минут и секунд
    Time Left Ожидаемое время, оставшееся до завершения, в HH:MM:SS обозначениях часов, минут и секунд
    Curr. Speed Средняя скорость передачи за последние 5 секунд в количестве байт в секунду


    При использовании опции --parallel curl может выполнять множество операций одновременно, и тогда вышеупомянутый индикатор выполнения не работает должным образом, так как ему нужно сообщать пользователю о большом количестве операций в одной строке состояния.
    DL% Процент завершенной загрузки
    UL% Процент загруженных завершенных
    DLed Количество загруженных байт
    ULed Количество загруженных байт
    Xfers Количество завершенных переводов
    Live Количество текущих переводов
    Total Общее ожидаемое время выполнения всех операций в формате HH:MM:SS для часов, минут и секунд
    Current Сколько времени он работает, в формате HH:MM:SS для часов, минут и секунд
    Left Ожидаемое время, оставшееся до завершения, в HH:MM:SS обозначениях часов, минут и секунд
    Speed Средняя скорость передачи за последние 5 секунд в количестве байт в секунду

    Версия
    curl --version curl 8.7.1 (x86_64-pc-linux-gnu) libcurl/8.7.1 OpenSSL/3.0.2 zlib/1.3.1 Release-Date: 2024-03-27 Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp ws wss Features: alt-svc AsynchDNS HSTS HTTPS-proxy IPv6 Largefile libz NTLM SSL threadsafe TLS-SRP UnixSockets

    В выводе можно увидеть используемые версии библиотек, дату выпуска, поддерживаемые прооколы
    Если к номеру версии curl добавлено -DEV, это означает, что версия создана непосредственно из разрабатываемого исходного кода и не является официально выпущенной и одобренной версией.


    Код выхода

    Если операция прошла по плану curl вернет код 0
    Когда curl завершает работу с ненулевым кодом, он также выводит сообщение об ошибке (если не используется --silent).
    Ознакомиться со всеми типами ошибок можно в источнике: https://everything.curl.dev/cmdline/exitcode.html


    Пользователи также могут создавать собственные сообщения об ошибках с помощью --write-out. Псевдопеременная %{onerror} позволяет задать сообщение, которое будет отображаться только при возникновении ошибок, и предлагает %{errormsg} и %{exitcode} среди всех переменных.

    curl --write-out "%{onerror}curl says: (%{exitcode}) %{errormsg}" \ https://curl.se/
    Копировать как curl

    Большинство современных браузеров позволяют скопировать пользовательский запрос в виде запроса для воспроизведения операции через curl
    https://everything.curl.dev/cmdline/copyas.html
    В некоторых случаях это может быть полезно

    Вывод текста в конце

    --write-out или просто -w для краткости, выводит заданный текст и информацию после завершения передачи

    curl -w "formatted string" http://example.com/ #Вывод из файла curl -w @filename http://example.com/

    Доступ к доступным переменным осуществляется с помощью %{variable_name} в строке, и эта переменная заменяется на правильное значение. Чтобы вывести обычный % символ, можно использовать %%. Можно вывести новую строку с помощью \n, возврат каретки с помощью \r и пробел с помощью \t.

    curl -w "Type: %{content_type}\nCode: %{response_code}\n" \ http://example.com

    Доступные переменные для --write-out можно подсмотреть в источнике: https://everything.curl.dev/usingcurl/verbose/writeout.html


    #Пример использования --write-out curl -w "Цепочка сертификатов: %{certs}" https://netbash.ru
    HTTP headers

    Эта опция также позволяет легко выводить содержимое отдельных заголовков HTTP-ответов

    #name — это имя заголовка без учёта регистра curl -w "Server: %header{server}\n" http://example.com
    Output

    По умолчанию эта опция выводит выбранные данные в стандартный поток вывода. Если этого недостаточно, можно использовать псевдопеременную %{stderr} для вывода в стандартный поток ошибок, а %{stdout} — для возврата в стандартный поток вывода.
    Начиная с версии curl 8.3.0, появилась функция, которая позволяет пользователям отправлять выходные данные в файл: %output{filename}
    Если необходимо, чтобы curl добавлял данные в этот файл, а не создавал его с нуля, добавьте к имени файла префикс >>. Например: %output{>>filename}


    Загрузка файла с сервера

    Опция --no-clobber позволяет перезаписывать существующий файл, но создает новый файл с таким же именем но с дополнительным постфиксом
    Опция --remove-on-error сообщает curl, что нужно удалить любой частично сохранённый файл, если curl завершает работу с ошибкой


    Многие URL-адреса уже содержат имя файла в самом конце. curl позволяет использовать это как ярлык, чтобы не приходилось повторять его с помощью опциии -o
    Можно изменить каталог, в котором будет сохранён этот файл, с помощью --output-dir

    #Скачать файл curl -O http://example.com/file.html #Сохранить файл в каталоге /tmp с именем, взятым из URL-адреса curl -O --output-dir /tmp http://example.com/file.html
    Перенаправление вывода ошибок

    Оболочки Unix обычно позволяют перенаправлять поток stderr отдельно. Поток stderr — это обычно поток, который также отображается в терминале, но его можно перенаправить отдельно от потока stdout. Поток stdout предназначен для данных, а stderr — для метаданных, ошибок и т. д., которые не являются данными. Вы можете перенаправить stderr с помощью 2>file следующим образом:

    curl http://example.com > files.html 2>errors
    Сохранение файла под выбранным именем

    -O — это просто инструкция для одной загрузки, поэтому, если загружается несколько URL-адресов, необходимо использовать ее в большем количестве

    curl -O -O http://example.com/1 http://example.com/2 curl -o one.html http://example.com/1 http://example.com/2 curl -o 1.txt -o 2.txt http://example.com/1 http://example.com/2
    Посредники

    Посредники — это явные или неявные прокси-серверы. В некоторых средах есть необходимость использовать прокси-серверы, по разным причинам, но есть также прозрачные прокси-серверы, которые незаметно перехватывают сетевой трафик и проксируют его независимо от желания клиента
    Прокси-серверы — это «посредники», которые завершают передачу данных, а затем действуют от вашего имени на удалённом сервере. Это может привести к явной фильтрации и «спасению» от определённого контента или даже «защите» удалённого сервера от данных, которые вы пытаетесь ему отправить, но в ещё большей степени это приводит к тому, что программное обеспечение прокси-сервера по-своему интерпретирует работу протокола
    Посредники, вмешивающиеся в работу, часто становятся причиной множества проблем и загадок, вплоть до откровенно вредоносных изменений контента.
    Рекомендуется использовать HTTPS или другие способы проверки того, чтобы подтвердить, что загружаемое или отправляемое содержимое действительно является данными, отправленные удалённым сервером

    Максимальный размер запускаемого файла

    curl --max-filesize 100000 https://example.com/
    Сохранение метаданных

    Опция --xattr указывает curl сохранять метаданные файла в расширенных атрибутах

    Опция --raw

    При использовании --raw отключается всё внутреннее HTTP-декодирование содержимого или кодировок передачи и вместо этого curl передаёт неизменённые, необработанные данные

    Повторить попытку

    С помощью опции --retry можно указать curl на повторную передачу данных в случае сбоя
    Временная ошибка означает: тайм-аут, код ответа HTTP: 408, 429, 500, 502, 503 или 504
    Когда curl собирается повторить попытку передачи данных, он сначала ждёт одну секунду, а затем для всех последующих попыток удваивает время ожидания до тех пор, пока оно не достигнет 10 минут, которые затем являются задержкой между остальными попытками
    С помощью --retry-delay можно отключить этот алгоритм экспоненциального ожидания и установить собственную задержку между попытками
    С помощью --retry-max-time можно ограничить общее время, отведённое на повторные попытки, опция --max-time пуказывает максимальное время, которое может быть потрачено на одну из этих попыток.

    #Повтор curl до 5 раз, но не более двух минут: curl --retry 5 --retry-max-time 120 https://example.com

    Механизм повторных попыток по умолчанию выполняет повторные попытки передачи данных только в случае так называемых временных ошибок. Это ошибки, о которых сервер сообщает как о существующих в данный момент, но которые могут исчезнуть позже
    Можно указать curl, что «отказ в подключении» является временной ошибкой. Например cервер, к которому идет запрос, нестабилен, или, может быть иногда необходим загрузить с него данные, когда он перезагружается, или что-то подобное. Для этого используется --retry-connrefused

    #Повторить попытку до 5 раз и указать ECONNREFUSED в качестве причины для повторной попытки:
    curl --retry 5 --retry-connrefused https://example.com

    Самая агрессивная форма повторных попыток предназначена для случаев, когда URL-адрес должен работать, и не допускаеть никаких сбоев. При использовании --retry-all-errors curl рассматривает все сбои при передаче данных как причину для повторной попытки.

    #Например: повторить попытку до 12 раз для всех ошибок: curl --retry 12 --retry-all-errors https://example.com
    Возобновление и загрузка диапазона с ftp
    #Чтобы начать загрузку FTP-файла со смещением в байтах 100 curl --continue-at 100 ftp://example.com/bigfile #Продолжить загрузку ранее прерванной curl --continue-at - http://example.com/bigfile -O #Если нужен только определённый диапазон байтов curl --range 100-1099 http://example.com/bigfile
    Отправка данных

    Отправка данны может осуществляться по одному из нескольких протоколов: FILE, FTP, FTPS, HTTP, HTTPS, IMAP, IMAPS, SCP, SFTP, SMB, SMBS, SMTP, SMTPS и TFTP


    POST — это метод HTTP, который был изобретён для отправки данных в принимающее веб-приложение
    Тип загрузки обычно выбирается с помощью параметров -d или --data, но есть несколько дополнительных вариантов
    Выбор способа отправки данных зависит от того, что ожидает и может обработать принимающий сервер
    HTTP PUT — это метод загрузки, который был разработан для отправки полного ресурса, предназначенного для размещения на удалённом сайте в неизменном виде или даже для замены существующего там ресурса
    Это наименее используемый метод загрузки для HTTP в интернете, и на многих, если не на большинстве, веб-серверов даже не включена поддержка PUT

    #Отправка файла, которая в большинстве не поддерживается серверами http curl -T uploadthis http://example.com/ #Отправка файла на ftp сервер: curl -T uploadthis ftp://example.com/this/directory/ #дополнение целевого файла при загрузке вместо перезаписи curl -T uploadthis --append ftp://example.com/directory/remotename #Отправка нескольких файлов curl -T 'image[1-99].jpg' ftp://ftp.example.com/upload/
    Ограничение скорости передачи и частоты запросов

    #Остановить передачу, если скорость ниже определенного значения curl --speed-time 15 --speed-limit 1000 https://example.com/ #Ограничить скорость передачи данных curl https://example.com/ --limit-rate 200K #Загрузить 100 изображений, но не быстрее, чем 2 передачи в секунду curl --rate 2/s -O https://example.com/[1-100].jpg #Загрузить 10 изображений, но не быстрее, чем 3 передачи в час: curl --rate 3/h -O https://example.com/[1-10].jpg
    Сжатие данных перед отправкой

    #Для sftp curl -O --compressed-ssh sftp://example.com/bigfile
    Не загружать файлы, которые уже были загружены

    Для этого используется опция --skip-existing

    curl --skip-existing -O https://example.com/image[0-999].jpg
    Настройка соединений

    Классы трафика для опции --ip-tos:
    CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, AF11, AF12, AF13,
    AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43, EF,
    VOICE-ADMIT, ECT1, ECT0, CE, LE, LOWCOST, LOWDELAY,
    THROUGHPUT, RELIABILITY, MINCOST


    Multipath TCP - это способ, с помощью которого TCP-соединение использует несколько параллельных сетевых путей для максимальной пропускной способности и повышения отказоустойчивости по сравнению с обычным однопутным соединением, используемым обычным TCP

    #Указать приоритет vlan: curl --vlan-priority 4 https://example.com #Указать класс трафика TOS curl --ip-tos CS5 https://example.com #Использование Multipath TCP curl --mptcp https://example.com
    Разрешение имен

    curl имеет множество способов использовать другой хост
    Обычно это можно сделать с помощью редактирования /etc/hosts, редактирование которого не всегда возможно
    Опция --resolve в команде curl позволяет указать пользовательский IP-адрес для конкретного хоста и порта

    #Запрос к серверу netbash.ru, но указать в заголовке другой хост #В данном случае заголовок host может использоваться при сопоставлении файлов cookie #Данный способ не подходит для https #В HTTPS-протоколе TLS есть отдельное поле расширения SNI (Server Name Indication) curl -v -H "Host: test.netbash.ru" http://netbash.ru * Host netbash.ru:80 was resolved. * IPv6: (none) * IPv4: 194.169.160.86 * Trying 194.169.160.86:80... * Connected to netbash.ru (194.169.160.86) port 80 * using HTTP/1.x > GET / HTTP/1.1 > Host: test.netbash.ru > User-Agent: curl/8.11.1 > Accept: */* #Перенаправить порт 80 сервера netbash.ru на локальный хост curl --resolve netbash.ru:443:127.0.0.1 http://netbash.ru curl --connect-to www.example.com:80:load1.example.com:80 \ http://www.example.com #указать, какой именно DNS-сервер должен использовать curl curl --dns-servers 8.8.8.8 http://www.example.com/ #указать curl использовать определённый сетевой интерфейс для DNS-запросов curl --dns-interface tun0 http://netbash.ru
    Время ожидания соединения

    Если по истечении двухсот миллисекунд curl пытается подключиться к IPv6, он запускает вторую серию попыток подключения по IPv4 параллельно. В том же стиле он перебирает список адресов IPv4 при ошибках подключения
    Побеждает первое сработавшее соединение, а все остальные попытки отбрасываются.


    --happy-eyeballs-timeout-ms — это опция в команде cURL, которая позволяет использовать алгоритм Happy Eyeballs для подключения к хостам с двойным стеком, эта опция может понадобиться подключиться к серверу с высокой задержкой

    #Максимальное время в секундах, которое curl позволяет использовать для попытки подключения curl --connect-timeout 2.781 https://example.com/ #Использование --happy-eyeballs-timeout-ms curl --happy-eyeballs-timeout-ms 500 https://example.com/
    Сетевой интерфейс

    С помощью опции --interface можно указать, к какому сетевому интерфейсу, IP-адресу или даже имени хоста

    curl --interface eth0 https://netbash.ru
    Номер локального порта

    #Указать на какой порт должен приходить ответ curl --local-port 4201 https://example.com
    Функция TCP keepalive

    Keepalive — это сигнал, отправляемый одним устройством другому для регулярной проверки статуса соединения с удалённым устройством
    Если канал между клиентом и сервером пассивен некоторое время (по умолчанию 2 часа), то посылается служебное сообщение, если ответа на него не поступило, через 75 секунд (обычно) сообщение посылается повторно и так несколько раз. Если ответ получен – таймер сбрасывается, и отчёт начинается заново. Если после нескольких повторов ответа так и не поступило, то соединение разрывается

    #Отключить keepalive curl --no-keepalive https://example.com/ #Изменить интервал между повторной отрправкой keepalive curl --keepalive-time 300 https://example.com/ #Изменить кол-во запросов keepalive на которые curl не получает ответа curl --keepalive-cnt 3 https://example.com
    Методы запроса

    В каждом HTTP-запросе есть метод. Иногда его называют глаголом. Наиболее часто используемые методы — GET, POST, HEAD и PUT
    -d - GET запрос
    -F - POST запрос
    -I генерирует HEAD
    -T отправляет PUT


    Коды ответов HTTP

    1xx: переходный отклик, грядет нечто большее
    2xx: успех
    3xx: перенаправление
    4xx: клиент запросил то, что сервер не может или не хочет предоставлять
    5xx: проблема на сервере


    Можно использовать опцию --write-out команды curl для извлечения кода ответа

    Аутентификация

    Сервер, требующий аутентификации, отправляет ответ с кодом 401 и соответствующим заголовком WWW-Authenticate:, в котором перечислены все поддерживаемые сервером методы аутентификации
    HTTP-прокси, требующий аутентификации, отправляет ответ с кодом 407 и соответствующим заголовком Proxy-Authenticate:, в котором перечислены все поддерживаемые прокси-сервером методы аутентификации
    Чтобы curl выполнил HTTP-запрос с аутентификацией, используйте опцию -u
    Если необходимо, чтобы curl сначала проверил, действительно ли требуется аутентификация, можно curl выяснить это, с помощью --anyauth


    Источник: https://everything.curl.dev/http/auth.html

    #Простая и не безопасная аутентификация: curl --user daniel:secret http://example.com/ #выполнить запрос без аутентификации, а затем при необходимости переключиться на аутентификацию curl --anyauth --user daniel:secret http://example.com/ #Аналогичная опция для proxy curl --proxy-anyauth --proxy-user daniel:secret http://example.com/ \ --proxy http://proxy.example.com:80/
    Версии HTTP

    Основной особенностью протокола HTTP/3 является возможность мультиплексирования нескольких логических потоков по одному физическому соединению
    Подробнее: https://everything.curl.dev/http/versions/http3.html

    --http1.0 HTTP/1.0 --http1.1 HTTP/1.1 --http2 HTTP/2 --http2-предварительные знания HTTP/2 --http3 HTTP/3
    POST

    Для отправки методом post можно использовать опцию -d (--data)
    При отправке POST-запроса с помощью опции -d в curl включается заголовок по умолчанию, который выглядит как Content-Type: application/x-www-form-urlencoded. Именно такой заголовок используется в обычном браузере для отправки простого POST-запроса.

    #Отправка методом post curl -v --data "name=admin&password=password111" https://netbash.ru #Альтернативный вариант: curl -v -d name=admin -d password=password111 https://netbash.ru #Если объём отправляемых данных слишком велик для простой строки, можно использовать вывод из файла: curl -d @filename http://example.com #
    JSON

    Например, если необходимо отправить JSON на сервер и точнее указать серверу содержимое:
    curl -d '{json}' -H 'Content-Type: application/json' https://example.com В версии curl 7.82.0 появилась опция --json как новый способ отправки данных в формате JSON на HTTP-серверы с помощью POST. Эта опция заменяет эти три:
    --data [arg]
    --header "Content-Type: application/json"
    --header "Accept: application/json"

    #Отправить базовый объект JSON на сервер: curl --json '{"tool": "curl"}' https://example.com/ #Отправить JSON из локального файла: curl --json @json.txt https://example.com/ #Отправить JSON, переданный curl в stdin: echo '{"a":"b"}' | curl --json @- https://example.com/

    Кавычки, используемые в данных JSON, иногда затрудняют и усложняют их написание и использование в оболочках и скриптах.

    #Отправка JSON на сервер с помощью jo и --json jo name=jo n=17 parser=false | curl --json @- https://example.com/

    Сам curl не знает и не понимает содержимое, которое он отправляет или получает, в том числе когда сервер возвращает JSON в своём ответе.
    Использование отдельного инструмента для синтаксического анализа или форматирования ответов JSON может упростить вам задачу. Один из таких инструментов — jq.

    #Отправка JSON на сервер и выведите ответ в формате JSON: curl --json '{"tool": "curl"}' https://example.com/ | jq #Альтернативный вариант jo name=jo n=17 | curl --json @- https://example.com/ | jq
    Источники
    Последнее изменение: 26.01.2025 23:22


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ