Skip to content

Työväline tehtävät viikko 3: Linux etäyhteydet & shell skriptit

Joni Salmi edited this page Sep 9, 2015 · 7 revisions

TVT-ajokortti

Tutustu TVT-ajokortti -sivuun ja tarkista vähintäänki seuraavat tenttipäivät. Tehtäviä kannattaa alkaa tehdä heti, jotta kokeen voi suorittaa mahdollisimman nopeasti.

Viikko 3

Jos teet tehtäviä kotikoneella TAI IHAN MUUTENKIN, kannattaa taas pitää tehtäväpäiväkirjaa, johon kirjaat lopulliset komennot & kommentit. Tehtävät voi mahdollisesti tarkastaa päiväkirjasta, niin ei tarvii

  • raahata kotikonetta kouluun
  • yrittää keksiä komentoja uudestaan laitoksen koneilla.

Tehtävissä opastetaan jatkuvasti katsomaan man-sivua, esim. man rsync. Tällöin kannattanee käyttää ekalla viikolla tehtävässä [alias] luomaasi manh-aliasta, niin pääset lukemaan man-sivua internetselaimella: manh rsync.

[hupnet-eduroam]

Kannettavan tietokoneen saa laitoksella ja muualla yliopiston tiloissa langattomaan internet-verkkoon (wlan). Helppo vaihtoehto on vanha HUPnet, mutta suositeltava jo salasanan jatkuvan kyselyn välttämiseksi on uudempi Eduroam.

Seuraa ohjeita ja conffaa Eduroam jollekin laitteellesi

Ohjeita löytyy myös fuksiwikistä.

[ssh-users]

Tehtävässä [ssh] otettiin yhteys laitoksen etäpalvelimelle shell.cs.helsinki.fi.

Ota ssh-yhteys laitoksen koneelle users.cs.helsinki.fi.

Komenna ls -l. Lue myös kirjautumisviestissä linkitetty ohjetiedosto.

Yllättäen users-koneen kotihakemisto ei ole sama kuin kaikilla muilla laitoksen palvelimilla (kuten shell/melkinpaasi). users on tarkoitettu www-palvelujen pyörittämiseen, ja sitä käytetään viimeistään kurssilla Tietokantasovellus.

Ps. on myös UKKO-klusteri.

[scp]

Siirrä (siis kopioi) tiedosto (tai hakemisto) komentorivitse paikalliselta koneelta palvelimelle. Tämä tehdään komennolla scp, tai Windowsissa Puttyn mukana tuleva pscp.exe.

(Windowsissa komentoriville pääsee käynnistämällä ohjelma "Komentokehoite"/"Command Prompt", mutta joudut itse soveltamaan ja huomattavasti helpommalla pääset kun et käytä Windowsia komentorivitehtävissä.)

Komento: scp lähdetiedosto [email protected]:kohdehakemisto (muista korvata tiedosto, hakemisto ja tunnus omillasi)

Kohdehakemiston voi jättää tyhjäksi, mutta kaksoispiste tarvitaan (se merkkaa scp:lle, että kyseessä on etäpalvelin, ei paikallisen koneen hakemisto). Ks. myös man scp, mitä hyödylliset -p ja -r optiot tekevät. Tai manh scp, toivottavasti ekalla viikolla luomasi alias toimii yhä!

[scp-2]

Kopioi jokin tiedosto palvelimelta. Kaksi esimerkkiä:

scp [email protected]:lähdetiedosto kohdehakemisto

scp -pr [email protected]:lähdehakemisto kohdehakemisto

Nyt sekä lähde että kohde on annettava. Nykyiseen hakemistoon voit kopioida antamalla kohdehakemistoksi . (piste).

[scp-graafinen]

Oikeasti on usein helpompaa käyttää graafista scp-käyttöliittymää:

Ohjelmien kysymä protokolla on sftp.

Asenna jokin näistä (riippuen käyttöjärjestelmästäsi) ja ota yhteys laitokselle (shell.cs.helsinki.fi).

