ITKA203 Käyttöjärjestelmät -kurssin Demo 1 keväällä 2014. "Superpikaintro interaktiivisen Unix-shellin käyttöön"
Paavo Nieminen, paavo.j.nieminen@jyu.fi
Jyväskylän yliopiston tietotekniikan laitos.
Contents
Tämä demo syntyi alunperin Käyttöjärjestelmät -kesäkurssilla 2007. Kiitän silloisia kurssilaisia palautteesta. Koska tämän pitäisi olla Superpikaintro, jokainen kuudesta kohdasta pitäisi mennä keskimäärin 15 minuutissa (jotkut vähemmässä, jotkut lyhemmässä ajassa). Aiempien kurssien opiskelijoilla tämän tekemiseen kului vähimmillään puoli tuntia ja enimmillään noin kaksi.
HUOM: Tähän tulee jonkinlainen pakollisesti palautettava osio. Palautusmenettely ilmoitetaan maaliskuun loppuun mennessä; harjoitteet voi hyvin tehdä ennen palautusta, koska se tulee olemaan sitten joku noin parin minuutin kestävä sovellutus.
Terminologia ja teoria alta pois: Shell on englantia ja tarkoittaa suomeksi kuorta. Kyseessä on nimenomaan käyttöjärjestelmän päälle tehty "kuori", eli ohjelma jolla käyttöjärjestelmän toimintoja päästään käyttämään. Kuori voi olla graafinen, klikkailtava kuori, tai tekstimuotoinen. Tekstimuotoisesta meille on kurssin mielessä enemmän hyötyä kolmesta syystä: (1) siinä päästään ainakin opettajan mielestä täsmällisemmin lähelle käyttöjärjestelmän toimintoja (2) tekstimuotoisen kuoren komentoja päästään myöhemmin suoraan kirjoittamaan komentoriviohjelmiksi eli skripteiksi ja (3) tekstikuorten käyttö on nykyisin harvinaisempaa ns. "harrastajien" ja peruskäyttäjien keskuudessa, joten sitä on syytä käsitellä tällaisella ammattilaisten ja "tehokäyttäjien" alkupään kurssilla. Yleisesti ottaen "kuori"-tyyppinen komenteluohjelmisto voidaan ajatella minkä tahansa kommenneltavan järjestelmän ympärille; tässä tapauksessa kyseessä on käyttöjärjestelmäohjelmiston kuori. Koska se on kansainvälisesti tunnettu ja suomen kieleenkin vakiintunut termi, käytämme jatkossa kuoresta pääsääntöisesti sanaa shell.
Harjoituksen tavoitteet:
- Shellin perusidea tulee sinulle tutuksi ja shell-komentojen kirjoittaminen menee selkärankaan käytännön tekemisen kautta.
- Saat hieman ohjattua käytännön kokemusta tekstishellin käytöstä; vinkit ovat tärkeitä, etenkin jos tämä on ensimmäinen kerta ikinä.
- Näet ainakin nimeltä ja päällisin puolin kertaalleen joitain perusohjelmia, joita Unix/Linux -järjestelmiin on useimmiten asennettu; näet myös joitakin "unixmaisia" käytäntöjä mm. käyttäjän näkökulmasta tiedostojärjestelmään.
- Opit, miten aihetta voi itsenäisesti oppia lisää tarvittaessa ja/tai "sitten kun on aikaa".
Jotkut komennoissa tarvittavat merkit ovat hieman yllättäviä ja harvemmin käytettyjä muualla kuin shelleissä. Lisäksi ne on joskus vaikea erottaa toisistaan paperilta tai näytöltä. Tässä on mallikappaleet vaikeammin toisistaan erottuvista erikoismerkeistä, joita shelleissä käytetään:
~ Tilde, "mato"; tavallisesti Alt Gr:n ja sitten sen enterin vierestä löytyvän näppäimen yhdistelmänä. Tämän jälkeen pitää painaa vielä välilyöntiä, että varsinainen matomerkki tulee. Syy on se, että sen varsinainen merkitys on olla espanjalaistyylinen aksenttimerkki, esim. sanassa "mañana" ^ Sirkumfleksi, "hattu"; tavallisesti Shiftin ja enterin vierestä löytyvän näppäimen yhdistelmänä. Sama juttu: pitää painaa välilyöntiä tai voikin tulla esim ê tai î ... " Lainausmerkki, "double quote" ' Heittomerkki, "single quote" ` gravis eli vasemmalle kallistuva aksenttimerkki, "back-tick"; tulee usein Shiftin ja BackSpacen vieressä olevan napin yhdistelmänä. Tämäkin on àksènttimerkkì, joten pitää painaa perään välilyöntiä. (Näin se on ohjelmoijan elämä tehty vaikeaksi suomalaisella näppäimistöllä...) Muista Shift, ettei tule vahingossa ´ eikä ` { aaltosulku; tulee yleensä näppäilemällä Alt Gr + 7 } Vastaava sulku toisin päin; tulee yleensä näppäilemällä Alt Gr + 0 | Tolppamerkki; tulee yleensä näppäilemällä Alt Gr + vasemmasta alakulmasta, jossa on suomalaisessa näppiksessä myös > ja <
Muita tavallisesti käytettyjä erikoismerkkejä ovat <>*?#!;& -- ne erottuvat toisistaan vähän helpommin. Mac-koneiden käyttäjät saavat nämä merkit myös jostakin, mutta toistaiseksi en osaa antaa ohjeita, koska ei ole kokemusta Maceillä näppäilemisestä.
Luennolla nämä samat varoitukset mainittiin/tullaan mainitsemaan, mutta laitetaan ne tähän itseopiskelijoita varten. Shellillä komennat tietokonetta erityisen suoraan ja tehokkaasti: Jos pyydät poistamaan tiedoston, se HÄVIÄÄ! Ja jos kirjoitat jotain aiemman tiedoston päälle, sen aiempi sisältö HÄVIÄÄ! Ja kun jotain hävisi, se EI TULE TAKAISIN! Mitään tuplavarmistuksia ei ole.
Älä pelkää kuitenkaan. Noudata ohjeita, niin kaikki menee hyvin ja on mukavaa. Päivän analogia: Ranskanperunat on tehokasta uppopaistaa rasvassa, joten uppopaisto on hyvä juttu. Vaikka sormien laittaminen kuumaan rasvaan on pieni ja helppo liike, sitä ei saa tehdä sen takia että se on vaarallista eikä ollenkaan se asia, minkä haluat rasvan avulla toteuttaa. Sama juttu pätee shellin käytössä.
Kirjoittaja vastaa siitä, että tämän oppaan esimerkit ovat täysin turvalliset jos ne kirjoitetaan merkistä merkkiin sillä tavoin kuin ne tässä annetaan. Siihen vastaaminen loppuu. Älä siis sohlaa ellet ymmärrä. Sitten kun olet varma siitä mitä sohlaat, se muuttuu jopa suotavaksi.
Aluksi nämä varoitukset on ymmärrettävistä syistä annettava. Niistä huolimatta tämän harjoituksen päätarkoitus on vähentää pelkokerrointa ja tehdä yksi tehokkaan automaattisen tietojenkäsittelyn työkalu tutuksi ja turvalliseksi. Mitään hätää ei ole, jos noudatat yllämainittuja pääsääntöjä, etenkin numeroa yksi, "ajattele ennen kuin kirjoitat", ja viisi, "pidä varmuuskopiot". Toivon lukijalle tietoteknisen vapautumisen, ymmärtämyksen luoman turvallisuuden sekä tehokkuudesta syntyvän riemun kokemuksia, jollaisia interaktiivisen shellin oppiminen itselleni aikoinaan tarjosi!
" Apua! Painelen näppäimiä, mutta mitään ei tapahdu shellissä "
Jotkut normaalit tilanteet voivat näyttää siltä, että shell jumittui eikä tee mitään. Alla on pieni ongelmanselvitysohje pääteyhteydelle silloin kun se "lakkaa vastaamasta". Tärkeintä on olla menemättä paniikkiin; näppäimiä ja varsinkaan enteriä ei saa hakata hullun raivolla, koska voi tulla tuhoja (ks. varoitukset edellä). Todennäköisesti kyseessä on ihan normaali ilmiö.
" Apua! Komentoni menevät läpi ja tulosteet tulevat, mutta en näe, mitä kirjoitan. "
" Täysi paniikki! Kaikki on jumissa "
Jotkut ohjelmat voi olla pirullisia käyttää ennen kuin on lukenut niiden ohjeet. (Samoihin ohjelmiin saattaa ohjeiden lukemisen jälkeen lähes rakastua, koska ne ovat nii-in tehokkaita käyttää). Yksi esimerkki on Vi-tekstieditori, jossa pitää osata painella järjestyksessä näppäimet ESC : q ! ja enter, että pääsee pois. Emacs-tekstieditorin poistumiskomento puolestaan on Ctrl-X Ctrl-C. Muitakin ehkä voi tulla vastaan. (Kohteliaisuussyistä mainitsin ensimmäisen vi:n, vaikka olen itse emacs-fani.)
Joskus ohjelmat kysyvät jotakin, johon pitäisi osata vastata jotakin. Jos et ole kiinnostunut opettelemaan asiaa manuaalista, tai ei ole aikaa, kokeile seuraavia näppäilyjä, jotka useissa ohjelmissa peruuttavat aloitetun interaktiivisen toiminnon:
- ESC
- ESC pari kertaa peräkkäin
- Ctrl-G -- tämä on aika tyypillinen "Cancel"-toiminnon näppäin
- Ctrl-Q tai Ctrl-C -- huomaa että nämä saattavat lopettaa koko ohjelman!
Viimeisenä keinona sulje vaan kylmästi pääteyhteysohjelma ja ota yhteys uudelleen. Normaalisti tähän pitäisi olla hyvin vähän tarvetta.
Jos haluat vain päästä käsiksi harjoitteisiin, voit hypätä tämän luvun yli! Koen että on pakko vähän halkoa hiuksia ja ylitarkentaa sitä, mitä olen osannut kertoa, ja mitä taas en oikeastaan ole edes tarkkaan pohtinut. Ettei näistä asioista tule tarpeetonta kritiikkiä... Huomattakoon että kaikki tarkennukset ja korjausehdotukset käsitellään saman tien; otan sellaista sähköpostia mielellään vastaan.
Tämä käytännön harjoite toteutetaan Jyväskylän yliopiston Tietohallintokeskuksen suorakäyttökoneella nimeltä jalava.cc.jyu.fi tai vastaavalla koneella halava.cc.jyu.fi keväällä 2014. Näihin aikoihin tuossa koneessa on käyttöjärjestelmäksi asennettu Red Hat Enterprise Linux Server release 6.5 (Santiago), joka on ns. Linux-distribuutio eli "jakelupaketti". Distribuutio sisältää Linux-käyttöjärjestelmän ytimen sekä valikoiman apu- ja sovellusohjelmia.
Käytetään siis Linuxia. Se on suomalaisen Linus Torvaldsin 1990-luvulla alullepanema käyttöjärjestelmä, joka pohjautuu vahvasti 1970-luvulta saakka vaikuttaneeseen Unix -käyttöjärjestelmään. Molempien käyttöjärjestelmien, Unixin ja Linuxin, erilaiset versiot ja muunnokset sekä niiden jakelupaketit (huom: sekä kaupalliset kuten kyseinen Red Hat Enterprise Linux että ilmaiset kuten Fedora, Ubuntu, ...) elävät ja voivat hyvin vuonna 2014 ja näköpiirissä olevaan tulevaisuuteen. Esimerkiksi valtaosa nykypäivän WWW-palvelinkoneista käyttää jotakin Unixia tai Linuxia käyttöjärjestelmänä. Linux on potentiaalinen käyttöjärjestelmä myös kännyköihin ja muihin kannettaviin laitteisiin. Linux-osaamista arvostetaan työmarkkinoilla. Sekä Unix että Linux ovat pääasiallisen oppikirjamme (W. Stallings: Operating systems, 7th edition) esimerkkejä Windows 7:n ohella.
Kurssin kolmannella luennolla sivutaan jonkin verran käyttöjärjestelmien historiaa, mutta niiden tarkempi "sukupuu" jää oman kiinnostuksen ja tiedonhaun nojaan. Neljässä opintopisteessä on keskityttävä toisaalta hyödyllisiin nykypäivän kädentaitoihin ja toisaalta nykyaikaisen käyttöjärjestelmän toteutuksellisiin yksityiskohtiin, vaikka historian tunteminen olisi akateemisesti hyödyllistä.
Käytän tässä oppaassa joskus sanamuotoa "Unixissa tai ainakin Linuxissa", koska jotkut asiat toimivat hieman eri tavoin Linuxissa kuin Unixissa, ja itselläni on varsinaista kokemusta lähinnä Linuxista. Eroja on sitä enemmän, mitä "monimutkaisemmasta" työkalusta on kyse. Perusperustyökalut, joita tässä oppaassa nähdään, ovat käsittääkseni yleismaailmallisia kaikissa Unixeissa. Kun olen asiasta mielestäni täysin varma, sanon että "Unixeissa" näin on. Silloin on toki myös Linuxeissa. Kuitenkin jossain kulkee raja siinä, mikä on Perusperustyökalu, mikä on vain Perustyökalu, ja mikä ei sitten enää ole "peruskalu" ollenkaan vaan enemmänkin itsenäinen ja erillisenä toimitettava sovellus, joka ei Unixiin tai Linuxiin kuulu. Raja on vähän häilyvä, eikä hahmottuisi kuin esim. POSIX-standardia lukemalla. Myönnän, etten ole paljonkaan silmäillyt sitä.
Mitä tämä esipuhemainen höperrys tarkoitti? Sitä, että
Ajattele tässä olevia esimerkkeinä juuri vain esimerkkeinä, ja muista että opettelet olennaisempaa asiaa kuin joku tietty komento tai sen argumenttien muoto: Opettelet interaktiivisen shellin käyttöä, sen ideaa ja mahdollisuuksia, ja monen käyttäjän järjestelmässä toimimista pääteyhteyden kautta. Se on aina samanlaista vaikka komennot tai syntaksit olisivat mitä!
Tässä pikaintrossa oletetaan seuraavat asiat:
Toimit joko Agoran mikroluokassa tai muualla, missä käytössäsi on esim. Windows -käyttöjärjestelmä sekä SSH-kelpoinen yhteysohjelma (esim. KiTTY Client, Secure Shell SSH Client, PuTTY SSH Client). Kotikoneelle on siis tarvittaessa ensin hankittava yhteysohjelma. Ainakin PuTTYn tai siitä johdetun KiTTYn saa netistä ilmaiseksi. Linuxissa ja käsittääkseni Maceissä on valmiina yhteysohjelma, joka käynnistyy omalta komentoriviltä komennolla ssh. Etäkone käyttää merkistön koodaukseen oletuksena Unicoden "UTF-8" -muotoa, joka kannattaakin omista asetuksista laittaa päälle, jos mahdollista.
Olet Jyväskylän yliopiston opiskelija, jolloin sinulla on käyttöoikeus IT-palveluiden suorakäyttökoneille. Käyttäjätunnus ja salasana on sinulle joskus jaettu.
Jos näin ei kohdallasi ole, ota yhteyttä, niin mietitään ratkaisua...
Huom: Unix-koneiden käyttö täytyy aktivoida erikseen; ohjeet ovat tuossa alla.
Seuraavassa käytetään yhteysohjelmana KiTTYä (toiminee PuTTYssä samalla tavoin). Varo tosiaan copy-pastea; hiiriklikkaukset näyttävät toimivan KiTTY-ohjelmassa "Linux/X-mäisesti" mikä voi Windows-käyttäjää ihmetyttää: Jo pelkkä maalaaminen ikkunassa tekee välittömästi kopion leikepöydälle, ja oikeanpuoleinen nappi liittää leikkeen sisällön ikään kuin se kirjoitettaisiin tekstinä näppäimistöltä!
Näköjään IT-palveluiden ohjeen mukaisesti sinun pitäisi ensin käydä aktivoimassa Unix-tunnus WWW-osoitteessa http://salasana.jyu.fi/ jos et ole sitä aiemmin tehnyt:
- Linkki "Salasanan vaihto ja tunnuksen tietojen päivitys"
- "Activate UNIX" -painike
Varmista, että interaktiiviseksi shelliksi on valittu bash eli jos kohdassa "Account Info" eli ole "Shell" -rivillä "bash", niin käy vaihtamassa:
- Klikkaa "Change Account Info", vaihda kohtaan "Shell" valinta "bash".
Tämä bash eli Bourne Again Shell on nykyinen oletusasetus, mutta joillakin vanhemmilla opiskelijoilla se on mahdollisesti ollut jotakin muuta. nykyään kannattaa käyttää bashiä, mm. koska suurin osa netistä löytyvistä Unix-ohjeista on juuri bashin käyttöä ajatellen tehty.
Sitten pitäisi olla Unix-etäyhteys käytettävissä. Seuraavaksi:
Etsi ja käynnistä KiTTY SSH Client -ohjelma (tai muu valitsemasi SSH-asiakasohjelma)
Kirjoita etäkoneen osoitteeksi jalava.cc.jyu.fi ja klikkaa "Open"
Ensimmäisellä kerralla tulee dialogi-ikkuna, jossa kysytään, hyväksytkö etäkoneen Host Key:n. Se ei (ehkä, välttämättä, toivottavasti) tällä kertaa tarkoita, että joku vakoilisi tietoliikennettä, vaan sitä, että Jalavan isäntäavainta ei ole vielä tallennettu paikalliselle tietokoneelle. Voinet klikata hyväksyvästi. Jos joku ilkeä yrittää napata tietoliikennettä, tämä varokeino kertoo tarkkasilmäiselle käyttäjälle siitä. Normaalisti tämä tulee vain ensimmäisellä yhteyskerralla tai silloin, kun isäntäkoneella on esim. niin suuri päivitys että avain vaihdetaan.
Kirjoita käyttäjätunnus, kun kysytään login as:
Kirjoita yliopiston salasanasi, kun sitä kysytään, eli tulostuu password: (huomaa, että salasanan merkkejä ei kaiuteta näkyviin päätteellesi, tietenkään)
Jossain vaiheessa voit tutustua kirjautumisen yhteydessä mainittuun infosivuun
... Tämä demo-ohje tosin kertoo enemmän kuin tuo sivu ainakaan nykymuodossaan.
Nyt tutustut shellin käyttöön kirjoittamalla komentoja, jotka tulostavat tietoja siitä tietokoneesta, johon olet yhteydessä. Jokaisen komentorivin jälkeen pitää tietysti painaa enter. Komennot ovat lyhyitä aluksi; loppua kohti tehdään pidempiä ja pidempiä. Mutta lähdetään liikkeelle perusasioista.
Kuka olet?
Komenna:
whoami
Mitä tapahtui? Shell kertoi kuka sinä sen mielestä olet. Eli käyttäjätunnuksesi tulostui.
Missä olet?
Komenna:
uname -n
Millainen paikka se on?
Komenna:
uname -nmo
Tämä kertoo millainen prosessori ja minkä tyyppinen unix etäkoneessa on. Vielä lisää tietoa:
uname -a
Komenna:
who
Koeta tulkita tulostetta. Havainnet, että who kertoo, mitkä muut käyttäjätunnukset ovat tällä hetkellä kirjautuneina koneelle. Se kertoo myös, milloin kukin käyttäjä on kirjautunut ja minkä nimiseltä tietokoneelta yhteys on otettu. Jokainen koneeseen otettu yhteys näkyy yhtenä rivinä. Huomaa käyttäjän näkökulma moniajoon: Eikö vaikutakin siltä kuin itse olisit ainoa joka käyttää tietokonetta, vaikka Jalavan prosessoreita käyttää kovin moni muukin yhtäaikaa! Tämä kokemuksesi on yksi nykyaikaisen käyttöjärjestelmän tavoitetilanne. (Ja pääteyhteydessä voi kyllä joskus havaita tiettyä "tökkimistäkin", joka saattaa johtua esimerkiksi etäkoneen suuresta käyttöasteesta. Teoria ja käytäntö tähän liittyen tulevat tutuiksi tällä kurssilla.)
Kaikki nimet tuskin mahtuivat yhteen kuvaruudulliseen. Kokeile pääteohjelmasi vieritys-ominaisuutta. Jossain kohtaa ikkunaa on luultavasti vierityspalkki, josta näet ohi vilahtaneet rivit. Voi myös olla, että esim. näppäinyhdistelmä Shift+Page Up antaa edellisen sivun tulosteesta ja Shift+Page Down seuraavan. Tulosteita tallentavan puskurin koko on rajoitettu, joten ihan vanhimmat rivit häviävät sitä mukaa kun uusia tulee. Puskurin kokoa voi luultavasti säätää oman yhteysohjelmasi asetuksista.
Komenna:
who | less
Nyt jouduitkin uuteen tilanteeseen! Ensinnäkin käynnistit kaksi ohjelmaa yhden sijasta. Minkä tahansa ohjelman tulosteen voi ohjata minkä tahansa toisen ohjelman syötteeksi käyttämällä tolppamerkkiä | yllä olevalla tavalla. Tätä sanotaan putkittamiseksi. Ohjelmien välille muodostuu putki (engl. pipeline), jota pitkin data kulkee ohjelmalta toiselle. Asiaan palataan myöhemmässä osiossa.
Lisäksi viimeksi käynnistämäsi ohjelma less on itsessään interaktiivinen. Sen tarkoitus on näyttää pitkä teksti pieni pätkä kerrallaan. Tällaista ohjelmaa sanotaan sivuttajaksi (engl. pager). Voit selata tulostetta nuolinäppäimillä ylös ja alas. Less-ohjelmasta pääsee pois näppäilemällä Q.
Pääteyhteydellä ei siis tarvitse käyttää pelkästään shelliä tai yksinkertaisia apuohjelmia. Mitä tahansa tekstimuotoisia ohjelmia (tai siis niin sanottuja konsoliohjelmia) voidaan käynnistää ja käytellä pääteikkunassa. Ja jos etäkoneella ja omalla koneella on yhteinen ikkunointijärjestelmä, voi nopean nettiyhteyden yli kuljettaa grafiikkaakin. Suosittuja käyttötarkoituksia tällaisella Linux-palvelimella ovat IRC-, news- ja postiohjelmien käyttö.
Kuka on kukin?
Komenna:
finger
Tarkkaile, miten tuloste on erilainen kuin edellä who -komennon tulostama. Jos haluat, voit käyttää less-"sivuttajaohjelmaa" jälleen putken avulla:
finger | less
Valitse joku kirjautuneista käyttäjätunnuksista tai joku tuntemasi kaveri/opettaja, ja katso, mitä saat tietää hänestä palvelimelta. Esim. komenna:
finger -m nieminen
Huomaa, että tässä tarkoitetaan käyttäjätunnusta eikä oikeata nimeä. (Aikoinaan voitiin ottaa käyttäjätunnukseksi vaikkapa oma sukunimi, jos kyseinen tunnus sattui olemaan vapaana, mutta nykyään tämä ei ole enää käytäntönä). Käytä fingeriä joka tapauksessa käyttäjätunnukseen nieminen. Huomaat, että siellä näkyy käyttäjän itsensä asettamia tiedotuksia. Jokainen voi asettaa näitä itselleen tietyllä tapaa, mutta ei käsitellä asiaa tässä tarkemmin. (Jos jossain vaiheessa asetat itsellesi .plan -tiedoston, pidä tarkoin huolta hakemistojesi käyttöoikeuksista, ja ymmärrä niiden vaikutus. Tällä kurssilla opitaan tästä perusteet luennolla, joka käsittelee tiedostojärjestelmiä.)
Mitä kukin tekee?
Komenna:
ps -ef
Mitä tapahtui? Komento tulosti kaikkien käyttäjien kaikki päällä olevat ohjelmat. Niitäkin on luultavasti aika monta koko ajan. Älä vielä tässä vaiheessa huoli siitä, mitä kaikki tulosteen tiedot ovat. Ne selviävät varmasti Käyttöjärjestelmät -kurssin edetessä yksi asia kerrallaan. Ensimmäinen sarake on käyttäjätunnus ja viimeinen on se komento, jolla käyttäjä käynnisti ohjelman. Huomannet, että root -niminen käyttäjä on käynnistänyt paljon sshd-ohjelmia. Itse asiassa tämä on sitä, kun käyttöjärjestelmän valtuuksin (root) toimiva SSH-palvelin on käynnistänyt login-shellejä etäyhteyksille. Sinullekin pitäisi tällä hetkellä löytyä tuollaiset rivit ps:n tulosteesta.
(Tai siis millainen paikka sinulla on täällä lainassa yliopistolta opintojesi ajan). Komenna:
pwd
Jos mitään ihmeellistä ei ole tapahtunut, olet yhä kotihakemistossasi, johon sisäänkirjoittautumisen jälkeen shellissä päästään (tai ehkä jossain on joku asetus, jolla voi määrätä shellin aloituksen eri paikkaan kuin kotihakemisto, en tiedä, koska koskaan en ole tarvinnut sellaista ominaisuutta). Komento pwd kertoo nykyisen oleskeluhakemiston. Se on jotain vastaavaa kuin /nashome3/nieminen.
Huomaa, että Unixissa hakemistonimissä on hakemistojen erottimena kauttaviiva / kun taas Windowsissa kenoviiva \ palvelee vastaavaa tarkoitusta.
Unixin tiedostojärjestelmän "juuri" on hakemisto / eli pelkkä kauttaviiva. Koko hakemistorakenne jäsentyy siitä alkaen. (Tällainen rakenne voi olla joltain kantilta katsoen suoraviivaisempi ja loogisempi kuin esimerkiksi eri juuren antaminen eri "levyasemille" eli A:, B:, C: jne.)
Komenna:
ls
Pitäisi tulostua kotihakemistosi sisältö. Huomaa, että se on sama kuin U: -asemasi yliopiston Windows-koneilla. Kumpikin hakemistopolku viittaa samaan paikkaan jaetulla verkkolevyllä. Fyysinen kovalevy voidaan siis jakaa ihan eri käyttöjärjestelmien ja tietokoneiden välillä! Voit hyvin olla kirjautuneena useaan tietokoneeseen, joissa kaikissa näet yhden ja saman verkkolevyn sisällön ikään kuin se olisi yksi paikallisen koneen levy (tai itse asiassa hakemisto).
Ensinnäkin voit huutaa ja katsoa, miten kaiku vastaa (mutta "huuda" toistaiseksi esimerkin mukaisesti ilman huutomerkkiä, koska sillä on erikoismerkitys shellissä). Komenna:
echo Miten kaiku vastaa
Eli komento echo ei tee muuta kuin tulostaa omat argumenttinsa. Se on erityisen hyödyllinen esim. skripteissä, joiden halutaan ehkä tulostavan jotakin. Skriptin suorittama "kaiku" päätyy nimittäin esimerkiksi käyttäjälle, joka suoritti skriptin. Tai se voi tallentua lokitiedostoon (kohtapuoleen katsotaan, miten echon tai minkä tahansa ohjelman tulosteet voi kirjoittaa tiedostoihin; olet jo alustavasti nähnyt, miten ne voidaan ohjata toisen ohjelman syötteiksi putkella).
Tekstitiedostojakin täällä voi tulostaa päätteelle. Komenna:
cat /etc/group
Komento cat on sellainen, että kun sille antaa argumenttina tiedoston nimen, se lukee tiedoston ja tulostaa sen sisällön. (Varsinainen käyttö on "katenointi" eli usean tiedoston tulostaminen peräkkäin; siitä nimi cat.)
Esimerkin tiedosto /etc/group löytyy usein Unix-asennuksista (ehkä jopa aina? pitäisi tarkistaa standardi...); se on tietyn muotoinen tekstitiedosto, joka kertoo koneelle määritellyt käyttäjäryhmät.
Eli tällaisia peruskomentoja kuin echo ja cat löytyy... Ja pidempi teksti olisi ehkä parempi lukea interaktiivisella less-ohjelmalla kuten edellä tehtiin. Putken sijasta tiedoston voi kertoa lessille argumenttina:
less /etc/group
(Lessistä tosiaan pääsee pois painamalla Q ...)
Vielä yksi. Komenna:
cat /proc/cpuinfo
Tämä kertoo yksityiskohtaista tietoa etäkäyttökoneen prosessoreista, joiden toiminta ja käskykanta ovat yksi tämän kurssin teemoista. Huomataan, että keväällä 2014 kone jalava.cc.jyu.fi näyttäytyy meille neliytimisenä Intel Xeon -prosessorina.
Mitäs muuta etäkäyttö-Unixilla voi tehdä?
Komenna:
ls /bin/
Tulostui reilu 100 kappaletta apuohjelmia. Tutki listaa; löydätkö edellä käytettyjen komentojen nimiä? Hakemisto /bin on tyypillisesti Unixissa perusapuohjelmien paikka. Nämä ohjelmat löytyvät melko varmasti kaikista unixeista, ja melko varmasti ne löytyvät kaikkialla nimenomaan hakemistosta /bin. Muistanet, mistä kaikki suoritettavat ohjelmat tulevat: ne on jossain vaiheessa käännetty lähdekoodista konekieliseksi binääritiedostoksi. bin-nimisissä hakemistoissa on usein sellaisia ja lisäksi tulkattavia ohjelmia kuten shell-skriptejä. Jokainen voi tehdä itselleen oman kotihakemiston alle kokoelman omia ajettavia ohjelmia ja skriptejä (/home/kotihakemistosi/bin).
Sitten laajennetaan näkökulmaa... pidä tuolista kiinni, kun komennat seuraavan.
Komenna:
ls /usr/bin/
Tulostui noin 2250 kappaletta sovellusohjelmia. Saatan kertoa, että niillä voi tehdä kaikenlaista... Itse asiassa yleisimmille Linux-distribuutioille on saatavilla yli 5000 valmiiksi paketoitua ohjelmaa (joillekin vielä enemmänkin), joilla voi tehdä kaikenlaista. IT-palveluiden kiltit sedät ja tädit ovat valinneet jonkinlaisen harkinnan perusteella etäkäyttökoneisiimme asennettavaksi juuri nuo siellä olevat 2250+ ohjelmaa. Ohjelmien paketoinnista vastaa distribuution toimittaja (esim. yritys) sekä, erityisesti vapaan lähdekoodin maailmassa, vapaaehtoiset apulaiset. Jos distribuution toimittaja ei ole jotakin tarpeellista ohjelmistoa paketoinut, se jää paikallisen mikrotuen (meillä siis Jyväskylän yliopiston IT-palveluiden henkilökunnan) tehtäväksi.
Turha varmaan yrittää käydä läpi kaikkia noita ohjelmia. Ennemmin kannattaa ehkä keksiä, mitä haluaisit tietokoneella tehdä, ja sitten etsiä Internetistä jollain hakusanoilla tieto siitä, minkä nimisellä ohjelmalla se voidaan Linuxissa tehdä. Tai kysy kokeneemmalta Linux-käyttäjältä vinkkiä. Vaikka onhan mahdollista tutustua mielenkiintoisen nimisiin ohjelmiin sattumanvaraisestikin. Seuraavassa osuudessa katsotaan, miten käyttöohjeet ovat shellissä aina lähellä. Ennen sitä kerrataan kuitenkin havainnot shellistä tähän asti:
Shell antaa sinun kirjoittaa komennon ja odottaa että painat enter-näppäintä.
Sitten shell suorittaa komennon. Usein se on jonkun ohjelmatiedoston nimi ja ohjelmalle välitettävä argumenttilista.
Argumenteista muodostuu siis lista. Eri argumentit erotetaan toisistaan välilyönnillä.
Esimerkiksi Javalla tehty ohjelma vastaanottaa argumentit main-metodin String[] args parametrissa. C-kielellä tehty taas saa erikseen lukumäärän ja varsinaiset merkkijonot, kuten kurssin luennolla tullaan näkemään.
Jos yhteen argumenttiin haluaa sisällyttää välilyönnin, se on mahdollista, mutta se pitää koodata eri tavoin, koska muuten välilyönti tulkitaan eri argumenttien erottimena. Pari mahdollista tapaa:
jokukomento argum1 "argum2 jossa on välilyöntejä" argum3 jokukomento argum1 'argum2 jossa on välilyöntejä' argum3 jokukomento argum1 argum2\ jossa\ on\ välejä argum3
Eli argumentti lainausmerkkien sisälle tai välilyönnin koodaus kenoviivalla + välilyönnillä. (Lainausmerkit " ja ' tarkoittavat hieman eri asiaa! Selvitä asia tarvittaessa jostain lähteestä myöhemmin...). Kaikki ylläolevat komennot siirtävät kolme argumenttia ohjelmalle. Esim. komento:
java JokuLuokka risto "aliisa lassi" pena
aiheuttaa Java-ohjelman JokuLuokka alkuun tilanteen, jossa pätee:
args[0].equals("risto") == true args[1].equals("aliisa lassi") == true args[2].equals("pena") == true
Ja edelleen, jos argumentissa on oltava sisällössä merkki " niin se pitää koodata \" -- jos pitää olla ' niin se pitää koodata \' ja samoin tietyt shellin erityismerkit. Puhutaan "escape sequencesta", olisiko IT-suomeksi "eskeippimerkki", jolla "paetaan" yhden merkin ajaksi normaaleista tulkintasäännöistä.
Tämä on sama periaate kuin useissa ohjelmointikielissä esim. rivinvaihdon tai tabulaattorimerkin koodaus vakiomerkkijonossa (rivinvaihto \n, tabulaattori \t).
Ohjelman ns. "valitsimet" (options) ovat Unix-maailmassa usein argumentteja, joiden muoto on -v tai --verbose eli niissä on tavuviiva ja kirjain tai vaihtoehtoisesti kaksi tavuviivaa ja kuvaavampi sana. Yksikirjaimisia argumentteja saa useimmiten yhdistää peräkkäin, esim. -xvzf paitsi jos ne edellyttävät että seuraava argumentti on esim. tiedostonimi, tyyliin -o outputfilename. Argumenttien käsittely on täysin ohjelmasta riippuvaa, ja ohjelman käyttöohjeisiin täytyy tutustua ennen kuin lähtee sitä käyttämään.
(Windows-maailmassa usein valitsimet ovat yksikirjaimisia ja alkavat kauttaviivalla.)
"Interaktiivinen shell" tarkoittaa tätä, että editoit aina yhden komennon kerrallaan interaktiivisesti. Toinen tapa käyttää shelliä on skriptit, joissa shell suorittaa peräkkäin ohjelmaksi kirjoitettuja komentoja. Puhutaan shell-ohjelmoinnista tai skriptien tekemisestä. Shell voidaankin siinä mielessä ajatella tulkattavaksi ohjelmointiympäristöksi, vaikka se on ohjelmointimielessä hiukan köykäinen oikeisiin ohjelmointikieliin verrattuna.
Komenna:
man ls
Tämä näyttää apuohjelman ls manuaalin eli käyttöohjeen. Perusasetuksilla manuaali näyttää pitkän tekstinsä käyttämällä less-ohjelmaa, johon tutustuit edellisessä kohdassa. Muistanet, että tekstiä voi selata ylös ja alas nuolinäppäimillä, ja less-ohjelmasta pääsee pois painamalla Q-näppäintä. Kokeile.
Ohjelman ls man-sivun eli käyttöohjeen alku sisältää tällaista:
NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... DESCRIPTION List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort. Mandatory arguments to long options are mandatory for short options too. -a, --all do not hide entries starting with . -A, --almost-all do not list implied . and .. --author with -l, print the author of each file ...
Ja tällaisiapa man-ohjeet yleensä ovat. Niissä kerrotaan ohjelman nimi ja tarkoitus (NAME). Sitten kerrotaan tapa, jolla ohjelmaa saa komentaa (SYNOPSIS); eli komennon jälkeen voi yleensä antaa tietyssä järjestyksessä tietynlaisia argumentteja, joista osa voi olla pakollisia ja osa ei-pakollisia. Ei-pakolliset on kirjoitettu hakasulkeisiin. Tässä tapauksessa komennon perään voi laittaa tarkentimia, OPTION, jotka ovat siis vapaaehtoisia, koska [OPTION] on hakasulkeissa. Tarkentimien jälkeen voi olla tiedoston tai hakemiston nimi FILE, joka siis sekin on vapaaehtoinen. Molempia voi olla monta. Näiden jälkeen kuvaus (DESCRIPTION) kertoo tarkemmin, mitä ohjelma tekee. Ja sitten alkaa tarkentimien kuvaus. Yleensä ohjelmilla on mahdollisia tarkentimia aika paljon, riippuen kuinka monipuoliseen käyttöön ohjelma on tarkoitettu.
Selaa huvikseen pari man-sivua, esim. käyttöohjeet edellä kokeilluista komennoista:
man pwd man finger
Vielä enemmän tietoa Jalavaan asennetuista ohjelmista tarjoaa GNU -ohjelmistoissa yleisesti käytetty info-järjestelmä. Kokeile:
info info
Info opastaa nyt infon käyttämistä. Info on itse asiassa interaktiivinen, tekstimuotoinen hypertekstijärjestelmä, jonka sisältöihin voi vaikka tutustua myöhemmin omalla ajalla. Info-lukijan oma intro saadaan päälle painamalla H (siis iso H; info-ohjelmassa pieni h tekee jotakin muuta). Ja tästähän se opas alkaisi:
1.2 How to use Info =================== You are talking to the program Info, for reading documentation.
Monet tekstimuotoiset Unix-sovellukset ovat varsin hyvin dokumentoituja ja käyttäjäystävällisiä -- se ystävällisyys pitää vain hahmottaa "kovan pinnan" alta, joka ainakin aluksi saattaa syntyä siitä tekstimuotoisuudesta ...
Melkein kaikesta on joko man-sivu tai info-dokumentaatio. Lisäksi hyvän komentoriviohjelman tunnistaa mm. siitä, että sitä voi komentaa esim. näin:
ls --help
Silloin ohjelma itse tulostaa pienen perusavustuksen.
Komennetaan vielä vaaroihin tottuaksemme tiedoston poistokomennolle seuraavasti:
rm --help
Ole tarkkana, ettet vahingossa anna tälle komennolle minkään sellaisen tiedoston nimeä, jota et halua hukata. Ylläolevassa komennossa ei ole tiedoston nimeä vaan valitsin, jolla pyydetään ohjetta. Huomaa muuten, että tiedoston poistamisväline rm ilmoittaa avustuksessa: "Note that ... it is usually possible to recover the contents". Tämä tarkoittaa, että jos vieraan valtion agentti varastaa kovalevyn riittävän pian tiedoston poiston jälkeen, niin tietyin keinoin on mahdollista palauttaa ainakin osia tiedostosta. Tietoturvamielessä kannattaisi kirjoittaa ensin arkaluontoisen datan päälle jotain merkityksetöntä tauhkaa, jotta magneettipinta unohtaa historiansa. Tämän tekisi tiedoston silpomisväline shred. Arvatenkin silppurin manuaali kertoo lisää yksityiskohtia.
Kiteytetään vielä kerran:
Tiettyyn Unix-koneeseen asennetut, suoritettavissa olevat, ohjelmat voidaan listata jotakuinkin näillä komennoilla:
ls /bin/ ls /usr/bin/ ls /usr/local/binErityisesti järjestelmän ylläpitoon liittyvät ohjelmat voidaan listata näin:
ls /sbin/Jokaisesta ohjelmasta saa tietoja paikan päällä komentamalla jompikumpi:
man ohjelmannimi ohjelmannimi --help # tai -h tai -? ...(Lisäksi tietenkin Internetistä ja painetuista manuaaleista löytyy ohjeita ja tutoriaaleja pilvin pimein)
Komenna:
cd /
Mikäs nyt on työhakemisto? Komenna:
ls
Näyttääkö jotakuinkin tältä:
adminhome boot ... autohome ... automail ...
Kyseessä on Linux-koneen juurihakemisto, jonka alla kaikki on. Näillä hakemistoilla on useimmissa unix/linux -asennuksissa nämä samat nimet, ja niillä kullakin on erityismerkitys. Hakemistot /bin ja /usr/bin tulivatkin tutuiksi aiemmin. Esimerkkejä muista hakemistoista: /sbin sisältää järjestelmänhallintaan liittyviä ohjelmia, joita pääkäyttäjä eli "root" voi hyödyntää interaktiivisesti sekä ylläpitoskriptien osana. /lib ja /usr/lib sisältävät aliohjelmakirjastoja, joita voidaan linkittää ohjelmiin. /lib64 ja /usr/lib64 sisältävät kirjastojen aidosti 64-bittiset versiot (sattuneista syistä nykyisissä 64-bittisissä koneissa ajetaan sekä 32- että 64-bittisiä ohjelmia ja kirjastoja). /home on yleensä se, missä kotihakemistot eli käyttäjien omat tiedostot sijaitsevat. Yliopistolla on niin paljon porukkaa, että (levyjärjestelmä on ylipäätään aika massivinen ja sen lisäksi) kotipäähakemistoja on monta, eli näyttää olevan nashome1, nashome2 ja nashome3. Hakemistossa /boot on käyttöjärjestelmäytimen käännetty konekielikoodi, joka käynnistyksen yhteydessä ladataan. /var sisältää mm. lokitietoja järjestelmän toiminnasta. /etc sisältää eri ohjelmien asetuksia. /tmp sisältää ohjelmien väliaikaisia tiedostoja. Eksoottisempia hakemistoja ovat /proc ja /dev. Ensiksi mainitussa on ajonaikaisten ohjelmien (eli prosessien; tämä termi tulee vahvaan rooliin kurssin edetessä) tietoja ja jälkimmäisen kautta pääsee käsiksi laitteisiin. Unixissa (ja sen "perillisessä" Linuxissa) tiedostojärjestelmän kautta hallitaan muutakin kuin tiedostoja! Tai siis kaikki asiat näyttäytyvät tiedostoina tiedostojärjestelmän ja hakemistorakenteen kautta.
Unixin hakemistorakenne juuresta alkaen on tässä mielessä looginen ja selkeä. Fyysisten kovalevyjen eri tiedostojärjestelmät, verkkolevyt ja jopa ohjelmat ja laitteetkin löytyvät nätisti omilta paikoiltaan - kaikki saman juurihakemiston / alta.
Löydätkö kotiin? Eli muistatko ulkoa kotihakemistosi nimen, jos nyt pitäisi mennä esim. niinku meikäläinen:
cd nashome3 cd nieminen
Ei hätää, jos et muista. Komenna:
cd
Kokeile esim. pwd-ohjelmalla, että olet taas kotihakemistossasi. cd -komento ilman argumentteja siirtää kotihakemistoon.
Itse asiassa cd ilman parametreja on sama kuin komento:
cd $HOME
missä $HOME on ns. ympäristömuuttuja (environment variable). Mutta ympäristömuuttujista tulee lisää asiaa varmaan jossain myöhemmässä vaiheessa kurssia.
Tehdään verkkolevyllesi hakemisto Käyttöjärjestelmät-kurssin ensimmäistä demoa varten. Saat valita minkä tahansa hakemistonimen; esimerkissä on kj14 koska mun mielestä se on ihan kiva nimi hakemistolle, jossa on tämän kurssin asioita. Ääkkösiä ja erikoismerkkejä kannattanee vielä tänäkin päivänä välttää tiedostonimissä, koska niiden koodauksen standardit ovat laahanneet hiukan perässä järjestelmien välillä, ja maailmalla on käytössä laitteita, joiden tiedostojärjestelmät ovat peräisin vuosikymmenten takaa. Välilyöntejä saa olla, mutta niiden kanssa on oltava hiukan tarkkana, koska tosiaan mm. shell-komennoissa välilyönti ilman erityiskoodausta tulkitaan erotinmerkiksi.
Komenna:
mkdir kj14
Sitten mene juuri luotuun hakemistoon:
cd kj14
Jos haluat varmistua hakemiston vaihtumisesta, voit käyttää taas pwd-ohjelmaa...
Komenna seuraavasti:
mkdir demo{1,2,3,4}
Tarkista tulema komentamalla:
ls
Mitä tapahtui? Interaktiivisissa shelleissä on tiettyjä tehokäyttöominaisuuksia. Yksi esimerkki on tämä, jossa komentoriville kirjoitettu teksti jotakin{muuta,puuta,juu} korvautuu ennen komennon suorittamista yhdistelmällä jotakinmuuta jotakinpuuta jotakinjuu. Kun tästä tulee refleksi, muuttuu aika monen asian tekeminen nopeammaksi.
Kokeile:
echo {aa,bee}{1,2,3}{X,Y}
Jännää, eikö. Jätetään "asia hautumaan" ja siirrytään seuraavaan.
Eri shellit toimivat monella tapaa erilaisesti, mutta jotkut asiat ovat yhteisiä monille niistä. Ainakin seuraavien ominaisuuksien pitäisi toimia ainakin sekä bash että tcsh -shelleissä. Vastaavaa on käytettävissä kaikissa järkevissä shelleissä, mutta mm. näppäinyhdistelmät voivat olla ihan erilaisia.
Pitkien rimpsujen kirjoittaminen on hidasta (verrattuna esim. klikkaamiseen hiirellä), mutta näppäimistön käyttö sinänsä on nopeata, jos näppäinpainallusten määrää saadaan rajoitettua.
Kokeilepa seuraavaa:
- Paina nuolta ylöspäin ja katso mitä tapahtui! (Saat edellisen komennon, jonka voit antaa uudelleen ihan vaan painamalla enteriä). Komennon toistaminen vaatii siis vain kaksi näppäinpainallusta.
- Painelepa nuolta ylöspäin useampia kertoja. Saat aina edellisen ja edellisen komennon.
- Nuoli alaspäin selaa tietysti toiseen suuntaan.
Tämän nimi on komentohistoria ja se on kätevä juttu. Jos haluat uudelleen komennon, jonka teit pari askelta sitten, se löytyy muutamalla painalluksella. Sitten katsotaan rivin editointia:
Selaa historiasta tuo äskeinen komento:
echo {aa,bee}{1,2,3}{X,Y}Nuolilla vasemmalle ja oikealle voit siirtää kursoria komentorivillä vanhan komennon päälle. Muuta se seuraavanlaiseksi siten, että vaihdat ainoastaan X-kirjaimen Z-kirjaimeksi:
echo {aa,bee}{1,2,3}{Z,Y}Suorita.
Suorita vielä komentohistoriaa käyttämällä nämä vähän eri komennot:
echo {aa,bee}{1,2,3}{W,Y} echo {aa,bee}{1,2,3}{kuu,Y} echo {aa,bee}{1..15}{kuu,Y}Katsotaanpa lisää näppäinpainallusten välttämistä. Ota historiasta vielä tuo edellinen, melko pitkä, komentorivi editoitavaksi. Kokeile näppäimiä Ctrl-A ja Ctrl-E. Rivin alkuun ja loppuun hyppiminen on nopeaa!
Komentorivin editointi on tehty nykyisissä shelleissä monella tapaa tehokkaaksi. Tässä vielä yksi tapa:
Kirjoita tyhjän rivin alkuun less /u ja paina sen jälkeen tabulaattoria eli sarkainnäppäintä. Huomannet, että shell osaa tutkia hakemistorakennetta ja täydentää sinne hakemiston tai tiedoston nimen aina siihen asti kuin se on yksikäsitteinen. Tässä tapauksessa komentorivilläsi pitäisi olla edellisten kahdeksan näppäilyn jälkeen teksti less /usr/ Jatka kirjoittamalla perään i eli less /usr/i ja paina taas tabulaattoria. Nyt rivillä on less /usr/include/. Näppäile mat ja vielä kerran tabulaattori. Rivillä on nyt komento:
less /usr/include/math.hKun tästä tulee refleksi, on tiedostojen löytäminen erittäin syvistäkin hakemistorakenteista helppoa ja nopeaa interaktiivisen shellin avulla.
Voit myös suorittaa tuon viimeisimmän komennon, jos haluat: Less-ohjelmallahan voi selata tekstitiedostoja nuolinäppäimillä interaktiivisesti. Ja näppäin Q lopettaa sen. (Edellä paikannetussa tiedostossa on C-kielen matematiikkakirjaston rajapintaa, mm. Piin likiarvon ja muiden vakioiden määrittelyjä; ei liity asiaan sinänsä).
Kokeile seuraavia perusesimerkkejä Unixin ideologiasta "paljon pieniä ohjelmia, jotka tekevät yhden asian hyvin ja joita voi yhdistellä monimutkaisempien ongelmien ratkaisemiseksi". Niissä käytetään aiemmin less-ohjelman yhteydessä nähtyä putkittamista. Aloitetaan vaikkapa komentamalla:
who | sort
Who-ohjelman tuloste menee sortille, joka lajittelee rivit aakkosjärjestykseen. Kokeile sitten seuraavaa:
who | cut -c-8 | sort | uniq
Who-ohjelman tuloste menee tässä cutille, joka leikkaa kahdeksannen merkin kohdalta aina rivin poikki; sitten leikatut rivit menevät cutilta sortille ja lopulta ohjelmalle uniq joka jättää peräkkäisistä samoista riveistä vain yhden jäljelle. Lopputuloksena on aakkosjärjestyksessä kaikki käyttäjät vain yhteen kertaan listattuna, vaikka heillä olisi useita rinnakkaisia pääteistuntoja auki. Vielä yksi:
who | cut -c-8 | sort | uniq | wc -l
Tässä vielä uniq-ohjelman tulos putkitetaan wc:lle, joka laskee rivien määrän (tosiaan viimeinen merkki komennossa on ällä eikä ykkönen). Lopputuloksena on shell-komento, joka laskee konetta tällä hetkellä käyttävien henkilöiden määrän.
Huom 1: Pitkät putkitukset ohjelmalta toiselle ovat tuhlailevaisia, koska jokainen ohjelma on käynnissä yhtäaikaa. Jokainen niistä vaatii käyttöjärjestelmän resursseja, joiden rajallisuuteen tällä kurssilla tutustutaan piakkoin. Putkia on kuitenkin periaatteessa mahdollista tehdä, ja yllä olevat olivat esimerkkejä siitä, miten ne toimivat. Ne ovat käteviä, mutta ylenmääräistä putkittamista on hyvä pyrkiä välttämään oikeissa shell-skripteissä.
Huom 2: Putki on synkronoitu tuottaja-kuluttaja -toteutus, jonka Unix-järjestelmä tarjoaa palveluna. Tähänkin syvennytään kurssilla myöhemmin. Ohjelmissa nähdään standardi syöttövirta ja standardi tulostusvirta. Mistä putki tulee sisään tai mihin se vie ulostulosta, on määrättävissä ulkopuolelta, esim. shellin komentoriviltä.
Putkien käytön lisäksi on hyötyä tietää, miten shell-komennoissa pääsee käsiksi tiedostoihin. Varmistu ensin, että olet äsken tekemässäsi demo1 -hakemistossa, jos olet tehnyt välillä kokeiluja. Toisin sanoen komenna pwd ja varmista että tuloste näyttää jotakuinkin tältä (tietysti oman kotihakemistosi alla):
/nashome3/nieminen/kj14/demo1
Kokeile ensin grep-ohjelman toimintaa (ja tuo tiedostonimi config... löytyy tietysti nopsaan tabulaattorin avulla, kirjoittamalla siitä vain alku):
grep TIME /boot/config-2.6.32-431.5.1.el6.x86_64
Näin komennettu grep etsi toisena argumenttina annetusta linux-ytimen konfigurointitiedostosta kaikki rivit, joilla esiintyy ensimmäisenä argumenttina annettu merkkijono "TIME". Grep on todella hyödyllinen väline isojen tekstimassojen selaamiseen.
Komenna:
grep TIME /boot/config-2.6.32-431.5.1.el6.x86_64 > timet.txt
Mitään ei tulostunut näytölle. Syy on se, että väkäsellä > pyysit ohjaamaan grep -ohjelman tulosteen tiedostoon, jonka nimi on timet.txt. VARO VAARAA taas: Väkäsellä ohjattaessa kohdetiedoston mahdollinen aiempi sisältö tuhoutuu ja se korvataan uudella. Totea että tiedosto timet.txt on syntynyt. Komenna:
ls -l
Näet mm. jokaisen tiedoston viimeisen muutosajankohdan ja pituuden tavuina. Totea tiedoston sisältö:
cat timet.txt
Ohjelma cat tosiaan tulostaa argumenttina annetun tiedoston. Putkia voi yhdistää ja lopputuloksen voi sijoittaa tiedostoon. Kokeile ja havainnoi:
cat timet.txt | grep HPET > hpetit.txt cat hpetit.txt grep TIME /boot/config-2.6.32-431.5.1.el6.x86_64 | grep SND > soundit.txt cat soundit.txt
Huomaa, että grep -ohjelma osaa toimia joko standardisyöttövirrasta tai lukemalla argumenttina annetun tiedoston.
Väkäsellä ohjaus siis korvaa tiedoston aiemman sisällön. Tiedoston peräänkin voidaan kyllä jatkaa; silloin pitää käyttää kahta väkästä peräkkäin >> eli kokeile vaikkapa seuraavaa; havainnoi tulokset:
echo "Pari tiedostoa nipussa:" > nippu.txt echo "-------------" >> nippu.txt cat hpetit.txt >> nippu.txt echo "-------------" >> nippu.txt cat soundit.txt >> nippu.txt
Tiedostosta voidaan myös lukea syöte ohjelman standardisyöttövirtaan; silloin käytetään väkästä toisin päin eli <. Kokeile:
less < nippu.txt wc -l < nippu.txt
Luettu syöte voi aloittaa putkiketjun:
sort < nippu.txt | uniq | wc -l
Silloin se kirjoitetaan ensimmäisen ohjelman perään, ja ensimmäinen putkimerkki on tämän kokonaisuuden jälkeen.
Komenna:
echo Oletko `whoami` vai kuka
Eli shell suorittaa "backtick" -merkkien välissä olevan komennon ensin ja sijoittaa sen antaman tulosteen komentoriviin, joka sitten suoritetaan. Tämä on usein hyödyllinen kikka skripteissä - toimii tietysti lähinnä ohjelmille, jotka tulostavat vain vähän. Komento echo olikin varmaan jo aiemmasta kohdasta tuttu.
Huomaa, että "backtickien" välissä voi olla täydellinen shell-komento, jossa voi siis olla vaikkapa putkitus:
echo Paikalla on `who | cut -c-8 | sort | uniq | wc -l` kayttajaa
Näitä voi olla komennossa monta, kuten seuraavassa esimerkissä. Se ei mahdu yhdelle riville paperitulostetta, joten siinä käytetään tyypillistä rivinjatkomenettelyä kenoviivalla: voit näppäillä enterin välittömästi kenoviivan \ jälkeen kertoaksesi shellille, että aiot jatkaa vielä komentoa seuraavalle riville, tai sitten voit jättää kenoviivat pois ja laittaa koko komennon samalle riville. Mieluiten tietysti otat komentohistoriasta edellisen rivin ja muokkaat siitä vain alkupuolen uusiksi:
echo `whoami` laski `date` \ `who | cut -c-8 | sort | uniq | wc -l` kayttajaa
Ja niin edelleen. Tällaisia tietovirtojen ohjauksia voi tehdä shellissä. Etköhän jo osaa yhdistellä niitä ihan hyvin.
Jos et vielä arvannut, niin paljastan suuren salaisuuden:
man tcsh man bash
Ja niin edelleen (ksh, zsh). Shellien manuaalit ovat pitkiä (koska ohjelmissa on paljon ominaisuuksia selitettävänä) ja aluksi ehkä hiukan vaikealukuisia (koska ne on tehty hyödyttämään tehokäyttäjää tehokkaalla tavalla). Ne kertovat kaikki kikat, joita kullakin shellillä voi käyttää, sekä myös kyseisen shellin skriptiohjelmoinnin mahdollisuudet. Tällä kurssilla käytämme jatkossa yksinomaan bashia.
Shelleistä on myös määrättömän paljon hyviä johdantoja Internetissä. Niistä osa on kirjoitettu myös vasta-alkajille -- eli ei muuta kuin hakukone käyttöön, jos asia alkaa kiinnostaa enemmän.
Tästä demosta täytyy olla palautettuna Optima-järjestelmän palautuskansioon tasan yksi tiedosto nimeltään "vastaus.txt", joka on luotu seuraavalla tavoin:
Tee aiemmin luotuun demohakemistoosi demo1 tiedosto nimeltä vastaus.txt, jossa on sisältönä whoami -ohjelmalla tulostamasi käyttäjänimi. Sovella tietysti aiemmin nähtyä tiedostoon ohjaamismenettelyä - älä edes yritä kirjoittaa tiedostoa tekstieditorilla, koska tulosteesta ei välttämättä tule täysin oikeanlainen (mm. unix-rivinvaihto on eri kuin Windowsissa, editori saattaa laittaa alkuun tiettyjä Unicodeen liittyviä erikoismerkkejä, ja editorilla tulee myös liian helposti ylimääräisiä välilyöntejä tmv.)!
Jatka tiedostoa niin, että seuraavalle riville tulee komennon date tuloste.
Jatka tiedostoa edelleen komennon uname -a tulosteella
Jatka tiedostoa edelleen komennon ps -f tulosteella
Laita loppuun vielä komentoyhdistelmän finger -m `whoami` tuloste.
Tarkista, että tiedoston sisältö näyttää pääpiirteissään seuraavan esimerkin kaltaiselta (ajankohdat, tunnukset ja numerot tietysti ovat yksilölliset ja kolmen pisteen ... kohdalla on tavaraa):
nieminen ma 31.3.2014 16.56.00 +0300 Linux jalava.cc.jyu.fi 2.6.32-431.5.1.el6.x86_64 #1 SMP Fri Jan... UID PID PPID C STIME TTY TIME CMD nieminen 11363 13428 0 Mar18 pts/111 00:00:01 /bin/bash nieminen 13544 11363 0 16:56 pts/111 00:00:00 ps -f Login: nieminen Name: Paavo Nieminen Directory: /nashome3/nieminen Shell: /bin/bash Office: 0405768507 On since ke maalis 26 12:46 (EET) on pts/12 from kool2.it.jyu.fi 50 minutes 16 seconds idle ... No plan.
Palauta syntynyt tiedosto kurssin Optima-työtilaan demo1:n palautuskansioon.
Suorakäyttökoneissa (jalava, halava, charra) tehdyt tiedostot sijaitsevat yliopiston verkkolevyllä (Windowsin "U-asema"), joten mikroluokissa toimittaessa tiedostojen palauttaminen Optima-järjestelmään onnistuu suoraan U-asemalta. Kotoa käsin toimittaessa tiedostot pitää saada tavalla tai toisella oman koneen nettiselaimen löytyville. Yksi mahdollisuus on verkkolevyn käyttö VPN-yhteyden avulla; IT-paveluiden ohjeita löytyy täältä: https://www.jyu.fi/itp/ohjeet/tutoriaalit/vpn-windows/vpn-kaytto
Toinen mahdollisuus on kopioida tiedostot omalle koneelle ssh-yhteyden yli. Tähän tarvitaan jokin ssh-protokollaa tukeva tiedostonsiirto-ohjelma. Seuraavassa on pikaohje WinSCP-ohjelmaa ( http://winscp.net ) käyttäen. Lataamisen pitäisi onnistua kuvatuilla asetuksilla myös muilla FTP-ohjelmilla. Myöhemmät (vapaaehtoiset) demot, jotka tehdään kurssin omalla testipalvelimella, edellyttävät tiedostojen kopiointia, koska kyseinen palvelin ei turvallisuussyistä ole kytketty yliopiston verkkolevyyn.
Käynnistä WinSCP.
Tarkista ja täydennä Kirjautuminen-ikkunassa tarvittavat asetukset, jotka ovat:
- tiedostoprotokolla SFTP,
- palvelin jalava.cc.jyu.fi,
- portti 22, sekä
- käyttäjätunnus ja salasana, kuten muutenkin jalavaan kirjauduttaessa.
Avaa istunto napauttamalla Kirjaudu-painiketta.
Napauta tarvittaessa Autentikointi-ikkunassa Jatka-painiketta.
Jos istunto avautui onnistuneesti, näet avautuneessa ikkunassa oman työasemasi hakemistorakenteen vasemmalla ja palvelimella olevan kotihakemistosi oikealla.
Tämä lyhyt osuus tarjoaa katsauksen yhteen helppoon tekstieditoriohjelmaan, joka ainakin Linuxeista usein löytyy. Lisäksi saadaan yksi käyttäjän näkökulma prosessinhallinnan käsitteeseen, joka on keskeisimpiä, kun puhutaan nykyaikaisista käyttöjärjestelmistä. Tämä on suositeltava pikkuhomma tehdä, jos turhautumiskynnyksesi ei ole ylittynyt tähänastisissa tehtävissä.
Komenna:
nano
Käynnistit juuri tekstieditorin nimeltä GNU nano. Sitä on aika helppo käyttää, mutta se ei ole kovin monipuolinen. Jatkossa, kun demoissa hiukan editoidaan ohjelmia ym., voi käyttää esim. nanoa.
Kirjoita jotain.
Näppäile M-z eli jos yhteysohjelmassasi toimii Alt, niin se on Alt-Z tai jos ei toimi, niin paina ensin ESC ja sitten Z. Pitäisi saada näkymään alalaidassa teksti "Suspend enabled".
Näppäile Ctrl-Z
Mitä tapahtui? Olet taas shellissä. Komenna:
ps
Näet, että nano-ohjelma on yhä päällä, mutta se on pysäytetty (suspended). Voit antaa komentoja shellissä ja käyttää muita ohjelmia. Pysäyttämäsi nano pysyy taustalla siinä tilassa, jossa sen pysäytit. Tämä siis on sitä käyttäjän näkökulmaa prosessinhallintaan, jonka teoriaa luennoilla aletaan käydä läpi toisella kurssiviikolla.
Komenna:
fg
Nyt viimeisin pysäytetty ohjelma tuli taas "etualalle" eli "foreground". Nano on aika itsensäselittävä ohjelma. Sen voi lopettaa kokonaan näppäilemällä Ctrl-X. Tämä kuten muut näppäinkomennot näkyvät jatkuvasti Nano-ikkunan alalaidassa muodossa ^X.
Kun olet saanut asiasi hoidettua etäyhteydellä, voit komentaa shell-ohjelman lopettamaan itsensä komennolla:
exit
Shellin suoritus loppuu, ja palvelin havaitsee tämän ja sulkee pääteyhteyden. Olet poistunut järjestelmästä; tervemenoa takaisin milloin vain :).