Curl dalam Skrip Bash dengan Contoh

Jika Anda pernah duduk di depan terminal, ketik ‘curl’, tempel URL sesuatu yang ingin Anda download, dan tekan enter, keren! Anda akan membunuhnya dengan skrip curl di bash dalam waktu singkat. Di sini Anda akan belajar cara menggunakan curl di skrip bash dan tip dan trik penting untuk otomatisasi.

Besar! Sekarang apa? Sebelum Anda membunuh apa pun di bash, sangat penting untuk mengetahui di mana mendapatkan bantuan jika dalam masalah. Berikut adalah tampilan halaman manual untuk perintah curl atau curl help. Copy dan tempel. Cobalah untuk tidak terbebani oleh penampilan. Ada banyak pilihan yang hanya Anda butuhkan di kemudian hari. Lebih penting lagi, ini berfungsi sebagai referensi cepat untuk opsi pencarian yang Anda butuhkan.

Berikut adalah beberapa perintah untuk mendapatkan bantuan di dalam terminal Anda dan sumber daya ramah peramban lainnya.

Perintah bantuan untuk curl di bash

Konsultasikan sumber daya ini kapan saja Anda butuhkan. Selain bagian ini, mereka akan berfungsi sebagai teman dalam perjalanan Anda menuju membunuhnya dengan skrip curl di bash.

Sekarang setelah mendapatkan bantuan dan membuat daftar opsi command line tidak ada artinya, mari beralih ke tiga cara.

three ways to curl in bash by example

Anda mungkin berpendapat bahwa ada lebih dari tiga cara untuk meringkuk di bash. Namun, untuk tujuan kesederhanaan, katakan saja ada. Perhatikan juga bahwa dalam praktiknya, useran setiap cara tidak copyg eksklusif. Faktanya, Anda akan menemukan bahwa cara-cara dapat terjalin tergantung pada maksud skrip bash Anda. Mari kita mulai.

first way: Downloading files

Semua opsi selain curl mengdownload file secara default. Di bash, kita curl untuk mendownload file sebagai berikut.

curl ${url}
# download file

Ini mengirimkan konten file yang kita download ke output standar; yaitu, layar Anda. Jika file tersebut berupa video atau gambar jangan heran jika Anda mendengar beberapa bunyi bip. Kita perlu menyimpan ke file. Berikut tampilannya.

curl ${url} > outfile
# download file saving as outfile
 
curl ${url} -o outfile
# download file save as option
 
curl ${url} -O
# download file inherit filename
 
## expect file saved as $( basename ${url} )

Perhatikan bahwa file downloadan simpan sebagai opsi yang mewarisi nama file sangat berguna saat menggunakan globbing URL, yang tercakup dalam bagian loop bash curl.

Sekarang mari kita beralih ke cara memeriksa header sebelum mengdownload file dengan curl di bash.

second way: Checking headers

Akan tiba saatnya Anda ingin mendapatkan informasi tentang suatu file sebelum mengdownload. Untuk melakukan ini, kami menambahkan opsi -I ke perintah curl sebagai berikut.

curl -I ${url}
# download headers

Perhatikan bahwa ada cara lain untuk membuang header dari permintaan curl, yang tersisa untuk pekerjaan rumah.

Berikut adalah contoh cepat untuk menunjukkan cara kerja cara kedua dalam skrip bash yang dapat digunakan sebagai bagian dari pemeriksa kesehatan halaman web.

Contoh) bash curl dapatkan kode respons

Seringkali, kami ingin mendapatkan kode respons untuk permintaan curl di bash. Untuk melakukan ini, pertama-tama kita perlu meminta tajuk respons dan kemudian mengekstrak kode respons. Berikut adalah tampilannya.

url=https://temptemp3.github.io
# just some url
 
curl ${url} -I -o headers -s
# download file
 
cat  headers
# response headers
## 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-ranges: bytes
#date: Fri, 25 Jan 2019 23:12:37 GMT
#via: 1.1 varnish
#age: 198
#x-served-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 headers | head -n 1 | cut '-d ' '-f2'
# get response code
## expect
#200

Situs saya sudah aktif. Besar!

Sekarang mari kita beralih ke membuat posting dengan curl di skrip bash.

third way: Making posts