Jos teet tehtävää laitoksen Ubuntulla, on kaksi vaihtoehtoa:

  • Tiedostoselaimessa (esim. se kansion kuva vasemmalla navigaatiossa laitoksen koneella) valitse File -> Connect to server
  • Suorita tehtävä Windowsilla, esim. etäwindowsilla.

[ssh-verkkolevy]

Graafista scp:tä vieläkin kätevämpi on ssh-verkkolevy: laitoksen kotihakemistosi näkyy koneella kuin se olisi ulkoinen (hidas) kovalevy!

  • Ubuntu 14.04

    • avaa tiedostoselain (Home folder); File > Connect to server.
  • Ubuntu 12.04

    • avaa tiedostoselain (Home Folder); File > Connect to Server.
      • Server: "shell.cs.helsinki.fi"
      • Type: "SSH"
      • Folder: "/cs/fs/home/tunnus" (korvaa tunnus omallasi)

Verkkolevy pamahtaa ruudulle ja lisäksi löytyy tiedostoselaimen vasemmasta reunasta "Network" alta.

Klikkaa oikealla napilla ja "Add Bookmark", niin löytyy jatkossa ilman yllä olevien tietojen syöttämistä.

OS X: MacFusion tai ExpanDrive.

Windows: Dokan (ei testattu) tai ExpanDrive.

[ssh-avaimet]

Nyt kun oot käyttänyt ssh:ta ja kavereita, alkaa jo ärsyttää laitoksen salasanan syöttäminen jatkuvasti. Niin ärsyttää muitakin, ja ratkaisu on julkinen+salainen avainpari.

Luo paikallisen tietokoneen ~/.ssh -hakemistoon julkinen ja salainen avainpari komennolla ssh-keygen. Kopioi julkinen avain csfs hakemistoon ~/.ssh. Seuraa vaikka laitoksen opasta (kohta ssh-autentikointi) (tai man ssh).

(Reipas ja tietoturvallinen opiskelija käyttää vipuja -t RSA ja -b 4096. Bonus: miksi?)

Testaa: ssh [email protected].

HUOM: Sinun on pakko antaa ssh-avaimelle salasana, se sanotaan laitoksen käyttöehdoissa. KOSKA TIETOTURVA!

Kun annat passphrasen, voi tuntua vähän tyhmältä: nyt sen sijaan, että ssh-palvelin kysyy sinulta laitoksen salasanaa, ssh kysyykin ssh-avaimen passphrasea, jonka kaiken lisäksi tulisi olla eri kuin laitoksen salasana. Mutta: ongelman ratkaisee ssh-agent, joka pitää passphrasen muistissaan niin kauan, kunnes käynnistät koneen uudestaan. Oppaista löytyy (komento ssh-add lisää ssh-avaimen muistiin). Tämä on suositeltava menettely. Bonuksena OS X:ssä keychain hoitaa kaiken automaattisesti.

[ssh-config]

Elämä helpottuu edelleen: lisää shell.cs.helsinki.fi ssh:n config-tiedostoon. Ohjeet internetissä (heti alussa "peruskäyttö") tai man ssh_config.

Testaa: ssh laitos (tai minkä nimen annoitkaan) pitäisi toimia, edelleen kysymättä salasanaa (paitsi aluksi kerran)!

[ssh-x11]

Itse asiassa ssh ei ole pelkästään komentorivi, vaan sen kautta voidaan välittää myös graafinen X11-ympäristö! Toimii suorilta Ubuntussa ja OS X:ssä, kunhan asennat siihen X11:n (OS X:n asennuslevyltä tai uudemman XQuartzin). Windowsiin pitää asentaa rankempi X11-palvelin, tätäkään ei olla testattu.

Komenna: ssh -Y laitos (tai ssh -Y [email protected] jos et tehnyt edellisiä tehtäviä)

Kokeile käynnistää mikä tahansa graafinen ohjelma, esim. chromium-browser.

