Diverse små shell scripts

[linkstandalone]

Jeg har på min github uploadet en masse små, meget specifikke, men alligevel (måske) brugbare scripts.

Det er i repoet der så fint er kaldet scripts at det hele foregår, og her vil jeg hurtigt gennemgå hvad de gør, og hvordan man kan gøre brug af dem.

Dette er i øvrigt ikke ment som en showcase af mine scripts som sådan, det mere ment som at vise hvor nemt man kan implementere ting, som, selvom de er lidt hacky, er på et så low level plan og så få linjer kode, at idéen er nem at kan adaptes eller omskrives til helt andre applikationer.

confirm (sh)

Dette lille bitte shell/dmenu script er lavet til at tage to argumenter; det første er hvad vi vil promptes, altså hvad vi skal "confirm". Den næste er selve kommandoen vi skal køre, hvis vi bekræfter prompten med "yes".

En god usecase kunne være måden jeg selv bruger det på, som er til at bekræfte at jeg vil lukke min computer ned. Jeg benytter en custom window manager, hvor basicly alt er skræddersyet til mit eget workflow, og her er keybinds/shortcuts alfa omega. Trykker jeg på shift+super(windows key)+x har min computer altid bare lukket ned. Kommer man dog til det utilsigtet, lukker computeren bare ned, og alt der ikke er gemt, eller kun gemt i bufferen nu væk.

Derfor har jeg nu lavet min keybind om til at køre confirm scriptet således:

confirm "Do you want to shut down?" "shutdown now"
hvilket åbner dmenu med prompten "Do you want to shut down?", og skriver jeg yes (eller bare noget af ordet) og klikker enter køres kommandoen shutdown now, som lukker computeren.

Script:

#!/bin/sh
[ $(echo -e "No\nYes" | dmenu -i -p "$1") == "Yes" ] && $2

Direct download:

curl https://raw.githubusercontent.com/mikkelrask/scripts/master/confirm -o ~/bin/confirm && chmod +x ~/bin/confirm
Github: https://raw.githubusercontent.com/mikkelrask/scripts/master/confirm


linkhandler (bash)

Dette bash script minder i sig selv rigtig meget om confirm scriptet, i dét at vi giver det et argument, og vi derfra får nogle forskellige valgmuligheder via dmenu.

Meningen er her, at argumentet er et link vi vil åbne, og dmenu giver mig en liste over typiske programmer jeg vil bruge til at håndtere linket. Er det et YouTube link den får, vælger jeg typisk at afspille direkte i mpv, ligesom jeg ofte benytter mig af rtv til at håndtere reddit links.

... og så fremdeles. Der er options til vim baserede browsere (vimb), terminal baserede browsers (w3mvia readability-cli), image viewers (feh), og endda mulighed for at caste videoer, sange o.l direkte til en chromecast compatibel enhed via castnow.

Måden den er integreret i mit eget flow er via min rss-reader, newsboat, som håndterer alle mine nyheder og podcasts. Åbner jeg et link med genvejen 'o' køres kommandoen

linkhandler %url%
hvilket åbner dmenu med således (klik for fuld størrelse): linkhandler opening link from newsboat

Script:

#!/bin/bash

if [[ "${#1}" -gt 30 ]];
then
link="${1:0:20}"..."${1: -7}"
else
link="$1"
fi

echo $link

x=$(echo -e "mpv\nfeh\nrtv\nfirefox\nvimb\nw3m\nwget\nTV\nStereo" | dmenu -i -p "Where do we go from here '$link'?")
case "$x" in
        mpv) mpv "$1" 2&>/dev/null & disown ;;
        feh) feh "$1" 2&>/dev/null & disown ;;
        rtv) rtv "$1" ;;
        firefox) firefox "$1" ;;
        vimb) vimb "$1" & disown ;;
        w3m) readable "$1" | w3m -T text/html & ;;
        wget) wget "$1" 2&>/dev/null & disown ;;
        tv) castnow --address PUT-CHROMECAST-IP-HERE "$1" ;;
        stereo) castnow --address PUT-CHROMECAST-AUDIO-IP-HERE --quiet - "$1" ;;
esac
    

Direct download:

curl https://raw.githubusercontent.com/mikkelrask/scripts/master/linkhandler -o ~/bin/linkhandler && chmod +x ~/bin/linkhandler
Github: https://raw.githubusercontent.com/mikkelrask/scripts/master/linkhandler


pomodoro (sh)

