Byg en terminal-menu på Mac
Hvorfor? - kort fortalt
Jeg lever meget af mit liv i en terminal. Derfor har jeg bygget en simpel menu hvor jeg bl.a. kan forbinde til de mere end 30 servere vi har i v5.dk, samt udføre en række andre kommandoer.
I stedet for at huske IP-adresser og hostnames på alle vores servere, skriver jeg nu blot s i min terminal, vælger den server jeg vil forbinde til og woupsi, så er jeg forbundet.
Tip: Ved at bruge SSH-nøgler slipper du også for passwords. Det har vi lavet en guide til her.
Hvad kan jeg i min menu? Og hvad kan du evt. bruge din menu til:
- Forbinde til alle dine servere med éet tryk
- Finde din offentlige IP-adresse
- Forbinde til din VPN på kontoret eller der hjemme
- Tænde og slukke OnAir-skiltet samt lys, kameraer mv. på dit kontor eller i hjemmet
- Hente dit NemID og andre ID-kort frem
- Vise log-filer fra dine servere
ssh servername tail -f /var/log/messages
- Styre jeres info-skærme på kontoret eller der hjemme
- Server-backups med rsync
- og meget, meget mere
Som du kan se, bruger jeg personligt min menu til rigtig mange ting, i stedet for at skrive de mange kommandoer gang på gang, er det noget nemmere blot at vælge fra en menu, og så klarer en funktion resten for mig.
I dette blogindlæg skal vi kigge på hvordan du kommer i gang med at bygge din egen personlige menu i terminalen. Jeg vil ikke gennemgå alle funktionerne i dette blogindlæg, men jeg gennemgår de to første punkter fra listen herover. Og så er der jo også noget til senere.
Eksempel på menu:
Download v5.menu-pakken
Jeg har lavet en pakke som du kan downloade her. Denne pakke indeholder alt hvad du skal bruge for at komme igang. Pakken indeholder to filer: dialog og s.sh. Pakken er hosted på github.com/gitv5/servermenu5
Hvad indeholder pakken?
- Dialog er et lille utility som vi bruger til at skabe menuen. Vi har compiled pakken til OS X for dig, men hvis du vil, kan du selv hente og compile kildekoden til dialog her.
- s.sh er vores lille bash-script vi bruger til at opbygge vores menu.
Sådan kommer du igang
Når du har downloadet pakken, skal du åbne filen s.sh i din yndlings editor. Vi bruger Atom.io her på v5.dk. Første gang du åbner filen, ser den sådan her ud:
For kort at forklare filen, så er den opdelt i tre sektioner:
Øverste, de blå funktioner: Disse funktioner kaldes når man vælger et bestemt punkt i menuen. Eksempelvis hvis man vælger at forbinde til serveren "hanne.v5.dk", så kaldes funktionen conn_server1()
Midten: De grønne tekster: De grønne tekster udgør selve menuen. Du kan lave så mange punkter her, som du ønsker.
Nederst: De grå teksten: Disse punkter udgør vores valgmuligheder fra menuen. Det er kort fortalt det kode der konverterer vores valg i menuen (det grønne), til en bestemt funktion (det blå) - så når vi vælger hanne.v5.dk sendes vi videre til den rigtige conn_server1()-funktion.
Lad os bygge en v5.dk Cloud-server ind i menuen
Jeg fjerner alle funktionerne pånær get_IP() og laver min egen nye funktion der hedder v5cloudserver() hvor jeg forbinder med SSH til min v5.dk Cloud-server med en specifik SSH-key (du kan naturligvis ændre ssh-kommandoen efter dit behov). Vores funktioner øverst ser nu således ud:
#!/bin/bash
## Vores v5.dk Cloud-server:
v5cloudserver() {
ssh [email protected] -i ~/.ssh/testkey
}
## Funktion til at hente public IP med:
get_IP() {
curl ipecho.net/plain ; echo ; read
}
Det næste jeg nu vil gøre, er at tilpasse vores menu, så man kan vælge imellem vores v5.dk Cloud-server og vores "Find IP-adresse"-funktion:
## Vores Menu
dialog --clear --backtitle "Daniels Servermenu baseret på et awesome v5.dk script" --title "Serverlist" \
--menu "Vælg en server:" 24 60 12 \
"srv4.cloudnet.dk" "Min awesome v5.dk Cloud-server" \
"findip" "Find din IP-adresse" \
"Afslut" "Afslut programmet" 2> ~/.menuchoices
Tip: Tallene "24 60 12" definerer størrelsen på vores boks. Prøv f.eks. at rette til 14 60 32.
Til sidst skal vi tilrette vores 0) case $choice in så vi får matched det valgte menupunkt med den rigtige funktion:
0) case $choice in
## Starter en funktion udfra et valg i menuen
srv4.cloudnet.dk) v5cloudserver ;;
findip) get_IP ;;
Afslut) clear; exit 0;;
esac ;;
*)clear ; exit ;;
Wupti! Nu har vi en tilpasset menu med vores egen/egne servere, og vi er klar til at teste.
Test din menuen
Åbn en Terminal på din Mac OS X og gå ind i mappen hvor dine to filer er placeret. Lad os starte med at sikre at vi har rettigheder til at eksekvere vores script. Det kan vi gøre med funktionen chmod +x:
$ chmod +x s.sh
Nu har vi rettigheder til at eksekvere vores menu-script, så nu er det blot at skrive:
./s.sh
Og så skulle vores menu meget gerne starte op:
Nu kan vi nemt bruge pil-tasterne på tastaturet eller hotkeys (tryk på f for at komme til "findip" eller a for at komme til Afslut).
Installation af menu
Jeg vil personligt gerne have, at jeg blot kan trykke s (efterfulgt af enter) i min terminal, og så åbner den selv vores menu op. Så lad os installere vores s.sh script ind i vores /usr/local/bin:
$ cp s.sh /usr/local/bin/s
$ cp dialog /usr/local/bin/dialog
$ chmod +x /usr/local/bin/s /usr/local/bin/dialog
Hvis du får en fejl når du kører ovenstående kommandoer, skyldes det højst sandsynligt at du ikke har /usr/local/bin-mappen oprettet på din Mac. Denne kan nemt oprettes ved at køre:
mkdir -p /usr/local/bin/
Nu kan du blot starte din menu op ved at skrive s i din terminal, efterfulgt af enter. Boom.
Hvad nu?
Nu har du en velfungerende menu, og nu kan du begynde at lege og bygge op. Alle de kommandoer du kan skrive i terminalen, vil også fungere inde i en funktion imellem de to { og }.
Udfordring til at komme videre
v5.dk handler om e-learning, og med et Premium medlemskab her på sitet, kan du se vores mange trin-for-trin e-learning videoer, men v5.dk handler også om at udforske og lære selv - for ved selv at lege og udforske, lærer man ofte meget hurtigere og bedre. Og derfor slutter vi af med at give en lille udfordring, for at komme i gang med selv at bygge nye menupunkter i din menu.
Udfordring: Nyt menupunkt der tester om der er Internet-forbindelse vha. ping
- Lav en ny funktion der kører følgende kommando der laver et ping imod Googles DNS-server og bagefter vente på du trykker "Enter":
ping -q -c1 -t5 8.8.8.8 ; read
- Opsæt et nyt menupunkt der hedder "Ping Google"
- Opsæt et nyt valg i vores case $choice
God fornøjelse med at bygge din personlige menu i Terminalen på din Mac.