Älä kokeile seuraavaa Ubuntussa. Voit myös käynnistää täyden Unity-työpöydän ylä- ja sivupalkkeineen: gnome-session. Hullua? Kuulemma tämä kaataa ainakin miniläppärin Ubuntun, joten omalla vastuulla! Sen sijaan OS X:ssä toimii ja voi olla hyödyllistäkin, jos satunnaisesti tarvitset rampaa Ubuntua.

[rsync]

Kopioi ohjelmalla rsync jokin n. 1–10 megatavun kokoinen tiedosto (esim. digikameran alkuperäinen kuvatiedosto tai yksi mp3-tiedosto) palvelimen kotihakemistoosi.

Kun saat kopioinnin onnistumaan, suorita sama komento uudestaan ja katso onko nopeampi! Rsync ei oletuksena onnistuessaan tulosta mitään näytölle. Siksi alla --progress, kokeile myös -v.

  1. rsync --progress isohko_tiedosto laitos:
  2. rsync --progress isohko_tiedosto laitos:

Eli siirrä SAMA tiedosto uudestaan! Kumpi oli nopeampi? Lisäksi: rsync osaa tehtävässä [ssh-config] konffaamasi laitos-aliaksen!

Rsync on vakiona myös OS X:ssä, Windowsille sen saa helpohkosti internetistä.

Rsync toimii kuin aiemmin käytetty scp, joka kopioi tiedostoja ssh:n yli. Rsync ei kuitenkaan kopioi, vaan synkronoi: se ei kopioi muuttumattomia tiedostoja uudestaan, ja muuttuneista se kopioi ainoastaan muuttuneet kohdat. Tämä säästää rutkasti aikaa ja internet-kaistaa, ja on varmuuskopiointiin täydellinen (komentorivi)työkalu. Rsync on ihan mielettömän mainio!

[rsync-hakemisto]

Kopioi rsyncilla hakemisto (esim. ~/Documents) palvelimelle hakemistoon ~/bakup. Hakemiston kopiointi tapahtuu antamalla rsyncille käytännössä aina käytettävä parametri -a. Ks. man rsync tai paras löytämäni tutoriaali vuodelta 2004.

Tavoite on, että ~/Documents on palvelimella hakemisto ~/bakup/Documents, ei niin että ~/Documents -hakemiston sisältö on palvelimella hakemistossa ~/bakup!

Huom. rsync toimii eri tavoin riippuen, laitatko lähdehakemiston perään kauttamerkin "/". Yleensä et halua laittaa kauttamerkkiä, jolloin kopioidaan hakemisto, ei sen sisältöä.

[chmod-redux]

