Խուսափեք միացման սխալներից Bash սկրիպտներում՝ հաստատելով URL-ները. ահա թե ինչպես
Հիմնական Takeaways
- Խուսափեք ենթադրել, որ URL-ները վավեր են: Օգտագործելուց առաջ ստուգեք դրանց կարգավիճակը:
- Wget հրամանը կարող է ստուգել URL-ի վավերականությունը և ձեզ որոշակի պատկերացումներ տալ ձախողումների վերաբերյալ:
- CURL հրամանը կարող է ստանալ HTTP պատասխանի կոդը վեբ սերվերից՝ ավելի նուրբ հսկողության համար:
Երբ դուք կոդավորում եք, ենթադրությունը կայունության թշնամին է: Ստուգեք վեբ հասցեները, նախքան դրանք օգտագործելը, ստուգելու համար, որ դրանք ճիշտ ձևավորված են և առցանց: Այս տեխնիկան ստուգում է URL-ները և նրբագեղորեն կարգավորում է սխալի պայմանները:
Պարզապես մի հուսացեք, հաստատեք
Վեբ հասցեի կամ միատեսակ ռեսուրսների տեղորոշիչի (URL) օգտագործումը սցենարում ներառում է հավատքի թռիչք: Կան բոլոր տեսակի պատճառներ, թե ինչու URL-ն օգտագործելու փորձը կարող է ձախողվել:
URL-ը կարող է ունենալ տառասխալներ, հատկապես, եթե URL-ը որպես պարամետր փոխանցվում է սցենարին:
URL-ը կարող է հնացած լինել: Այն առցանց ռեսուրսը, որին նա մատնանշում է, կարող է ժամանակավորապես անցանց լինել կամ ընդմիշտ հեռացված լինել:
Ստուգել, արդյոք URL-ը գոյություն ունի և ճիշտ է արձագանքում, նախքան այն օգտագործելը, լավ աշխատանքային պրակտիկա է: Ահա մի քանի մեթոդներ, որոնք կարող եք օգտագործել՝ ստուգելու համար, որ անվտանգ է շարունակել URL-ը և նրբագեղորեն կարգավորել սխալի պայմանները:
Մեզ անհրաժեշտ գործիքներն են wget և cURL:
Օգտագործելով wget՝ URL-ը հաստատելու համար
wget հրամանն օգտագործվում է ֆայլեր ներբեռնելու համար, բայց մենք կարող ենք ճնշել ներբեռնման գործողությունը՝ օգտագործելով դրա --spider տարբերակը: Երբ մենք դա անում ենք, wget-ը մեզ օգտակար տեղեկություններ է տալիս այն մասին, թե արդյոք URL-ը հասանելի է և արձագանքում է:
Մենք կփորձենք տեսնել, թե արդյոք google.com-ը գործում է և ակտիվ, այնուհետև կփորձենք geegle.com-ի հորինված URL-ը: Մենք կստուգենք վերադարձի ծածկագրերը յուրաքանչյուր դեպքում:
wget --spider https://www.google.com
echo $?
wget --spider https://www.geegle.com
echo $?
Ինչպես տեսնում ենք, wget-ը թույլ է տալիս մեզ իմանալ, որ Google-ը ողջ է և առողջ, մինչդեռ Geegle-ն (զարմանալիորեն) ոչ: Նկատի ունեցեք նաև, որ հաջող դեպքում ելքի կոդը զրոյական է, իսկ անհաջող դեպքում՝ չորս:
Զրո նշանակում է հաջողություն, ցանկացած այլ բան նշանակում է, որ ինչ-որ խնդիր կա: Մենք կարող ենք օգտագործել այդ արժեքները մեր սկրիպտում՝ կատարման հոսքը վերահսկելու համար:
Դուք չեք կարող չնկատել, որ wget-ը մեծ ելք է ուղարկում էկրանին: Մենք կարող ենք ճնշել ելքը -q (հանգիստ) տարբերակով։
wget --spider -q https://www.google.com
echo $?
wget --spider -q https://www.geegle.com
echo $?
Բացեք ձեր սիրած խմբագրիչը, պատճենեք այս տողերը դրա մեջ և պահեք այն որպես url-1.sh:
#!/bin/bash
if wget --spider -q https://www.google.com; then
echo "The URL exists and is accessible."
else
echo "Can't access that URL."
fi
Ձեզ հարկավոր է սցենարը դարձնել գործարկելի:
chmod +x url-1.sh
Դուք պետք է դա անեք այստեղ քննարկված բոլոր սցենարներով: Յուրաքանչյուր դեպքում օգտագործեք սցենարի համապատասխան անվանումը: Եկեք գործարկենք մեր սցենարը:
./url-1.sh
If համեմատության թեստը հայտնաբերում է wget հրամանի զրոյական պատասխանը և կատարում if դրույթի առաջին դրույթը: Եթե դուք խմբագրեք սկրիպտը և փոխեք URL-ը https://www.geegle.com-ի նման, այն կհայտնի ձախողման մասին:
./url-1.sh
Գոյություն ունեն ութ տարբեր պատասխաններ, որոնք wget-ը կարող է առաջացնել, որոնցից յոթը սխալի պայմաններ են:
- 0. Խնդիրներ չեն առաջացել:
- 1. ընդհանուր սխալի կոդ:
- 2. սխալ՝ հրամանի տողի ընտրանքները վերլուծելիս:
- 3. ֆայլի մուտքի/ելքի սխալ:
- 4. ցանցի ձախողում:
- 5. SSL հաստատման ձախողում:
- 6. օգտանունի/գաղտնաբառի նույնականացման ձախողում:
- 7. Արձանագրության սխալներ:
- 8. սերվերը սխալի պատասխան է տվել:
Սրա վրա ընդլայնվում է cURL հրամանը: Այն կարող է ցույց տալ HTTP պատասխանի կոդը URL-ից (կամ ավելի ճիշտ՝ URL-ը հյուրընկալող վեբ սերվերից):
Մեկուսացնելով HTTP արձագանքման կոդը
Ձեզ կարող է անհրաժեշտ լինել տեղադրել cURL հրամանը: Դուք այն կգտնեք ձեր բաշխման համար նախատեսված պահեստներում:
Ubuntu-ում օգտագործել՝
sudo apt install curl
Fedora-ում մուտքագրեք.
sudo dnf install curl
Manjaro-ում և Arch-ում հրամանը հետևյալն է.
sudo pacman -S curl
Եկեք cURL-ին ուղղենք Google-ին և տեսնենք, թե ինչ ենք ստանում: «-head» տարբերակն ասում է curl-ին վեբկայքից ստանալ միայն վերնագրի տեղեկատվությունը, այլ ոչ թե ներբեռնել ամբողջ վեբ էջը: --silent տարբերակը չի ճնշում cURL-ի ելքը, այն դադարեցնում է cURL-ին զեկուցել իր առաջընթացի մասին:
curl --head --silent https://www.google.com
echo $?
Զրոյի ելքի կոդը cURL-ն է, որը մեզ ասում է, որ ամեն ինչ կարգին է, բայց պատասխանը, որին մենք հետևում ենք, սերվերի իրական HTTP կոդը է: Դա 200-ն է արտադրանքի առաջին գծում: HTTP լեզվով 200 նշանակում է հաջողություն:
Մենք կարող ենք ճշգրտել cURL-ի վարքագիծը՝ ուղղելով դրա ելքը դեպի /dev/null, որպեսզի այն աշխատի անաղմուկ, և այնուհետև մասամբ հակադարձել դրան՝ օգտագործելով --write-out տարբերակը՝ HTTP պատասխանի կոդը տերմինալի պատուհան ուղարկելու համար:
curl --head --silent --output /dev/null --write-out '%{http_code}' https://www.google.com
Այժմ մենք ստացել ենք HTTP պատասխանի կոդը, այն կարող ենք օգտագործել սկրիպտում:
Օգտագործելով cURL URL-ը հաստատելու համար
Այս սկրիպտը HTTP պատասխանի կոդը վերագրում է արդյունք կոչվող փոփոխականին: Պատճենեք սա ձեր խմբագրին, պահեք այն որպես url-2.sh, ապա օգտագործեք chmod՝ այն գործարկելի դարձնելու համար:
#!/bin/bash
result=$(curl --head --silent --write-out "%{http_code}" --output /dev/null https://www.google.com)
if [[ $result -eq 200 ]]; then
echo "The URL exists and is accessible."
else
echo "Can't access that URL."
fi
If համեմատության թեստը ստուգում է փոփոխականը 200 արժեքի նկատմամբ: Եթե այն համընկնում է, սկրիպտը կատարում է if դրույթի առաջին դրույթը: Ցանկացած այլ արժեք դիտվում է որպես սխալի պայման, և երկրորդ կետը կատարվում է:
./url-2.sh
Սխալների տարբեր պայմանների կառավարում
Այժմ, երբ մենք ունենք HTTP կոդը առբերելու միջոց, մենք կարող ենք ընդլայնել մեր սկրիպտի՝ տարբեր սխալի պայմանների հետ գործ ունենալու հնարավորությունը:
#!/bin/bash
target="https://www.google.com"
result=$(curl --head --silent --output /dev/null --write-out '%{http_code}' "$target")
case $result in
200)
echo "The URL exists and is accessible."
;;
301)
echo "HTTP error 301. The resource has been permanently relocated."
;;
403)
echo "HTTP error 403. The server heard you, but won't comply."
;;
404)
echo "HTTP error 404. The classic Page Not Found."
;;
000)
echo "No response from server."
;;
*) # anything not captured in the above list
echo "HTTP error $result."
;;
esac
URL-ը վերագրվում է թիրախ կոչվող փոփոխականին: Այդ փոփոխականն օգտագործվում է cURL հրամանում։ Եթե դուք ունեք շատ երկար URL, դա հեշտացնում է սկրիպտը կարդալը:
HTTP կոդը գրավված է փոփոխականի մեջ, որը կոչվում է արդյունք: Սա օգտագործվում է գործի հայտարարության մեջ: Այս կառուցվածքը թույլ է տալիս ձեզ ունենալ հատուկ բաժիններ, որոնք կառավարում են որոշակի սխալների տեսակները: «*)» վերջնական դեպքը ներառում է սխալի բոլոր պայմանները, որոնք չեն կարգավորվում հատուկ գործի կողմից:
Պատճենեք սա ձեր խմբագրին, պահեք այն որպես url-3.sh և օգտագործեք chmod՝ այն գործարկելի դարձնելու համար:
./url-3.sh
./url-3.sh
./url-3.sh
Մեր սցենարն այժմ արձագանքում է HTTP պատասխանի մի շարք կոդերին:
Կառավարման ժամանակի ընդհատումներ
Մեկ այլ սցենար, որով պետք է զբաղվի մեր սցենարը, դա դանդաղ վեբ սերվերի պատասխանին սպասող երկար դադարներից խուսափելն է:
Մենք կարող ենք ևս երկու տարբերակ ավելացնել cURL հրամանի տողում: --connect-timeout տարբերակը սահմանում է այն ժամանակը, երբ cURL-ը կսպասի կապի հաստատմանը:
--max-time timeout-ը սահմանում է այն ժամանակի ընդհանուր քանակը, որը cURL-ը կծախսի հրամանը կատարելու համար: Նկատի ունեցեք, որ --max-time timeout-ը կսկսի գործել, նույնիսկ եթե հրամանն աշխատում է և դեռ ընթացքի մեջ է: Եթե դուք օգտագործում եք այն, փորձարկեք հրամանի տողում՝ օգտագործման անվտանգ ժամանակի արժեք սահմանելու համար:
Մենք կարող ենք այս տարբերակները ավելացնել cURL հրամանին այսպես.
curl --head --connect-timeout 8 --max-time 14 --silent --output /dev/null --write-out '%{http_code}' https://www.google.com
Այլ հնարավորություններ
Սկրիպտի հատվածը cURL հրամանով և HTTP պատասխանի կոդի ստուգումներով կարող է ինքնուրույն գործառույթ լինել: Ձեր սկրիպտի օգտագործած ցանկացած URL կարող է փոխանցվել դրան՝ ստուգման համար:
Դուք կարող եք ունենալ ֆայլ՝ URL-ների ցանկով: Ձեր սցենարը կարող է բացել ֆայլը, կարդալ այն տող առ տող և հաստատել յուրաքանչյուր URL: Դա մի պարզ միջոց կլիներ մի շարք վեբ սերվերների առողջությունը վերահսկելու համար: