Curl в сценариях Bash на примере

Если вы когда-нибудь сидели перед терминалом, набирали «curl», вставляли URL-адрес того, что хотите загрузить, и нажимали «Enter», круто! Вы собираетесь убить его с помощью curl в сценариях bash в кратчайшие сроки. Здесь вы узнаете, как использовать curl в сценариях bash, а также важные советы и рекомендации по автоматизации.

Отлично! Что теперь? Прежде чем что-либо убить в bash, страшно знать, где получить помощь, если возникнут проблемы. Вот как выглядит справочная страница для команды curl или curl help. Скопировать и вставить. Постарайтесь не отвлекаться от внешнего вида. Есть много вариантов, которые вам понадобятся только позже. Что еще более важно, он служит кратким справочником по нужным вам параметрам поиска.

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

Команды справки для curl в bash

  • man curl
  • curl –help или curl -h
  • Все curl; Основы работы с командной строкой

При необходимости обращайтесь к этим ресурсам. В дополнение к этой части, они будут вашими помощниками в вашем путешествии по устранению этого с помощью curl в сценариях bash.

Теперь, когда получение справки и перечисление параметров командной строки отсутствует, давайте продолжим к трем способам.

Три способа свертывания в bash на примере

Вы можете возразить, что существует более трех способы завивки в bash. Однако для простоты скажем, что они есть. Также обратите внимание, что на практике использование каждого из способов не исключает друг друга. Фактически, вы обнаружите, что способы могут быть переплетены в зависимости от цели вашего сценария bash. Приступим.

Первый способ: загрузка файлов

Все параметры, кроме curl, по умолчанию загружают файлы. В bash мы используем curl для загрузки файла следующим образом.

curl $ {url}
# download file

Это отправляет содержимое файла, который мы загружаем, на стандартный вывод; то есть ваш экран. Если файл представляет собой видео или изображение, не удивляйтесь, если вы услышите несколько сигналов. Нам нужно сохранить в файл. Вот как это выглядит.

curl $ {url}> outfile
# скачать файл с сохранением как outfile

curl $ { url} -o outfile
# загрузить файл, сохранить как параметр

curl $ {url} -O
# загрузить файл, наследовать имя файла

## ожидать, что файл будет сохранен как $ (basename $ {url})

Обратите внимание, что параметр «Сохранить файл загрузки как вариант, наследующий имя файла», особенно полезен при использовании подстановки URL-адресов, которая рассматривается в разделе bash curl loop.

Теперь перейдем к тому, как проверять заголовки перед загрузкой файла с помощью curl в bash.

Второй способ: проверка заголовков

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

curl -I $ {url}
# заголовки загрузки

Обратите внимание, что есть другие способы сбросить заголовки из запросов curl, которые оставлены для домашнего задания.

Вот быстрый пример, показывающий, как второй способ работает в сценариях bash, которые можно использовать в качестве части проверки работоспособности веб-страницы .

Пример) bash curl получить код ответа

Часто мы хотим получить код ответа на запрос curl в bash. Для этого нам нужно сначала запросить заголовки ответа, а затем извлечь код ответа. Вот как это будет выглядеть.

url = https://temptemp3.github.io
# просто какой-то url

curl $ {url} -I -o headers -s
# загрузить файл

cat заголовки
# заголовки ответа
## expect
# HTTP/2 200
#server: GitHub.com
# content-type: text/html; charset = utf-8
# strict-transport-security: max-age = 31557600
# last-modified: Thu, 03 May 2018 02:30:03 GMT
#etag : «5aea742b-e12»
# access-control-allow-origin: *
# expires: Fri, 25 Jan 2019 23:07:17 GMT
# cache-control: max-age = 600
# x-github-request-id: 8808: 5B91: 2A4802: 2F2ADE: 5C4B944C
# accept-range: bytes
# дата: пт, 25 Янв 2019, 23:12:37 GMT
#via: 1.1 varnish
#age: 198
# x-serve-by: cache-nrt6148-NRT
# x-cache: HIT
# x-cache-hits: 1
# x-timer: S1548457958.868588, VS0, VE0
#vary: Accept-Encoding
# x-fastly-request-id: b78ff4a19fdf621917cb6160b422d6a7155693a9
# content-length: 3602