Tarkistetaan & kerrataan että cs-kotihakemistossasi on järkevät oikeudet.

  1. Avaa pääte. Siirry hakemistoon "public_html". Komenna ls -la. Kiinnostavia ovat:

    • "." (viittaa nykyiseen hakemistoon eli "public_html")
    • ".." (viittaa yhtä hakemistotasoa ylöspäin, eli kotihakemistosi juureen)
    • public_html -hakemiston sisältämät tiedostot (kuten index.html)
  2. Tässä hyvät (turvalliset) oikeudet:

    drwx--x--x 122 kayttaja tkol     12288 Aug 31 18:00 .
    
    drwx--x--x 100 kayttaja tkol      4096 Sep 14 12:32 ..
    
    -rw-r--r--   1 kayttaja tkol      3091 Dec 28  2013 index.html
    
  3. Ks. ls -la komennon tulkintaohje (ensimmäiset neljä kappaletta).

  4. Ks. mihin ryhmään itse kuulut: komenna "id". uid on käyttäjätunnuksesi, gid oletusryhmäsi. Pääaineopiskelijoilla se on tkol (lyhenne laitoksen vanhasta nimestä "tietojenkäsittelyopin laitos"), sivuaineopiskelijoilla oman laitoksen lyhenne.

  5. Pohdi seuraavia.

    1. Jos hakemistolla on lukuoikeus (r) ryhmällä (g) tai muilla (o), muut opiskelijat pääsevät halutessaan katsomaan, mitä tiedostoja on tarjolla.
    2. Jos lisäksi tiedostoilla on lukuoikeus ryhmällä/muilla, pääsevät muut katsomaan myös itse tiedostot.
    3. Oletuksena uusiin tiedostoihin tulee lukuoikeudet kaikille. Muut eivät silti näe tiedostoja, jos tiedostot sisältävällä hakemistolla ei ole kulkuoikeutta (x) ryhmällä/muilla.
    4. Laitoksen www-palvelin (Apache) kuuluu ryhmään muut (o). Jotta www-palvelin pääsee käsiksi public_html -hakemistoosi, on koko sen hakemistopolulle (/cs/fs/home/skaipiai/public_html) annettava kulkuoikeus (x) muille (o). Tämä tehtiin tehtävässä [public_html].
    5. Lisäksi public_html sisältämille tiedostoille on annettava lukuoikeus (r) muille (o). Oikeudet voi saman tien antaa symmetrisesti kaikille (a) eli (ugo), niin kuin ne oletuksena tulevatkin.
    6. Jos public_html -hakemistolla on lukuoikeus vain sinulla, kukaan muu (mukaanlukien www-palvelin) ei näe hakemiston tiedostolistausta. Kuitenkin tiedostot, joilla on lukuoikeuksia, näkyy jos arvaa/tietää tiedostonimen. Esim. aiemmin käytetty http://www.cs.helsinki.fi/u/skaipiai/windows.svg näkyy internetiin & kaikille, vaikka public_html -hakemistoni tiedostolistaus ei näy.
    7. Mahdollinen index.html hakemistossa public_html (tai sen alihakemistoissa) estää kyseisen hakemiston tiedostolistauksen näkymisen julkiseen internetiin, mutta muut opiskelijat näkevät silti tiedostolistauksen laitoksen tiedostojärjestelmän kautta jos hakemistolla on lukuoikeus muilla kuin sinulla.

Tehtävä. Laita hakemistoille oikeudet niin, että muut eivät pääse urkkimaan niitä ellet erityisesti halua. Tarkista myös cs-kotihakemistossasi olevien hakemistojen (kuten Documents, Pictures, Downloads …) oikeudet.

Erityisesti cs-kotihakemistosi juurella (~) ei kuulu olla luku/kirjoitusoikeutta muilla kuin sinulla.

Shell-skriptit

No nyt! Kaikki aiemmat tehtävät ovat johtaneet sinut tähän hetkeen. Tehtävät eivät ole vaikeita, ja pajassa autetaan. Jos tehtävät silti ovat vaikeita, muista että kaikkia tehtäviä ei tarvitse tehdä päästäkseen kurssia läpi.

Jos teet tehtäviä laitoksella niin tee seuraavat tehtävät jollakin laitoksen palvelimista.

Materiaalia

man komento (joskus help komento), lisämatskua info komento.

Ohjeita

Jos teet tehtäviä laitoksella niin tee seuraavat tehtävät jollakin laitoksen palvelimista.

Script==skripti==shell-skripti==komentojono==komento==ohjelma==suoritettava tiedosto.

Kaikki tehtävät tehdään päätteessä (komentorivillä), mutta voit toki muokata tuotettavia tiedostoja haluamassasi tekstieditorissa. Ne ovat kaikki ihan tavallisia tekstitiedostoja. Tehtävät voit tehdä ainakin a) laitoksen koneilla, b) oman kotikoneen ubuntulla, ja/tai c) ssh:n yli laitoksen palvelimilla.

Kaikille skripteille (suoritettaville tiedostoille) tarvitsee suoritusoikeudet (chmod +x). Skriptit suoritetaan komentamalla samassa hakemistossa (kuin skriptitiedosto on):

