Vyhnite sa chybám pripojenia v Bash skriptoch overením adries URL: Tu je návod


Kľúčové poznatky

  • Nepredpokladajte, že adresy URL sú platné. Pred použitím skontrolujte ich stav.
  • Príkaz wget môže otestovať, či je adresa URL platná, a poskytne vám prehľad o zlyhaniach.
  • Príkaz cURL môže získať kód odpovede HTTP z webového servera, aby bolo možné lepšie ovládať.

Keď kódujete, nepriateľom robustnosti je predpoklad. Pred použitím skontrolujte webové adresy, aby ste si overili, či sú správne vytvorené a online. Tieto techniky kontrolujú adresy URL a elegantne zvládajú chybové stavy.

Nie len dúfať, overiť

Použitie webovej adresy alebo jednotného lokátora zdrojov (URL) v skripte znamená skok viery. Existuje mnoho dôvodov, prečo môže pokus o použitie adresy URL zlyhať.

Adresa URL môže obsahovať preklepy, najmä ak sa adresa URL odovzdá ako parameter skriptu.

Adresa URL môže byť zastaraná. Online zdroj, na ktorý odkazuje, môže byť dočasne offline alebo mohol byť natrvalo odstránený.

Skontrolovať, či adresa URL existuje a či správne reaguje, než sa ju pokúsite použiť, je dobrou pracovnou praxou. Tu je niekoľko metód, ktoré môžete použiť na overenie toho, či je bezpečné pokračovať s webovou adresou, a na elegantné zvládnutie chybových stavov.

Nástroje, ktoré potrebujeme, sú wget a cURL.

Použitie wget na overenie adresy URL

Príkaz wget sa používa na sťahovanie súborov, ale sťahovanie môžeme potlačiť jeho voľbou --spider. Keď to urobíme, wget nám poskytne užitočné informácie o tom, či je adresa URL prístupná a či na ňu odpovedá.

Pokúsime sa zistiť, či je google.com aktívny a aktívny, potom vyskúšame vymyslenú webovú adresu geegle.com. V každom prípade skontrolujeme návratové kódy.

wget --spider https://www.google.com
echo $?
wget --spider https://www.geegle.com
echo $?

Ako vidíme, wget nám dáva vedieť, že Google je nažive a dobre, zatiaľ čo Geegle (neprekvapivo) nie. Všimnite si tiež, že výstupný kód v úspešnom prípade je nula a v neúspešnom prípade sú štyri.

Nula znamená úspech, čokoľvek iné znamená, že existuje nejaký problém. Tieto hodnoty môžeme použiť v našom skripte na riadenie toku vykonávania.

Nemôžete si nevšimnúť, že wget posiela na obrazovku veľa výstupov. Výstup môžeme potlačiť voľbou -q (tichý).

wget --spider -q https://www.google.com
echo $?
wget --spider -q https://www.geegle.com
echo $?

Otvorte svoj obľúbený editor, skopírujte doň tieto riadky a uložte ho ako 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

Budete musieť urobiť skript spustiteľným.

chmod +x url-1.sh

Budete to musieť urobiť so všetkými skriptami, o ktorých sa tu diskutuje. V každom prípade použite vhodný názov skriptu. Spustite náš skript.

./url-1.sh

Porovnávací test if zistí nulovú odpoveď príkazu wget a vykoná prvú klauzulu príkazu if. Ak upravíte skript a zmeníte adresu URL na niečo ako https://www.geegle.com, ohlási to zlyhanie.

./url-1.sh

Existuje osem rôznych odpovedí, ktoré môže wget generovať, z ktorých sedem sú chybové stavy.

  • 0: Nevyskytli sa žiadne problémy.
  • 1: Všeobecný kód chyby.
  • 2: Chyba pri analýze možností príkazového riadka.
  • 3: Chyba I/O súboru.
  • 4: Zlyhanie siete.
  • 5: Overenie SSL zlyhalo.
  • 6: Zlyhanie overenia používateľského mena/hesla.
  • 7: Chyby protokolu.
  • 8: Server vydal chybovú odpoveď.

Príkaz cURL to rozširuje. Môže zobraziť kód odpovede HTTP z adresy URL (alebo správnejšie z webového servera, ktorý je hostiteľom adresy URL).

Izolácia kódu odozvy HTTP