Akan tiba saatnya ketika Anda perlu membuat posting dengan curl di bash untuk mengautentikasi akses atau modifikasi konten pribadi. Seperti halnya bekerja dengan API dan formulir html. Ini mungkin memerlukan beberapa permintaan ikal. Command line placeholder curl untuk cara ini adalah sebagai berikut.

curl -u -H --data ${url}
# send crafted request

Membuat posting melibatkan penambahan header dan data yang sesuai untuk memungkinkan otentikasi. Saya sudah menyiapkan beberapa contoh membuat postingan dengan curl di bash.

Contoh) Otentikasi dasar

Berikut adalah contoh useran skrip curl di bash untuk mengdownload file yang memerlukan otentikasi dasar. Perhatikan bahwa kredensial disimpan dalam file terpisah bernama bash-curl-basic-auth-example-config.sh, yang juga disertakan di bawah.

curl-basic-auth.sh
 

#!/bin/bash
## curl-basic-auth
## - http basic authenication example using
##   curl in bash
## version 0.0.1
##################################################
. ${SH2}/cecho.sh        # colored echo
curl-basic-auth() {
cecho yellow url: ${url}
local username
local passwd
. ${FUNCNAME}-config.sh # ${username}, ${passwd}
curl -v -u ${username}:${password} ${url} --location
}
##################################################
if [ ${#} -eq 1 ]
then
url="${1}"
else
exit 1 # wrong args
fi
##################################################
curl-basic-auth
##################################################
## generated by create-stub2.sh v0.1.1
## on Sun, 27 Jan 2019 14:04:18 +0900
## see <https://github.com/temptemp3/sh2>
##################################################

Sumber: curl-basic-auth.sh

curl-basic-auth-config.sh

#!/bin/bash

## curl-basic-auth-config
## version 0.0.1 - initial

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

username="username"
password="passwd"

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

## generated by create-stub2.sh v0.1.1
## on Sun, 27 Jan 2019 14:08:17 +0900
## see <https://github.com/temptemp3/sh2>

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

Sumber: curl-basic-auth-config.sh

Inilah yang tampak seperti di command line.

bash bash-curl-basic-auth-example.sh URL
## expect response for url after basic authentication

Di sini Anda melihat bagaimana menulis skrip bash memungkinkan Anda menghindari keharusan memasukkan rahasia Anda di command line.

Perhatikan bahwa opsi –location telah ditambahkan untuk menangani permintaan yang dialihkan.

Sekarang setelah kita memiliki otentikasi dasar, mari kita tingkatkan sedikit kesulitannya.

Contoh) Mengirimkan formulir html dengan perlindungan csrf

Keajaiban bash adalah Anda dapat melakukan apa saja yang ingin Anda lakukan. Melompat melalui lingkaran perlindungan csrf adalah salah satu cara untuk membunuhnya dengan curl di skrip bash.

Dalam aplikasi web cararn ada fitur keamanan yang disebut perlindungan csrf untuk mencegah permintaan posting dari mana saja tanpa akses ke situs yang bersangkutan.

Pada dasarnya, ada token keamanan yang disertakan dalam respons halaman.

Di sini seperti apa skrip bash Anda untuk mendapatkan akses resmi ke konten halaman dengan perlindungan csrf.

curl-example.sh

#!/bin/bash
## curl-example
## - submits form with csrf protection
## version 0.0.1 - initial
##################################################
. ${SH2}/aliases/commands.sh    # subcommands
## specially crafted bash curl boilerplate for this example
template-command-curl() { { local method ; method="${1}" ; }
{
command curl ${url}
if-headers
if-data
if-options
} | tee ${method}-response
}
curl-head() { { local url ; url="${url}" ; }
template-command-curl
head
}
curl-get() { { local url ; url="${url}" ; }
template-command-curl
get
}
## setup curl
if-headers() { true ; }
if-data() { true ; }
if-options() { true ; }
curl-post() { { local url ; url="${url}" ; }
template-command-curl
post
}
curl() { # entry point for curl-head, curl-get, curl-post
commands
}
main() {
## rewrite url if needed etc
( # curl head request
if-options() {
cat << EOF
--location
EOF
}
curl head ${url} > head-response
)
test "$( cat head-response | grep -e ‘Location:’ )" || {
## block reassigning url base on head response location
url=…
}
reset-curl
## setup curl...
curl get ${url} # > get-response
extract-info-for-post-request # < get-reponse, extracts token and other info for post
## reset curl and setup if needed …
curl post ${url} # > post-response
}
curl-example() {
true
}
##################################################
if [ ${#} -eq 0 ]
then< br> true
else
exit 1 # wrong args
fi
##################################################
curl-example
##################################################
## generated by create-stub2.sh v0.1.1
## on Sun, 27 Jan 2019 16:36:17 +0900
## see <https://github.com/temptemp3/sh2>
##################################################

Sumber: curl-example.sh

Catatan tentang skrip
Ini menggunakan alias yang disebut perintah yang saya sebutkan di posting sebelumnya tentang bash declaration command, yang memungkinkan untuk mendeklarasikan subcommands secara implisit melalui konvensi.

Di sini Anda melihat bahwa bash dapat digunakan untuk merangkai permintaan curl bersama dengan logika untuk menjalankan maksud skrip Anda.
Agar beberapa useran bash di atas menggunakan subkulit untuk membatasi ruang lingkup deklarasi ulang fungsi tidak tampak begitu ajaib, saya telah menyiapkan contoh tindak lanjut.

subkulit-fungsi.sh
 

#!/bin/bash
## subshell-functions
## version 0.0.1 - initial
##################################################
d() { true ; }
c() { true ; }
b() { true ; }
a() {
{ b ; c ; d ; }
(
b() {
cat << EOF
I am b
EOF
}
{ b ; c ; d ; }
)
{ b ; c ; d ; }
}
##################################################
if [ ${#} -eq 0 ]
then
true
else
exit 1 # wrong args
fi
##################################################
a
##################################################
## generated by create-stub2.sh v0.1.1
## on Sun, 27 Jan 2019 13:43:50 +0900
## see <https://github.com/temptemp3/sh2>
##################################################

Sumber: subkulit-fungsi.sh

Berikut adalah contoh command line korespondensi.

bash a.sh
## expect
I am b

Contoh) Panggilan API Wonderlist

Berikut adalah command line permintaan curl dalam skrip bash yang saya tulis pada akhir 2017 sebelum beralih ke Trello.

curl 
${X}
${url}
-H "X-Access-Token: ${WL_AT}"
-H "X-Client-ID: ${WL_CID}"
--silent

Sumber: wonderlist.sh/main.sh: Baris 40

Catatan pada skrip
 
${X} berisi opsi -X yang dapat diteruskan oleh fungsi pemanggil. Jika Anda tidak terbiasa dengan opsi tersebut, sudah diatur perintah permintaan untuk digunakan. Yaitu, GET, POST, HEAD, dll. Menurut dokumentasi api.
 
Ini berisi beberapa opsi -H untuk otentikasi.
 
Opsi –silent digunakan karena dalam beberapa kasus menunjukkan kemajuan di terminal akan berlebihan untuk permintaan latar belakang.
 
Tentunya, Anda sekarang membunuhnya dengan curl di skrip bash. Selanjutnya, kita beralih ke topik khusus untuk menyatukan semuanya.

Looping melalui url dengan curl di bash

 
Misalkan kita memiliki daftar URL yang ingin kita ulangi dan ikal. Artinya, kami ingin mengdownload menggunakan curl untuk setiap URL dalam daftar kami. Inilah cara kita menyelesaikan tugas ini di command line.
 

## method (1)
 
curl() { echo "dummy response for ${@}" ; }       # fake curl for testing purposes
 
urls() { cat /dev/clipboard ; }                   # returns list of urls
 
for url in $( urls ); do curl ${url}; done        # curl loop
 
## expect
#dummy response for whatever is in your
#dummy response for clipboard
#dummy response for...

Jika Anda tidak memiliki daftar url untuk dicopy, berikut adalah daftar 100 URL yang kemungkinan besar merespons permintaan HTTP menggunakan curl.

inti dari Craft URL Populer berdasarkan daftar situs web paling populer di seluruh dunia

Seringkali, kita tidak hanya ingin menggulung daftar url di bash. Kami mungkin ingin membuat url untuk menggulung saat kami maju melalui loop. Untuk menyelesaikan tugas ini, kita perlu memasukkan variabel ke dalam URL sebagai berikut.

## method (2)
 
curl() { echo "dummy response for ${@}" ; }        # fake curl for testing purposes
url() { echo ${url_base}/${i} ; }                  # url template
urls() {                                            # generate all urls
local i
for i in ${range}
do
url
done
}
 
url_base="https://tempt emp3.github.io"                # just some base
range=$( echo {1..9} )                                # just some range
for url in $( urls ); do curl ${url}; done            # curl loop
 
## expect
#dummy response for https://temptemp3.github.io/1
#dummy response for https://temptemp3.github.io/2
#dummy response for https://temptemp3.github.io/3
#dummy response for https://temptemp3.github.io/4
#dummy response for https://temptemp3.github.io/5
#dummy response for https://temptemp3.github.io/6
#dummy response for https://temptemp3.github.io/7
#dummy response for https://temptemp3.github.io/8
#dummy response for https://temptemp3.github.io/9

Ternyata loop dapat dihindari dalam beberapa kasus dengan memanfaatkan fitur curl yang hanya tersedia di command line yang disebut URL globbing. Berikut cara kerjanya.

# method (3)
 
unset -f curl
# included just in case
curl https://temptemp3.github.io/[0-9]
# curl loop using URL globbing
 
## expect
#response for https://temptemp3.github.io/1
#response for https://temptemp3.github.io/2
#response for https://temptemp3.github.io/3
#response for https://temptemp3.github.io/4
#response for https://temptemp3.github.io/5
#response for https://temptemp3.github.io/6
#response for https://temptemp3.github.io/7
#response for https://temptemp3.github.io/8
#response for https://temptemp3.github.io/9

Di sini kita melihat bahwa salah satu metode di atas dapat digunakan untuk mengimplementasikan curl loop di bash Tergantung pada kasus useran dan tingkat kontrol yang diinginkan, suatu metode mungkin lebih disukai daripada yang lain.

Menangani error ikal di bash

Satu hal yang absen dari curl adalah kemampuan untuk menangani error. Di situlah bash berguna.

Curl memiliki opsi NUM an–coba lagi yang seperti yang mungkin Anda tebak memberi tahu curl untuk mencoba lagi beberapa kali. Namun, bagaimana jika kita ingin curl secara efektif coba lagi tanpa batas waktu hingga berhasil?

curl-bashh-retry.sh

#!/bin/bash
## curl-retry
## - retries curl indefinitely
## version 0.0.1
##################################################
car() {
echo "${1}"
}
curl-error-code() {
test ! -f "curl-error" || {
car $(
cat curl-error
| sed
-e 's/[^0-9 ]//g'
)
}
}
curl-retry() {
while [ ! ]
do
curl temptemp3.sh 2>curl-error || {
case $( curl-error-code ) in
6) {
### handle error code 6
echo curl unable to resolve host
} ;;
*) {
# <https://curl.haxx.se/libcurl/c/libcurl-errors.html>
true # not yet implemented
} ;;
esac
sleep 1
continue
}
break
done
}
##################################################
if [ ${#} -eq 0 ]
then
true
else
exit 1 # wrong args
fi
##################################################
curl-retry
##################################################
## generated by create-stub2.sh v0.1.1
## on Sun, 27 Jan 2019 15:58:51 +0900
## see <https://github.com/temptemp3/sh2>
##################################################

Sumber: curl-retry.sh
Inilah yang kita lihat di command line.

bash curl-bash-retry.sh
## expect
#curl unable to resolve host
#curl unable to resolve host
#...

Harapannya pada akhirnya seseorang akan membuat temptemp3.io dan skrip kita akan keluar dengan status keluar nol.

Terakhir namun tidak kalah pentingnya, saya ingin mengakhiri dengan contoh cara mengatur curl bersamaan di bash untuk bertindak sebagai akselerator downloadan.

Downldr.sh

Terkadang sangat membantu untuk mengdownload file besar dalam beberapa bagian. Berikut adalah cuplikan dari skrip bash yang saya tulis baru-baru ini menggunakan curl.

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

Sumber: downldr.sh/downldr.sh: Baris 11

Catatan tentang skrip

Opsi -r digunakan untuk menentukan rentang dalam byte yang akan didownload jika host menerima rentang.

Kesimpulan

Pada saat ini Anda membunuhnya dengan skrip curl di bash. Dalam banyak kasus, Anda dapat memanfaatkan fungsionalitas curl melalui sekumpulan opsi yang disediakannya. Namun, Anda dapat memilih keluar dan mencapai fungsi yang sama di luar curl di bash untuk tingkat kontrol yang sesuai dengan kebutuhan Anda.

Related Posts