./skriptitiedosto [parametrit]

Tehtävän [bash-scripts] jälkeen (~/scripts -hakemistoon laittamiesi) skriptien pitäisi toimia kaikissa hakemistoissa, komentamalla skriptin_nimi [parametrit].

Esimerkkitehtävä & kolme ratkaisua

Tee komento file-size, joka tulostaa parametriksi annettujen tiedostojen yhteiskoon (tavuina). Esim: ./file-size file-size palauttaa itse file-size-skriptin tiedostokoon. ./file-size * palauttaa kaikkien hakemistossa olevien tiedostojen tiedostokokojen summan. Mikä lasketaan hakemistojen kooksi?

# Vaihtoehto 1: for+wc+awk (laskee hakemistojen kooksi 0)

for f in "$@"; do

   s=$(wc -c "$f" 2> /dev/null | awk '{ print $1 }')

   sum=$((sum+s))

done

echo for+wc+awk: $sum

# Vaihtoehto 2: ls+awk+bc (laskee hakemistojen kooksi niiden inoden tms. koon)

echo -n "ls+awk+bc: "

(ls -ld "$@" | awk 'ORS="+" { print $5 }' ; echo 0) | bc

# Vaihtoehto 3: du+tail+cut (laskee hakemistojen koon rekursiivisesti sisällön mukaan)

echo -n "du+tail+cut: "

du -bc "$@" | tail -1 | cut -f 1

Voit kokeilla esimerkkiä tallentamalla yllä olevat sisennetyt 14 riviä (#-kommentteineen) kotihakemistoosi tiedostoksi file-size, antamalla sille suoritusoikeuden (chmod +x file-size) ja komentamalla päätteessä ./file-size file-size tai ./file-size * (suoritus kestää hetken).

Itse tehtävät ovat helpompia kuin tämä esimerkkitehtävä oli!

[bash-kaiku]

Jos teet tehtäviä laitoksella niin tee seuraavat tehtävät jollakin laitoksen palvelimista.

Tee shell-skripti kaiku, joka tulostaa ruudulle kaikki sille annetut parametrit. Näin:

tunnus@melkinkari:~$ ./kaiku tänään menee just hyvin

tänään menee just hyvin

Tallenna kotihakemistoosi nimellä kaiku, anna tiedostolle suoritusoikeus ja kokeile.

HUOM: parametrien määrä voi olla mikä vaan, pitää toimia monella tai vähällä.

[bash-scripts]

Jos teet tehtäviä laitoksella niin tee seuraavat tehtävät jollakin laitoksen palvelimista.

Luo kotihakemistoosi hakemisto scripts ja siirrä kaiku-skripti (tiedosto) sinne.

Lisää scripts-hakemisto pathiin. Eli: lisää kotihakemistosi .bashrc -tiedostoon seuraava rivi:

export PATH=$PATH:~/scripts

Sulje nykyinen pääte ja avaa uusi. Jatkossa teet kaikki skriptisi scripts-hakemistoon, jolloin ne toimivat päätteessä aina (kaikissa hakemistoissa) ja ilman ./ alkua. Kokeile:

tunnus@melkinkari:~$ kaiku menee vaan yhä paremmin\!

menee vaan yhä paremmin!

Huom. laitoksen palvelimilla .profile tiedostossasi tulee olla rivi

. "$HOME/.bashrc"

[bash-wget-images]

Jos teet tehtäviä laitoksella niin tee seuraavat tehtävät jollakin laitoksen palvelimista.

Tee shell-skripti wget-images, joka komennolla wget hakee antamastasi www-osoitteesta kaikki kuvat (eli ainakin jpg- ja png-tiedostot) nykyiseen hakemistoon.

Tallenna edellisessä tehtävässä luomaasi scripts-hakemistoon nimellä wget-images ja anna suoritusoikeus.

Kokeile skriptin toimintaa vaikka kahden kuvan kevätlumigallerialla. Komenna:

wget-images www.cs.helsinki.fi/u/skaipiai/kevätlumi/

Nykyiseen hakemistoon pitäisi tulla tiedostot etu.jpg ja sivu.jpg, muttei muita (paitsi enintään robots.txt) eikä varsinkaan yhtään alihakemistoa.

Ps. siinä vaiheessa kun skriptisi alkaa hakea loputtomasti tiedostoja mun internetistä, voit tappaa sen perinteisellä näppäinyhdistelmällä ctrl + c. Tässä vaiheessa skriptistä puuttuu todennäköisesti enää parametri, joka estää siirtymästä emohakemistoon (parent).

Näistä kahdesta ensimmäisestä shell-skriptistä olisi yhtä hyvin voinut tehdä aliaksen, koska 1) ne ovat lyhyitä (yhden rivin pituisia) ja 2) niiden muuttujat (käyttäjän/sinun antamat parametrit esim. $@) tulee komennon loppuun. Sen sijaan seuraavassa tehtävässä muuttujat tulevat komentojen ja parametrien väliin (vieläpä kahteen kertaan), jolloin alias ei enää käy.

