Խուսափեք միացման սխալներից 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: Դա մի պարզ միջոց կլիներ մի շարք վեբ սերվերների առողջությունը վերահսկելու համար: