Bash training 2
Słowem wstępu
W tym wpisie skupię się na możliwościach skryptów powłoki Bash, bezpieczeństwie i dobrych praktykach tworzenia skryptów. Oczywiście temat nie będzie przeze mnie wyczerpany, a jest jedynie podstawą dla początkujących tak aby tworzyć wystarczająco dobre skrypty oraz zapobiec pewnym powszechnym błędom.
Podstawowe skrypty znajdziesz w moim repozytorium bash_training.
Bezpieczeństwo
Przytoczę najważniejsze zasady działania z różnymi skryptami, w momencie gdy mamy coś zrobić przy ich pomocy:
- Musisz być ostrożnym co wykonujesz!
- Nie uruchamiaj wszystkiego z uprawnieniami root
- Dodaj alias na komendy systemowe, ktore mogą narobić najwięcej szkód! (np: alias='rm -i')
- Jest wiele możliwości ataku! - nie uruchamiaj skryptów o dziwnej dla Ciebie zawartości
Jak napisać wystarczająco dobry skrypt powłoki?
Należy pamiętać, że dobrze napisany skrypt uchroni nas przed problemami. Gdy zrobimy to niedbale możemy stracić ważne dla nas pliki czy uszkodzić nasz system. Mniejszy problem, gdy będzie to tylko nasze lokalne środowisko.
Rady opisane poniżej będą zaczerpnięte z wpisu na blogu devopsiarz.pl.
Po napisaniu własnego skryptu warto użyć narzędzia do sprawdzenia poprawności składni i potencjalnych problemów. Polecane jest narzędzie shellcheck. Do instalacji na Ubuntu wystarczy użyć standardowego managera paczek sudo apt-get install -y shellcheck.
#!/bin/bash
POSTS_DIR="${PWD}/_posts/"
echo "Create new post"
date=$(date '+%Y-%m-%d')
echo "Default time for post is $date"
echo "Set title of post"
read title # find idea to get title (set maximum arguments)
# parse setting -
postFile="$date-${title/ /-}.md"
if [ -f $postFile ]; then
echo "Post with name $postFile exists!"
# want to delete ?
fi
NEW_POST_FILE="${POSTS_DIR}${postFile}"
touch "${POSTS_DIR}${postFile}"
echo "Created new post! ${postFile}"
tee -a ${NEW_POST_FILE} <<HEADERS
---
layout: default
title: ${title}
---
HEADERS
Uruchomienie shellcheck na powyższym skrypcie ujawnia kilka problemów: brak flagi -r w komendzie read, niecytowane zmienne mogące powodować problemy z globbingiem oraz niespójność w nazewnictwie zmiennych.
Dobrze napisany skrypt uchroni nas przed problemami.
Czego można by jeszcze opisać i nauczyć się, a jest jeszcze sporo tego. Mimo, że jest XXI wiek skrypty Bash można spotkać wszędzie np. gdy tworzysz swój obraz dockera w Dockerfile.
Co chciałbym jeszcze opisać:
- Jak tworzyć odpowiednie warunki.
- Sprawdzanie odpowiednich uprawnień.
- Tworzenie odpowiedniego skryptu z parametrami przy użyciu
getopt. - Kody błędów oraz zwracanie ich, obsługa błędów.
Pozdrawiam Marcin