[bash-manpdf]

Jos teet tehtäviä laitoksella niin tee seuraavat tehtävät jollakin laitoksen palvelimista.

Tee skripti manpdf, joka tekee annetusta mistä tahansa man-sivusta pdf-tiedoston. Esim. "man bash" → bash.pdf:

man -t bash | ps2pdf - bash.pdf

Tallenna scripts-hakemistoon, anna suoritusoikeus ja testaa esimerkiksi komennolla manpdf cat.

[cron]

Jos teet tehtäviä laitoksella niin tee seuraavat tehtävät users.cs.helsinki.fi palvelimella.

Tässä tehtävässä tehdään oma cron. Cron-tauluun voidaan laittaa ohjelmia ajautumaan säännöllisesti! Lue ensin tehtävänanto ja huomautukset ennen kuin lähdet tekemään.

Komennot! Cron-taulua voi muokata komennolla crontab -e, mutta se on vaarallinen: e ja r ovat näppäimistöllä vierekkäin, ja crontab -r tyhjentää cron-taulusi (ei undoa)!

Lokitiedosto: Tee cronia varten skripti, joka lisää aikaleiman [eli päivämäärä ja kellonaika] ja tekstin “Cron ajettu” tiedoston loppuun, esim. ~/bakup.log.

Suosittelemme tekemään näin: luo oma crontab-tiedosto, esim. "~/kron.tab". Lisää sinne rivi, joka suorittaa toimivaksi testatun Lokitiedosto -komennon kerran 30 minuutissa. Ota se käyttöön komennolla crontab ~/kron.tab. Jos ei tulostu mitään, meni läpi! Ks. cron-tiedoston käyttöhjeet internetistä. Nykyisen cron-taulun näkee komennolla crontab -l.

HUOM. Cron-taulut ovat konekohtaisia. Jos teet tehtävää omalla koneella, kaikki on hyvin. Mutta laitoksen koneella huomio, että cron-taulu asennetaan sille koneelle jolle olet kirjautunut (esim. dhp-56). Jos vaihdat konetta, cron-taulu on taas tyhjä ja lisäksi aiempi cron-taulu jää päälle edelliselle koneelle. Kannattaa operoida cronia koneella users.cs.helsinki.fi.

[cron-delete]

Jos teet tehtäviä laitoksella niin tee seuraavat tehtävät users.cs.helsinki.fi palvelimella.

Ohjaajan läsnäollessa poista käytöstä höpsö kerran 30 minuutissa tiedostoon kirjoittava cronisi. Jos haluat tehdä omaan käyttöön croneja, voit tehdä ne myöhemmin.

[bash-thumb]

Jos teet tehtäviä laitoksella niin tee seuraavat tehtävät jollakin laitoksen palvelimista.

Tee kuvankäsittelyskripti thumb, joka tekee parametriksi annetuista kuvatiedostoista eri-kuvakokoiset versiot ImageMagickin convert-komennolla.

