Avdeling for informatikk og e-læring, Høgskolen i Sør-Trøndelag Shellscripting I Tor Halsan 19.08.2010 Lærestoffet er utviklet for faget LN199D Scripting av Servere Resymé: Leksjonen er første innføring i shellscripting. Vi tar for oss hvorfor vi scripter og hvordan vi skriver scriptet. Så blir vi introdusert for sentrale begrep som variabler, parameter og kontrollstrukture Innhold 1 Shellscripting I 2 1.1 Introduksjon...................................... 2 1.2 Hva er et shellscript?................................. 2 1.3 Hvorfor skrive script?................................. 3 1.4 Hvordan skrive et script................................ 3 1.4.1 Eksempel på skriving av script med vim................... 3 1.5 Variabler........................................ 4 1.6 Parameter inn til scriptet............................... 4 1.7 Kontrollstrukturer................................... 5 1.7.1 If setninger.................................. 5 1.7.2 case...................................... 6 1.8 Logiske operatører.................................. 7 1.9 Oppsummering.................................... 7
1 Shellscripting I 1.1 Introduksjon Scripting er et meget viktig verktøy for en systemadministrator. En hver som drifter et *NIX-basert system vil forenkle mange av sine oppgaver vha. script, samt løse andre oppgaver som ikke enkelt lar seg løse direkte. Scriptene man lager kan enten kjøres manuelt eller automatisert ved bestemte tidsrom / intervall (dette er en såkalt cronjob). Hvis man ser etter vil man oppdage at flere av de kommandoene en kjører til daglig i Linux faktisk er script. Forhåpentligvis vil dette kurset gjøre dere i stand til å både skjønne disse scriptene og lage egne. Det forutsettes her at man har kjennskap til praktisk bruk av Linux og kommandoskallet fra før i dette faget. De ulike kommandoer vil bare i liten grad bli forklart, da det forutsettes at man kjenner disse fra før. Kommer dere over kommandoer som er ukjente og ikke forklart her, man dere benytte Linux innebygde manualsystem for å lære mer om disse (man kommando) 1.2 Hva er et shellscript? Et shellscript kan vi si er en samling med kommandoer samlet i en fil. Denne filen tolkes av kommandoskallet. Et script er derfor ikke et kompilert program. Vi skal nå se mer på bestanddelene i et script. Dette gjør vi ved å se på et enkelt eksempel:!/bin/bash Enkelt script gir oss antallet unike brukere som er logget på systemet. Tor Halsan, 2008-11-21 ANTALLBRUKERE= who cut -d " " -f 1 uniq wc -l echo -e "Det er $ANTALLBRUKERE unik(e) bruker(e) logget på date " Dette enkle scriptet består av 3 deler: Første linje viser hvilket program som skal tolke scriptet, i dette tilfellet kommandoskallet bash Deretter følger linjer med kommentarer. Dette er et viktig element i scriptet vårt, da dette gjør det lettere for andre å lese det, samt at man her kan ta med en rekke opplysninger som kan være viktige for fremtidige brukere. Gjør det til en vane fra første stund å skrive slike kommentarer!
Hvorfor skrive script? side 3 av 7 Til sist har vi to linjer med selve kommandoene. Selv om man kan si at et shellscript består av kommandoer skrevet i den rekkefølge man vi ha dem utført, kan et shellscript inneholde mange elementer vi kjenner igjen fra mer avanserte programmeringsspråk. Et slikt script kan inneholde blant annet løkker, kontrollstrukturer, funksjoner og interaktivitet. Vi skal gå gjennom alt dette i dette kurset. 1.3 Hvorfor skrive script? Scriptene er vår venn, å skrive script blir fort en viktig del av systemadministrators hverdag. Noen script skriver vi for å lette en jobb vi gjør ofte, mens andre skriver vi gjerne for at de skal kjøres jevnlig automatisk som nevnt i introduksjonen. Dette kan være ryddejobber, egne overvåkningsrutiner og periodisk vedlikehold av tjenester som går på tjeneren. 1.4 Hvordan skrive et script Å skrive selve scriptene er enkelt. Man bruker sin favoritteditor og skriver dette som en tekstfil. Jeg anbefaler at dere benytter en teksteditor som kan kjøres i enten i et terminalvindu eller direkte på konsollet, ikke en grafisk editor. Gode eksempler på slike editorer er vim og emacs. Grunnen til dette er at i stort sett alle tilfeller vil logge seg på en tjener via SSH og skrive script på en annen maskin fra sin egen maskin som er plassert utenfor maskinrommet. Jeg vil benytte editoren vim i dette eksemplet, men dere står selvsagt fritt til å selv velge en annen. vim har en innebygget opplæringsfunksjon for den som ikke kjenner programmet, det er bare å skrive kommandoen vimtutor for å starte opplæringen. Ved å editere filen /etc/vim/vimrc (eller legge en fil med tilsvarende innhold i hjemmekatalogen, ~/.vimrc, som overstyrer denne) kan man aktivisere en del nyttige funksjoner. Man kan fjerne kommenteringen av funksjonen «syntax on» for å få fargemerking av kode. Benyttes terminal med svart bakgrunn bør også «background=dark» aktiviseres. Finn gjerne ut av flere funksjoner selv. 1.4.1 Eksempel på skriving av script med vim Naviger til ønsket katalog på maskinen, for eksempel: cd ~/sas/script Start vim med ønsket fil: vim script1 trykk på tasten i (for å komme i insertmodus) og skriv inn selve innholdet. Tast Esc for å komme ut av insertmodus og skriv :x for å lagre og avslutte i en og samme operasjon. (:x tilsvarer :wq, altså Write og Quit) Gjør scriptet kjørbart:
side 4 av 7 Shellscripting I chmod +x script1 Test scriptet:./script1 1.5 Variabler I slike script vil variabler være viktig. Vi har allerede sett et eksempel på bruk av variabler i det første scriptet. Det er i slike script vanlig skikk å bruke store bokstaver, det gjør scriptene mer lettleste og variablene kan ikke forveksles med kommandoer. Variabler i shellscript deklareres ikke på forhånd slik som en er vant til fra rene programmeringsspråk. En variabel tilordnes en verdi med likhetstegn: VARIABEL1=432 VARIABEL2="Dette er tekst" VARIABEL3= date VARABEL4=$(date) Forklaring på disse tilordningene: VARIABEL1 får tallverdien 432. Dette betyr ikke at variabelen er av datatype integer (heltall) slik en kanskje skulle tro, alle variabler blir regnet som tekst. VARIABEL2 får blir satt lik en tekststreng. Vi bruker anførselstegn her, dette er nødvendig hvis tekststrengen består av mer enn ett ord. Det er god skikk å alltid bruke anførselstegn, selv om tekststrengen skulle bestå av bare ett ord. VARIABEL3 og VARIABEL4 får verdien som kommandoen date gir oss til svar. Dette er bare to forskjellige måter å gjøre det samme på. Legg merke til typen «fnutter» vi bruker på VARIABEL3. Det er denne typen tilordning vi benyttet i det første scriptet. Når vi etter tilordning skal benytte variabelen kjennetegnes dette ved at vi setter $ foran variabelnavnet. Dette forteller kommandoskallet som tolker scriptet vårt at dette er en variabel, og at nå skal vi sette inn verdien av denne. Hvis dere har skrevet inn det første scriptet på deres egen Linuxmaskin og kjørt dette, kan dere prøve å fjerne dollartegnet og se hva dere får ut da. I vårt første eksempelscript bruker vi altså to forskjellige måter å lage dynamiske strenger. Vi ser at i strengen vi skriver tilbake til brukeren bruker vi en variabel og et kommandoresultat. Bash tolker begge deler under utførelsen, selv om strengen står i anførselstegn. 1.6 Parameter inn til scriptet Det er svært vanlig å gi parameter inn til et script. Disse finner en lett igjen da de får standard variabelnavn, 1 er første parameter, 2 andre osv. Navnet til selve scriptet er 0. Disse variablene benytter vi på vanlig måte, vi henviser til disse ved å putte dollartegn foran. Vi viser dette dette med et eksempel:
Kontrollstrukturer side 5 av 7!/bin/bash Enkelt script for å legge til en ny bruker Bruksmåte: <scriptnavn> <brukernavn> Versjon 0.1 Tor Halsan, 2008-11-21 useradd $1 Dette er ikke et særlig godt script, men vi vil utvide det senere til å bli litt mer nyttig. Et slik script av denne typen, hvor vi standardiserer input til en eksisterende kommando kalles gjerne en wrapper, vi «pakker inn» kommandoen i et script. Vi vil belyse parametrene litt mer i neste avsnitt, hvor vi utvider vårt enkle eksempelscript over. 1.7 Kontrollstrukturer Vi skal nå se på kontrollstrukturer, hvor utførelsen av scriptet vil avhenge av om gitte betingelser er oppfylt. 1.7.1 If setninger Vi starter med å se på if setninger. Disse kan variere fra det helt enkle, til mer komplekse. De vil være på formen: if <betingelse>; then <utfør A> elif <betingelse>; then <utfør B> else <utfør C> fi Merk at elif og else er valgfrie, og at vi avslutter if med fi. Vi utvider vårt eksempelscript med en slik kontrollstruktur:!/bin/bash Enkelt script for å legge til en ny bruker Bruksmåte: <scriptnavn> <brukernavn> Versjon 0.2 Tor Halsan, 2008-11-21 Sjekk om du er root if [ /usr/bin/id -u!= 0 ]; then echo -e "Du må være root for å kjøre dette scriptet" exit 1 fi useradd -m $1
side 6 av 7 Shellscripting I Nå avsluttes scriptet hvis vi ikke er root. Det er ingen vits i prøve å legge til en annen bruker uten at man har rettigheter til dette. Her introduseres vi for en annen kommando: [. Dette er egentlig kommandoen test (man test gir oversikt over syntaks). Det vil etterhvert komme fler eksempler på hvordan denne kommandoen brukes. Vi sjekker hver UID (user ID) til brukeren som kjører, og hvis denne ikke er lik 0 (roots UID) får vi melding om dette, og scriptet avsluttes med en feilkode. Et vellykket script vil returnere verdien 0 ved avslutning, mens vi returnerer andre verdier ved feil. Dette kan brukes til flere ting, slik som kjøring av andre kommandoer hvis scriptet ikke gikk som det skulle. Vi vil se eksempler på dette i avsnittet om logiske operatører. 1.7.2 case I shellscript har vi også muligheten til å bruke flervalgskontrollstrukturen case. La oss igjen belyse dette med et eksempel, vi utvider vårt enkle script til å la bruker velge gruppetilhørighet til den nye brukeren.!/bin/bash Enkelt script for å legge til en ny bruker Bruksmåte: <scriptnavn> <opsjon> <brukernavn> Versjon 0.3 Tor Halsan, 2008-11-21 Sjekk om du er root if [ /usr/bin/id -u!= 0 ]; then echo -e "Du må være root for å kjøre dette scriptet" exit 1 fi Sjekk hvilken gruppe brukeren skal tilhøre case "$1" in -a --ansatt) Dette er en ansattbruker useradd -m -d /home/ansatt/$2 -g ansatt $2 ;; -s --student) Dette er en studentbruker useradd -m -d /home/student/$2 -g student $2 ;; *) Alle andre opsjoner gir feilmelding echo -e "Ukjent opsjon" exit 1 ;; esac passwd $2
Logiske operatører side 7 av 7 Vi velger her mellom flere alternativer. Vi tenker oss at første argument inn forteller oss hvilken gruppe vi skal benytte. Vi lar også brukeren få to alternative måter å skrive inn opsjonene på, vi separer disse med tegnet (pipe). Her vil vi sjekke om første argument er lik «-a» eller «ansatt», og i tilfelle kjøre kommandoen som legger til en bruker med gruppetilhørighet til ansatte. Etter at denne kommandoen er utført har vi en linje med «;;» for å hoppe ut av kontrollstrukturen. Etter at vi har sjekket for våre godkjente opsjoner, har vi et valg som fanger opp «alt annet». Slik kan vi varsle brukeren om dette, og stoppe scriptet med en feilkode. 1.8 Logiske operatører Vi har også til disposisjon noen logiske operatører. Operatøren og skrives && og operatøren eller er. Disse kan brukes i samband med avslutningskodene som nevnt i forrige avsnitt. Vi kan tenke oss at dersom en kommando kjøres uten feil skal en ny kommando kjøres. Vi kan bruke kommandoen useradd som eksempel siden denne er brukt i våre eksempelscript. I forskjell fra kommandoen adduser opprettes her kun en bruker, uten at vi mulighet til å oppgi passord interaktivt. La oss tenke oss at vi vil sette passord hvis brukeren ble lagt til uten feil. Da kan vi skrive inn kommandoen useradd test && passwd test Her vil passordkommandoen kun bli kjørt hvis resultatet fra første kommando er vellykket. Tilsvarende kan vi benytte. 1.9 Oppsummering Vi har i denne leksjonen begynt å se på scripting i Linux. Vi har sett på hva et script er, litt om hvorfor vi skriver script og hvordan. Vi har startet med å se på den enkleste formen for scripting, shellscript. Dette fordi den enkleste formen for script er den det gjerne er lettest å ty til når når en trenger et script i en fei. Vi har sett på det grunnleggende; variabler og parametre. Videre har vi begynt å få en struktur over scriptene våre i og med at vi har gjennomgått kontrollstrukturer. Vi avsluttet med en rask titt på logiske operatører. Neste leksjon vil ta opp tråden med shellscripting, og vi vil bl.a. gjennomgå løkker.