Sudo i aliasi

Naredbu sudo koristimo svi, ali većina to čini na najjednostavniji mogući način. I to je sasvim u redu, pokretati naredbe u privilegiranom načinu rada je za neke svrhe sasvim dovoljno. No, ukoliko ste pokušali ponešto više, mogli ste vidjeti da treba još ponešto naučiti. Konkretno, ne rade aliasi unutar sudo naredbe.

Primjer:

$ alias la="ls -al"
$ sudo la
[sudo] password for korisnik:
sudo: la: command not found

Ovo se događa zbog načina na koji se obrađuje naredba sudo. Procjenjuje se (evaluira) samo prva naredba radi li se o aliasu, ne i ostatak. Dakle, bash provjerava samo je li sudo alias, ne i je li "la" alias. Kako bi postigli to da bash procjenjuje i ostatak retka kao alias, upotrijebit ćemo mali trik:

$ alias sudo="sudo "

Dodali smo samo razmak na kraj naredbe sudo. Ovo, po manualu, znači da će ljuska (shell) pokušati protumačiti i ostatak naredbenog retka kao alias. Pogledajmo:

$ alias sudo="sudo "
$ sudo la
total 137540
drwxr-xr-x 43 korisnik korisnik 4096 Dec 31 14:16 .
drwxr-xr-x 12 root root 4096 Mar 9 2012 ..
-rw-r--r-- 1 korisnik korisnik 0 Jan 14 2003 .addressbook
...

Eto, sada rade aliasi preko naredbe sudo.

No, to nam nije dosta. U .bashrc datoteci u $HOME direktoriju root korisnika imali smo definiran alias:

# alias aa="apt-get -qq update && apt-get -y dist-upgrade"

Ovime smo htjeli pojednostaviti redovite nadogradnje samo s naredbom od dva slova. Kada smo u root shellu, ovo radi. No, sudo ne radi, čak i kad upotrijebimo ovaj trik:

$ sudo aa
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

Ovdje je riječ o pokretanju podljuske (subshella), te se zadnji dio očigledno na izvršava pod ovlastima root korisnika.

Možda se ovo može riješiti na neki drugi način, no nama se učinio najjednostavniji način napraviti skriptu "aa" koja će napraviti isto što i alias i smjestiti je negdje u naš $HOME direktorij:

$ cat $HOME/bin/aa
apt-get -qq update && apt-get -y dist-upgrade
$ sudo aa
[sudo] password for korisnik:
sudo: aa: command not found

Zašto bash odjednom ne prepoznaje naredbu "aa", kad se $HOME/bin nalazi u $PATH? Problem leži u činjenici da sudo "čisti" putanju s retkom u konfiguraciji:

Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

(ukoliko ovakav redak nemate, možda nećete ni imati ovaj problem)

Da bi stvar proradila, potrebno je dodati naš direktorij u "secure_path" (obavezno radite s naredbom "visudo"):

Defaults secure_path="/home/korisnik/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

(ekspanzija znaka "~" ne radi, morate navesti punu klasičnu putanju)

Nakon toga je sve u redu:

$ sudo aa
[sudo] password for korisnik:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Ovo možda nije najelegantnije rješenje, ali nama radi (TM).

 

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