OBS. Tämä on huomattavasti haastavampi kuin aiemmat skriptit.

Lopullisen thumb-komennon esimerkkisuoritus (hakemistossa, johon hait kuvia tekemälläsi wget-images -skriptillä):

$ ls
etu.jpg  sivu.jpg

$ thumb 600x *.jpg

$ ls -l
-rw-r--r--   1 samuli  staff  462321  4 Tou 10:17 etu.jpg
-rw-r--r--   1 samuli  staff  409224  4 Tou 10:25 sivu.jpg
-rw-r--r--   1 samuli  staff  147815  2 Lok 23:23 etu-600x.jpg
-rw-r--r--   1 samuli  staff  117912  2 Lok 23:23 sivu-600x.jpg

$ identify *.jpg
etu.jpg JPEG 1200x800 1200x800+0+0 8-bit DirectClass 451KiB …
sivu.jpg JPEG 1200x800 1200x800+0+0 8-bit DirectClass 400KiB …
etu-600x.jpg JPEG 600x400 600x400+0+0 8-bit DirectClass 143KiB …
sivu-600x.jpg JPEG 600x400 600x400+0+0 8-bit DirectClass 115KiB ...

Ei hätää, ImageMagick hoitaa kaiken puolestasi, sinun tarvitsee vain käsitellä tiedostonimiä!

Skripti ON PARASTA tehdä osissa. Ensimmäinen versio osaa vain yhden tiedoston kerrallaan, toinen versio monta, kolmas versio siirtää "600x" tms merkinnän tiedostonimen loppuun niin että aakkosjärjestys säilyy oikeana, neljäs versio tallentaa uudet kuvatiedostot aina nykyiseen hakemistoon, ei siihen jossa alkuperäiset kuvatiedostot ovat (ImageMagickin oletus).

Skriptin on toteutettava vähintään kaksi (2) näistä neljästä (4) ominaisuudesta. Ominaisuudet voi toteuttaa myös muussa järjestyksessä kuin alla ehdotetussa.

  • thumb 300x megatron.jpg → 300x-megatron.jpg
  • thumb 300x *.jpg → {300x-megaman.jpg, 300x-megatron.jpg}
  • thumb 300x *.jpg → {megaman-300x.jpg, megatron-300x.jpg}
  • thumb 300x orig/*.jpg → {./megaman-300x.jpg, ./megatron-300x.jpg}

Vinkkejä ja valmiita vastauksia.

  • Jos omalla koneellasi ei ole convert-komentoa, asenna ImageMagick: sudo apt-get install imagemagick.

  • Komento shift siirtää komentoriviparametreja vasemmalle: $1 katoaa, $2→$1, $3→$2, … ja edelleen $@ koostuu kaikista parametreista paitsi alkuperäisestä $1.

  • Convert ei osaa kovin ihmisystävällisesti käsitellä useita lähde- ja kohdetiedostoja yhtä aikaa, joten kannattaa tehdä oma for-looppi, jossa prosessoit kuvat yksittäin.

  • Seuraavista on hyötyä, kun rakennat kohdetiedoston nimeä:

    ext=${f##*.}
    base=$(basename $f .$ext)
    dir=$(dirname $f)
    
  • Kokeile, mitä muuttujat sisältävät. Lisää thumb-skriptiisi rivi:

    echo dir=$dir, base=$base, ext=$ext

    ja käynnistä skripti parametrinaan jokin (eri hakemistossa oleva) kuvatiedosto.

Myös tästä skriptistä on iloa tulevaisuudessa, esim. silloin kun lisäät HTML-sivuille pikkukuvia (joista linkki alkuperäiseen isoon kuvaan).

Kaipaatko lisää? Tervetuloa toisen periodin rankalle Linux Fundamentals -kurssille, joka on pelkkää BASH-skriptausta. Mut varo, siellä ollaan tosissaan!