заголовки cat | голова -n 1 | cut ‘-d’ ‘-f2’
# получить код ответа
## expect
# 200

Мой сайт работает . Отлично!

Теперь перейдем к созданию сообщений с помощью curl в сценариях bash.

Третий способ: создание сообщений

Придет время, когда вам нужно будет делать сообщения с помощью curl в bash для аутентификации для доступа или изменения личного содержимого. Так обстоит дело с API и html-формами. Может потребоваться несколько запросов на завиток. Командная строка заполнителя curl для этого способа выглядит следующим образом.

curl -u -H —data $ {url}
# отправить созданный запрос

Создание сообщений включает добавление соответствующих заголовков и данных для аутентификации. Я подготовил несколько примеров создания сообщений с помощью curl в bash.

Пример) Обычная проверка подлинности

Вот пример использования curl в сценариях bash для загрузки файла требуется базовая аутентификация. Обратите внимание, что учетные данные хранятся в отдельном файле с именем bash-curl-basic-auth-example-config.sh, который также включен ниже.

curl-basic-auth. sh

#!/bin/bash
## curl-basic-auth
## — Пример базовой аутентификации http с использованием
## curl в bash
## версии 0.0.1
################## #############################
. $ {SH2}/cecho.sh # цветной echo
curl-basic-auth () {
cecho желтый url: $ {url}
локальное имя пользователя
local пароль
. $ {FUNCNAME} -config.sh # $ {имя пользователя}, $ {passwd}
curl -v -u $ {имя пользователя}: $ {пароль} $ {url} —location
}
########################################## #####
if [$ {#} -eq 1]
then
url = «$ {1}»
else
exit 1 # неправильные аргументы
fi
########################################### ################
curl-basic-auth
################### #############################
## сгенерировано create-stub2.sh v0.1.1
##, вс, 27 января 2019 г., 14:04:18 +0900
## см.
###### #########################################

Источник: curl-basic-auth.sh

curl-basic-auth-config.sh

#!/bin/bash

## curl-basic-auth-config
## версия 0.0.1 — начальная

##################################################################### #####

username = «username»
password = «passwd»

########## #####################################

## сгенерировано create-stub2.sh v0.1.1
##, вс, 27 января 2019 г., 14:08:17 +0900
## см.

#### ###########################################

Источник: curl-basic-auth-config.sh

Вот как это выглядит в командной строке.

bash bash-curl-basic-auth-example.sh URL
## ожидать ответа для URL после базовой аутентификации

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

Обратите внимание, что для обработки перенаправленных запросов был добавлен параметр –location.

Теперь, когда у нас нет базовой аутентификации, давайте немного усложним задачу.

Пример) Отправка html-формы с защитой csrf

Магия bash в том, что вы можете делать практически все, что хотите. Прыгать через обручи защиты csrf — это один из способов убить ее с помощью curl в сценариях bash.

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

По сути, в ответ страницы включен токен безопасности.

Вот ваш Сценарий bash может выглядеть так, чтобы получить авторизованный доступ к содержимому страницы с защитой csrf.

curl-example.sh

#!/bin/bash
## curl-example
## — отправка формы с защитой csrf
## версия 0.0.1 — начальная
######################################################################### #
. $ {SH2}/псевдонимы/команды. sh # подкоманды
## специально созданный шаблон bash curl для этого примера
template-command-curl () {{local method; method = «$ {1}»; }
{
команда curl $ {url}
if-headers
if-data
if-options
} | tee $ {method} -response
}
curl-head () {{локальный URL; url = «$ {url}»; }
template-command-curl
head
}
curl-get () {{локальный URL-адрес; url = «$ {url}»; }
template-command-curl
get
}
## setup curl
if-headers () {true; }
if-data () {истина; }
if-options () {истина; }
curl-post () {{локальный URL; url = «$ {url}»; }
template-command-curl
post
}
curl () {# точка входа для curl-head, curl-get, curl-post
команды
}
main () {
## при необходимости переписать URL и т. д.
(# запрос curl head
if-options ( ) {
cat — расположение
EOF
}
curl head $ {url}> head-response
)
test «$ (cat head-response | grep -e ‘Location:’)» || {
## блокировать переназначение базы URL-адресов для местоположения ответа заголовка
url =…
}
reset-curl
## setup curl …
curl get $ {url} #> get-response
extract-info-for-post-request # ## сбросить curl и настроить при необходимости…
curl post $ {url} #> post-response
}
curl-example () {
true
}
############################################################################ #######
if [$ {#} -eq 0]
then
true
else
exit 1 # неправильные аргументы
fi
################################################################# ###########
пример curl
######################### #######################
## сгенерировано create-stub2.sh v0.1.1
## на Sun , 27 янв 2019 16:36:17 +0900
## см.
############# ##################################

Источник: curl-example.sh

Примечания к сценарию
Он использует псевдоним, называемый командами, которые я упоминал в предыдущем сообщении о bash d eclare, которая позволяет объявлять подкоманды неявно посредством соглашения.

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

subshell-functions.sh

#!/bin/bash
## subshell-functions
# # версия 0.0. 1 — начальный
################################################################### ########
d () {истина; }
c () {истина; }
b () {правда; }
a () {
{б; c; d; }
(
b () {
cat Я b
EOF
}
{b; c; d;}
)
{b; c; d; }
}
######################################################################################### ############
if [$ {#} -eq 0]
then
true
else
exit 1 # неверные аргументы
fi
##################################################################### ################
a
####################### ##########################
## сгенерировано create-stub2.sh v0.1.1
# # вс, 27 января 2019 г. 13:43:50 +0900
## см.
########## #####################################

Источник: subshell-functions.sh

Вот пример командной строки соответствия.

bash a.sh
## expect
Я б

Пример) Вызов API Wonderlist

Вот командная строка запроса curl в сценарии bash, который я написал в конце 2017 года еще до перехода на Trello.

curl
$ {X}
$ {url}
-H «X-Access-Token: $ {WL_AT}»
-H «X-Client-ID: $ {WL_CID}»
— без звука

Источник: wonderlist.sh/main.sh: Строка 40

Примечания к script

$ {X} содержит параметр -X, который может передаваться вызывающими функциями. Если вы не знакомы с этой опцией, она задает команду запроса для использования. То есть GET, POST, HEAD и т. Д. Согласно документации api.

Он содержит несколько параметров -H для аутентификации.

Параметр –silent используется, потому что в некоторых случаях отображение прогресса в терминале было бы излишним для фоновых запросов.

Конечно, теперь вы убиваете его с помощью curl в сценариях bash. Затем мы переходим к специальным темам, чтобы собрать все это воедино.

Цикл по URL-адресам с помощью curl в bash

Предположим, у нас есть список URL-адресов, которые мы хотели бы перебрать и скрутить. То есть мы хотим загрузить с помощью curl для каждого URL-адреса в нашем списке. Вот как мы можем выполнить эту задачу в командной строке.

## method (1)

curl () {echo «фиктивный ответ на $ {@}»; } # Поддельный curl для тестирования

urls () {cat/dev/clipboard; } # Возвращает список URL

для URL в $ (urls); сделать curl $ {url}; done # curl loop

## expect
# фиктивный ответ для всего, что находится в вашем
# фиктивного ответа для буфера обмена
# фиктивного ответа для. ..

Если у вас нет списка URL-адресов для копирования, вот список из 100 URL-адресов, которые, скорее всего, ответят на HTTP-запрос с помощью curl.

Суть создания популярных URL-адресов на основе списка самых популярных веб-сайтов в мире

Часто мы хотим не только свернуть список URL-адресов в bash. Мы можем захотеть сгенерировать URL-адреса для завивки по мере прохождения цикла.. Для выполнения этой задачи нам нужно ввести переменные в URL следующим образом.

## method (2)

curl () { echo «фиктивный ответ на $ {@}»; } # Поддельный curl для тестирования
url () {echo $ {url_base}/$ {i}; } # Шаблон URL
urls () {# генерировать все URL
local i
для i в $ {range}
do
url
готово
}

url_base = «https://temptemp3.github.io» # просто базовый
range = $ (echo {1. .9}) # только некоторый диапазон
для url в $ (urls); сделать curl $ {url}; done # curl loop

## expect
# фиктивный ответ для https://temptemp3.github.io/1
# фиктивный ответ для https:// temptemp3.github.io/2
# фиктивный ответ для https://temptemp3.github.io/3
# фиктивный ответ для https://temptemp3.github.io/4
# фиктивный ответ для https://temptemp3.github.io/5
# фиктивный ответ для https://temptemp3.github.io/6
# фиктивный ответ для https:// temptemp3.github.io/7
# фиктивный ответ для https://temptemp3.github.io/8
# фиктивный ответ для https://temptemp3.github.io/9

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

# method (3)

unset -f curl
# включен на всякий случай
curl https://temptemp3.github.io/[0-9 ]
# цикл curl с использованием подстановки URL

## expect
#response для https://temptemp3.github.io/1
#response для https://temptemp3.github.io/2
#response для https://temptemp3.github.io/3
#response для https://temptemp3.github.io/4
#response для https://temptemp3.github.io/5
#response для https:// temptemp3.github.io/6
#response для https://temptemp3.github.io/7
#response для https://temptemp3.github.io/8
#response для https://temptemp3.github.io/9

Здесь мы видим, что любой из вышеперечисленных методов может использоваться для реализации цикла curl в bash В зависимости от использования случай и желаемый уровень контроля, метод может быть предпочтительнее другого.

Обработка ошибок curl в bash

В curl отсутствует одна вещь, а именно возможность обрабатывать ошибки. Вот где на помощь приходит bash.

Curl имеет параметр – retry NUM, который, как вы, возможно, догадались, сообщает curl, что нужно повторить попытку определенное количество раз. Однако что, если мы хотим, чтобы curl эффективно повторял попытки бесконечно долго, пока не добился успеха?

curl-bashh-retry.sh

#!/bin/bash
## curl-retry
## — неограниченное количество повторений curl
## версия 0.0. 1
#################################################################### ######
car () {
echo «$ {1}»
}
curl-error-code () {
тест! -f «ошибка-завитка» || {
car $ (
cat curl-error
| sed
-e ‘s/[^ 0-9]//g’
)
}
}
curl-retry () {
while [! ]
do
curl temptemp3.sh 2> curl-error || {
case $ (curl-error-code) в
6) {
### обрабатывает код ошибки 6
echo curl не может разрешить хост
} ;;
*) {
#
true # еще не реализовано
} ;;
esac
сон 1
продолжить
}
перерыв
готово
}
#################################################################### ######
if [$ {#} -eq 0]
then
true
else
exit 1 # неправильные аргументы
fi
###################################### ##########
curl-retry
########################## ######################
## сгенерировано create-stub2.sh v0.1.1
## на Sun, 27 янв 2019 15:58:51 +0900
## см.
############## ##################################

Источник : curl-retry.sh
Вот что мы видим в командной строке.

bash curl-bash-retry.sh
## expect
#curl не может разрешить хост
#curl не может разрешить хост
# …

надеюсь, что в конечном итоге кто-то создаст temptemp3.io, и наш скрипт выйдет с нулевым статусом выхода.

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

Downldr.sh

Иногда бывает полезно загружать большие файлы по частям. Вот отрывок из сценария bash, который я недавно написал с помощью curl.

curl
$ {src}
-r $ ( ($ {i} * $ {chunk_size})) — $ (((($ {i} +1) * $ {chunk_size}) — 1))
-o $ {src_base} -part $ {i}

Источник: downldr.sh/downldr.sh: Строка 11

Примечания к сценарию

Параметр -r используется для указания диапазона в байтах для загрузки, если хост принимает диапазоны.

Заключение

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

Оцените статью
nanomode.ru
Добавить комментарий