Meget meget simpel pomodoro timer, der lader dig arbejde i 25 minutters intervaller, og giver dig 5 minutters pause derefter. Alt scriptet gør, er at gå i dvale i forudbestemte intervaller, i et loop, indtil det scriptet stoppes (CTRL+C). Den giver output i form af en notifikation, terminal output og den afspiller en lyd.

I loopet benytter jeg mpv til at afspille pomodoro.mp3, libnotify til at sende en notifikation og cowsay til at give output direkte i terminalen. Oddsne er, at du har en af dem, hvis ikke alle installeret i forvejen.

Script:

#!/bin/sh
notify-send "Pomodoro started." "Work concentrated for 25 minutes."

while true
do
	clear
	cowsay "25 minutes"
	sleep 25m
	notify-send "Issa time" "Get some rest"
	mpv --quiet pomodoro.mp3
  clear
	cowsay "Take a break!"
	sleep 5m
	notify-send "Get to it!" "Time to work!"
	mpv --quiet pomodoro.mp3
done

Direct download:

curl https://raw.githubusercontent.com/mikkelrask/scripts/master/pomodoro -o ~/bin/pomodoro && chmod +x ~/bin/pomodoro && wget https://github.com/mikkelrask/scripts/raw/master/pomodoro.mp3 -P ~/bin/
Github: https://raw.githubusercontent.com/mikkelrask/scripts/master/pomodoro


router-reboot.sh

Okay, så min router er flashet med en custom firmware der hedder openWRT, hvilket jeg tror hører til minoriteten, men basicly laver openWRT min router til en linux-router. Som man kan ssh ind i, køre scripts på osv. En meget lille, og begrænset linux maskine, men en linux maskine trods alt.

Så for at komme nedetid på mit internet til livs, tjekker jeg løbende om routeren kan pinge 8.8.8.8, som er Google's DNS IP adresse, som er en af de IP adresser jeg stoler på så godt som altid er online, og kan routeren ikke pinge den, venter den 30 sec. og prøver igen.

Fejler den også 2. gang, genstartes routeren, som alle jo ved er hvordan man i alle scenarier fixer at internettet ikke virker. Den tilføjer ligeledes et dato mærke i filen reboot.log, som den selv generer.

Jeg kører scriptet som et cronjob hvert kvarter. Læs om cron jobs og generer crontab kommandoer nemt her: https://crontab-generator.org/

Script:

#!/bin/sh

if ping -c 1 8.8.8.8 &> /dev/null
then 
	exit	
else
	sleep 30
	if ping -c 1 8.8.8.8 &> /dev/null
	then 
		exit
	else
		date >> reboot.log
		reboot
	fi
fi

Direct download:

curl https://raw.githubusercontent.com/mikkelrask/scripts/master/router-reboot.sh -o /reboot-router.sh
Github: https://raw.githubusercontent.com/mikkelrask/scripts/master/router-reboot.sh


server-services (bash)

Dette script burde nok egentlig hedde noget andet, for, for det første er det et bash script, ikke et shell script, og så er det selvfølgeligt heller ikke begrænset til at køres på nogen server. Det er dog lavet til at, i dette tilfælde, er en ubuntu server der skal tjekke op på om hhv. apache og mysql kører, og hvis ikke, genstarte servicen.

Hvilke services scriptet tjekker, kan selvfølgeligt ændres i SERVICES array'et på 5. linje.

Kører scriptet hver minut som et cron job, med crontab -e, hvor jeg tilføjer linjen * * * * * /usr/bin/bash /server-services.sh >/dev/null 2>&1.

Script:

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

SERVICES=( 'apache2' 'mysql' )

 for i in "${SERVICES[@]}"
  do
 `pgrep $i >/dev/null 2>&1`
 STATS=$(echo $?)

 if [[  $STATS == 1  ]]

  then
  service $i start
  `pgrep $i >/dev/null 2>&1`
  RESTART=$(echo $?)

  if [[  $RESTART == 0  ]]
   then
    if [ -f "/tmp/$i" ]; 
    then
     rm /tmp/$i
    fi

	else
    if [ ! -f "/tmp/$i" ]; then
     touch /tmp/$i

    fi
  fi
 fi
  done
exit 0;

Direct download:

curl https://raw.githubusercontent.com/mikkelrask/scripts/master/server-services.sh -o /server-services.sh && chmod +x /server-services.sh
Github: https://raw.githubusercontent.com/mikkelrask/scripts/master/server-services.sh