Možno budete musieť nainštalovať príkaz cURL. Nájdete ho v úložiskách pre vašu distribúciu.

Pri používaní Ubuntu:

sudo apt install curl

Na Fedore napíšte:

sudo dnf install curl

Na Manjaro a Arch je príkaz:

sudo pacman -S curl

Nasmerujeme cURL na Google a uvidíme, čo dostaneme. Voľba --head povie curlu, aby načítal iba informácie o hlavičke z webovej stránky, namiesto sťahovania celej webovej stránky. Možnosť --silent nepotláča výstup cURL, ale bráni cURL podávať správy o svojom priebehu.

curl --head --silent https://www.google.com
echo $?

Výstupný kód nula je cURL, ktorý nám hovorí, že všetko bolo v poriadku, ale odpoveď, ktorú sledujeme, je skutočný kód HTTP zo servera. To je 200 v prvom riadku výstupu. V jazyku HTTP 200 znamená úspech.

Správanie cURL môžeme upraviť tak, že jeho výstup nasmerujeme na /dev/null, aby bežal ticho, a potom to čiastočne napravíme použitím možnosti --write-out na odoslanie kódu odpovede HTTP do okna terminálu.

curl --head --silent --output /dev/null --write-out '%{http_code}' https://www.google.com

Teraz máme kód odpovede HTTP, môžeme ho použiť v skripte.

Použitie cURL na overenie adresy URL

Tento skript priradí kód odpovede HTTP premennej s názvom result. Skopírujte to do svojho editora, uložte ho ako url-2.sh a potom použite chmod, aby bol spustiteľný.

#!/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

Porovnávací test if skontroluje premennú oproti hodnote 200. Ak sa zhoduje, skript vykoná prvú klauzulu príkazu if. Akákoľvek iná hodnota sa považuje za chybový stav a vykoná sa druhá klauzula.

./url-2.sh

Riešenie rôznych chybových stavov

Teraz, keď máme spôsob, ako získať kód HTTP, môžeme rozšíriť schopnosť nášho skriptu vysporiadať sa s rôznymi chybovými stavmi.

#!/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

Adresa URL je priradená k premennej nazývanej cieľ. Táto premenná sa používa v príkaze cURL. Ak máte veľmi dlhú adresu URL, skript sa tým ľahšie číta.

HTTP kód je zachytený v premennej s názvom result. Používa sa vo vyhlásení prípadu. Táto štruktúra vám umožňuje mať vyhradené sekcie na spracovanie špecifických typov chýb. Posledný prípad „*)“ zachytáva všetky chybové stavy, ktoré nie sú riešené vyhradeným prípadom.

Skopírujte to do svojho editora, uložte ho ako url-3.sh a pomocou chmod ho spravte spustiteľným.

./url-3.sh
./url-3.sh
./url-3.sh

Náš skript teraz reaguje na celý rad kódov odozvy HTTP.

Spracovanie časových limitov

Ďalším scenárom, s ktorým by sa mal náš skript vysporiadať, je vyhnúť sa dlhým prestávkam pri čakaní na odpoveď pomalého webového servera.

Do príkazového riadku cURL môžeme pridať ďalšie dve možnosti. Voľba --connect-timeout nastavuje limit času, počas ktorého bude cURL čakať na vytvorenie spojenia.

Časový limit --max-time určuje celkový čas, ktorý cURL strávi vykonaním príkazu. Všimnite si, že časový limit --max-time sa spustí, aj keď príkaz funguje a stále prebieha. Ak ho používate, experimentujte na príkazovom riadku, aby ste určili bezpečnú časovú hodnotu na použitie.

Tieto možnosti môžeme pridať do príkazu cURL takto:

curl --head --connect-timeout 8 --max-time 14 --silent --output /dev/null --write-out '%{http_code}' https://www.google.com

Ďalšie možnosti

Sekcia skriptu s príkazom cURL a kontrolami kódu odpovede HTTP by mohla byť samostatná funkcia. Akákoľvek adresa URL, ktorú váš skript používa, môže byť odovzdaná na overenie.

Môžete mať súbor so zoznamom adries URL. Váš skript môže otvoriť súbor, prečítať ho riadok po riadku a overiť každú adresu URL. Bol by to jednoduchý spôsob monitorovania stavu sady webových serverov.