Naredbe za koje (možda) niste znali 14: mktemp

Naredba mktemp nam može pomoći najviše kad se rabi u skriptama koje sistem inženjeri pišu kako bi automatizirali održavanje sustava i tako si olakšali posao. Naredba mktemp nema puno opcija, a zadatak joj je jednostavan, ali vrlo važan: kreirati privremenu datoteku, koju će teško biti predvidjeti. Zašto je ovo bitno?

Zamislimo sljedeću situaciju. Vaša skripta mora kreirati privremenu datoteku u /tmp direktoriju, a izvršava se (primjerice) iz crona i pod ovlastima root korisnika. Ime datoteke je /tmp/poruka.txt.

Znajući ove činjenice, napadač (koji nema nikakvih povišenih privilegija!) može napraviti ovo:

$ ln -s /etc/passwd poruka.txt
$ ls -l poruka.txt
lrwxrwxrwx 1 baduser users 6 Mar 29 11:17 poruka.txt -> /etc/passwd

Dakle, napravio je simbolički link "poruka.txt", koji pokazuje na ključnu datoteku sustava, i u koju ne može ništa pisati niti brisati. Provjerimo:

debian# ls -l /etc/passwd /etc/passwd
-rw-r--r-- 1 root root 2856 Mar 13 10:08 /etc/passwd

Dakle, korisnik nema pravo pisanja u datoteku. Sada, kada se vaša skripta pokrene (pod ovlastima root korisnika), događaju se zanimljive stvari. Simulirat ćemo pokretanje skripte i sami zapisati nešto u datoteku /tmp/poruka.txt.

debian# echo "nema vise usera" > /tmp/poruka.txt
debian# ls -l /etc/passwd
-rw-r--r-- 1 root root 16 Mar 29 11:22 /etc/passwd
debian# cat /etc/passwd
nema vise usera
debian#

Dakle, uz određene preduvjete, bilo koji korisnik može efikasno omesti rad poslužitelja, a i počiniti znatnu štetu! Nemojte se tješiti dvojbenom činjenicom da "korisnik ne zna točno ime privremene datoteke" ili da "svoje skripte ne pokrećete kao root korisnik", nego jednostavno izbjegnite ovakvo nesigurno kreiranje datoteka.

Ovdje će vam pomoći naredba mktemp. Ona se najčešće pokreće ovako:

$mktemp /tmp/tmp-XXXXXXX
/tmp/tmp-IFujQHR
$ mktemp /tmp/tmp-XXXXXXX
/tmp/tmp-mMcKVHz

(pokrenuta je dvaput da se može vidjeti da je ime svaki put drugačije)

Naredba prima predložak po kojemu će generirati ime, što označavamo sa velikim slovom "X". Taj dio imena će biti slučajni dio, ali možete navesti i fiksni dio ("tmp-"). Mktemp će tom predlošku kreirati praznu datoteku, te ispisati njeno ime. Kako postoji (mala) šansa da već postoji takva datoteka, najčešća uporaba naredbe mktemp u skriptama je:

 TMPFILE=`mktemp /tmp/example.XXXXXXXXXX` || exit 1
echo "neki tekst" >> $TMPFILE

Dakle, u varijablu $TMPFILE stavljamo ime novostvorene datoteke, te u nju pomoću naredbe "echo" upisujemo koji god tekst želimo. S privremenom datotekom dalje možemo raditi što god nam je volja, ali nemojte je zaboraviti obrisati na kraju (želimo čist sustav, zar ne?).

Ukoliko vas zanima što predstavlja "|| exit 1", objasnit ćemo i to. U slučaju da iz nekog razloga naredba mktemp ne uspije kreirati datoteku, skripta će završiti izvršavanje uz izlazni kod (exit code) "1".

Na Unix i sličnim sustavima izlazni kôd uspješno obavljene operacije je uvijek "0", dok svi izlazni kodovi različiti od nule znače neuspjeh.

Nešto više o naredbi mktemp možete pročitati u njenoj man stranici, iako naredba ne podržava previše opcija.

Kuharice: 
Kategorije: 
Vote: 
5
Vaša ocjena: Nema Average: 5 (1 vote)