<!doctype linuxdoc system>

<article>

<title>Linux-Tips-HOWTO
<author>Paul Anderson &lt;paul@geeky1.ebtech.net&gt;&nl;
prevedel Andrej Grauf &lt;andrej.grauf@club.win-ini.si&gt;
<date>v3.6, junij 1998, prevod 22. december 1998
<abstract>
Ta HOWTO sestavljajo namigi in nasveti, ki jih boste težko našli drugje,
Po njihovi zaslugi postane Linux prijaznejši.
</abstract>

<toc>

<sect>Uvod
<p>
Dobrodošli v Linux Tips-HOWTO, seznamu zanimivih zvijač in
   optimizacij, po zaslugi katerih postane Linux mnogo bolj zabaven. Spis sestavljajo samo nasveti
   iz moje glave in tisti iz prejšnjega spisa Tips-HOWTO (zakaj bi zavrgli 
   čisto spodobne nasvete?). Zato bom zelo vesel vaših najljubših namigov in 
   nasvetov, ki jih bom lahko uvrstil v naslednji Tips-HOWTO.

Paul Anderson, vzdrževalec Linux TIPS HOWTO

<htmlurl name="panderson@ebtech.net" url="mailto:panderson@ebtech.net">

<sect>Krajši nasveti
<p>
<sect1>Uporabna zvijača za Syslog
<p>
Uredite datoteko <tt>/etc/syslog.conf</tt> in vstavite naslednjo vrstico:
<tscreen><verb>
# Izpiši vse na tty8
                                *.*      /dev/tty8
</verb></tscreen>
Opozorilo: NE POZABITE UPORABITI TIPKE TAB! Syslog ne mara presledkov.

<sect1>Skript za ogled stisnjenih HOWTO
<p>
Začetnik začetniku. Tu je kratek skript, ki vam bo olajšal iskanje
in ogledovanje spisov howto. Moji HOWTO so v imeniku <tt>/usr/doc/faq/howto/</tt>
in so stisnjeni s programom <tt>gzip</tt>. Imena datotek so
<tt><em>XXX</em>-HOWTO.gz</tt>, pri čemer <tt><em>XXX</em></tt> predstavlja temo.
V imeniku <tt>/usr/local/sbin</tt> sem ustvaril naslednji
skript in ga poimenoval "<tt>howto</tt>":
<tscreen><verb>
#!/bin/sh
if [ "$1" = "" ]; then
    ls /usr/doc/faq/howto | less
else
    gunzip -c /usr/doc/faq/howto/$1-HOWTO.gz | less
fi
</verb></tscreen>
Kadar skript kličete brez argumenta, ta izpiše imenik s HOWTO, ki so
   na voljo, kadar pa vnesete prvi del imena datoteke (pred vezajem) kot
   argument, samodejno raztegne in izpiše spis (izvirnik pri tem ostane
   nespremenjen).

Če si želite ogledati spis Serial-HOWTO, vnesite:
<tscreen>
&dollar; howto Serial
</tscreen>

<sect1>Ali je dovolj prostora na disku?
<p>
V tem razdelku boste našli kratek skript, ki bo tu in tam 
   preveril, ali je še dovolj prostora na napravah, ki jih lahko
   izpišete z ukazom <tt>mount</tt> (diski, CD-ROM, disketa,)

Če zmanjkuje prostora, se na zaslonu vsakih <em>X</em> sekund izpiše sporočilo,
   o vsaki zapolnjeni napravi pa boste dobili tudi elektronsko
   sporočilo.
<tscreen><verb>
#!/bin/sh

#
# Id: check_hdspace,v 1.18 1996/12/11 22:33:29 root Exp root
#

#
# Ko so mi datoteke tmp zapolnile diske, sem začel prejemati skrivnostna
# sporočila o napakah. Zato sem spisal tale skript, ki me opozori, preden
# se diski zapolnijo.
#
# Če te vrstice obvarujejo vaš strežnik, preden se zruši,
# pošljite elektronsko sporočilo z zahvalami zocki@goldfish.cube.net.
# Obžalujem, če vam tale skript povzroča težave, ampak
# saj sem vas posvaril: brez pritožb, prosim.
# Če res obvladate delo s sed, mi, prosim, oprostite :)
#

#
# Poženi in pozabi: V rc.local vstavite 'check_hdspace &'.
# Preveri količino nezasedenega prostora na napravah vsakih $SLEEPTIME sekund.
# Preverite lahko tudi diskete in tračne enote. :)
# Če je nezasedenega prostora manj kakor $MINFREE (kb), bo sprožila opozorilo
# in poslala eno elektronsko sporočilo za vsako triggering napravo
# na $MAIL_TO_ME.
# Če je prostora več, kot je spodnja meja, podana z omejitvijo, pri
# kateri se sprožijo opozorila, se tudi opravilo elektronskega
# pošiljanja znova opremi.
#

# NALOGA: Različen $MINFREE za vsako napravo.
# Če zmanjka prostora na disku, iz imenikov /*tmp varno odstrani
# staro šaro.


DEVICES='/dev/sda2 /dev/sda8 /dev/sda9'    # naprava; tu navedite diske
# sproži opozorilo
SLEEPTIME=10                               # sec; mirovanje med preverjanjem
MAIL_TO_ME='root@localhost'               # fool; kdo prejme opozorilo


# ------ pod to vrstico ni treba vnašati sprememb (vsaj upam :) -------

MINMB=0
ISFREE=0
MAILED=""
let MINMB=$MINFREE/1024         # ja, mi smo dosledni :)

while [ 1 ]; do
   DF="`/bin/df`"
      for DEVICE in $DEVICES ; do
      ISFREE=`echo $DF | sed s#.\*$DEVICE" "\*[0-9]\*""\*[0-9]\*" "\*## | sed s#" ".\*##`

      if [ $ISFREE -le $MINFREE ] ; then
              let ISMB=$ISFREE/1024
              echo  "OPOZORILO: $DEVICE samo $ISMB mb prosto." &gt;&amp;2
              #echo "sem pridejo dodatne stvari" &gt;&amp;2
              echo -e "\a\a\a\a"

              if [ -z  "`echo $MAILED | grep -w $DEVICE`" ] ; then
	             echo "OPOZORILO: Na $DEVICE samo $ISMB mb prosto.      (Sprožilec je nastavljen na $MINMB mb)" \
                     | mail -s "OPOZORILO: Na $DEVICE le $ISMB mb prosto!" $MAIL_TO_ME
                     MAILEDH="$MAILED $DEVICE"
                     MAILED=$MAILEDH
                     # sem vstavite še druga opravila, npr. čiščenje
                     # imenikov */tmp...
              fi
              elif [ -n  "`echo $MAILED | grep -w $DEVICE`" ] ; then
                      # Če je dovolj prostora, skript odstrani
                      # oznako, da je bila elektronska pošta poslana.
                      # Pripravljeni smo za novo opravilo pošiljanja
                      # elektronske pošte.
                      MAILEDH="`echo $MAILED  | sed s#$DEVICE##`"
                      MAILED=$MAILEDH
              fi

      done
      sleep $SLEEPTIME

done
</verb></tscreen>

<sect1>Pripomoček za odstranjevanje dnevnikov
<p>
Če ste taki kakor jaz, imate seznam 430 naročnikov plus 100+
sporočil na dan prek UUCP. Torej, kaj naj heker naredi s temi
gromozanskimi dnevniki? Namesti naj <tt>chklogs</tt>. Avtor programa
<tt>chklogs</tt> je Emilio Grimaldo, <tt>grimaldo@panama.iaehv.nl</tt>,
trenutno različico 1.8, ki sama po sebi daje dovolj informacij o poteku
namestitve (seveda bi bilo dobro preveriti tudi informacije v imeniku
<tt>doc</tt>), pa najdete na
<url url="ftp://ftp.iaehv.nl/pub/users/grimaldo/chklogs-1.8.tar.gz">.
Ko boste program namestili, dodajte vnos <tt>crontab</tt> v naslednji obliki:
<tscreen><verb>
# Vsak dan ob 21:00 zaženi chklogs.
00 21 * * *       /usr/local/sbin/chklogs -m
</verb></tscreen>
Ko ste že pri tem, ne pozabite omeniti avtorju, kako uporaben program
je to :)

<sect1>Priročen skript za odstranjevanje odlagališč
<p>
Ustvarite datoteko z imenom <tt>rmcores</tt> (avtor jo imenuje
<tt>handle-cores</tt>) in naslednjo vsebino:
<tscreen><verb>
#!/bin/sh
USAGE="$0 <directory> <message-file>"

if [ $# != 2 ] ; then
         echo $USAGE
         exit
fi

  echo Brišem...
find $1 -name core -atime 7 -print -type f -exec rm {} \;

echo e-mailing
for name in `find $1 -name core -exec ls -l {} \; | cut -c16-24`
do
        echo $name
        cat $2 | mail $name
done
</verb></tscreen>
Naj jo opravilo <tt>cron</tt> zažene vsake toliko časa.

<sect1>Prenašanje imenikov iz enega datotečnega sistema v drugega
<p>
Hitri premik celotne drevesne strukture datotek z enega diska na
drugega
<tscreen><verb>
(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)
</verb></tscreen>
(Da bi se izognili izgubi imenikov, če bi se zgodila nesreča, se premaknite iz
<tt>cd /source/directory; tar</tt> itd. Hvala Jimu Dennisu,
<tt>jim@starshine.org</tt>, ki me je opozoril na to. -Vzdrževalec)

<sect1>Iskanje največjih imenikov
<p>
Ali vas je že kdaj zanimalo, kateri imeniki so v vašem računalniku
največji? To lahko ugotovite na naslednji način:
<tscreen><verb>
du -S | sort -n
</verb></tscreen>

<sect1>Glasilo za Linux
<p>
Zasluge ima John Fisk, avtor glasila za Linux. To je odličen e-zine
plus in še <bf>brezplačen</bf>! Kaj bi si še lahko želeli? Oglejte
si <url url="http://www.linuxgazette.com">.

MMG, izkaže se, da (1) glasilo za Linux (LG) zdaj izhaja enkrat na
mesec in (2) John Fisk ni več njegov urednik. Zdaj skrbi zanj
ekipa pri SSC.

<sect1>Kako dobiti popravek za program GNU make 3.70 in s tem preprečiti čudno vedenje VPATH
<p>
Ne vem, ali ima veliko ljudi podobne težave, vendar ima GNU <tt>make</tt>
 različice 3.70 "lastnost", ki mi ni všeč. Namreč to, da se <tt>VPATH</tt>
 čudno vede,
   če podaste absolutno pot do datoteke. Na voljo je zelo dober popravek, ki
   te težave odpravi. Dobite ga od Paula D. Smitha
   &lt;<tt>psmith@wellfleet.com</tt>&gt;. Po vsaki popravljeni izdaji
 programa GNU make
   ustrezne popravke in dokumentacijo tudi objavi v novičarski skupini
   "<tt>gnu.utils.lug</tt>". Ta popravek uporabim in spet prevedem
<tt>gmake</tt> v vsakem sistemu, do katerega imam dostop.

<sect1>Kako preprečiti preverjanje sistema s programom fsck ob vsakem zagonu računalnika?
<p>
V: Kako naj preprečim programu <tt>e2fsckm</tt>, da bi ob vsakem zagonu
  preverjal diske?

O: Ko znova zgradite jedro, je datotečni sistem označen kot
"umazan", torej bo vaš disk pregledan vsakič, ko boste zagnali
  računalnik. To preprečite, če zaženete:
<tscreen><verb>
rdev -R /zImage 1
</verb></tscreen>
S tem popravite jedro tako, da datotečnega sistema ne bo več
obravnaval kot umazanega.

Opozorilo: Če uporabljate lilo, naj bo nastavitev za Linux v
   nastavitveni datoteki za lilo (navadno je to <tt>/etc/lilo.conf</tt>)
   namenjena "samo za branje" (read-only).

<sect1>Kako se izogniti preverjanju zaradi "zasedenosti naprav"
<p>
Če pri zaustavitvi sistema pogosto dobite sporočilo o zasedenosti
   naprav, kar povzroči, da se ob vnovičnem zagonu izvede preverjanje
   datotečnega sistema, se lahko temu izognete takole:

V datoteko <tt>/etc/rc.d/init.d/halt</tt> ali <tt>/etc/rc.d/rc.0</tt>
pred izvedbo ukaza <tt>umount -a</tt> dodajte vrstico
<tscreen><verb>
mount -o remount,ro /mount.dir
</verb></tscreen>
za vsak priključen datotečni sistem, razen za <tt>/</tt>. To pomeni, da če se
   pri zaustavitvi zaradi določenih razlogov ne prekinejo vsi procesi in
   se ne izvede odklop diskov, bodo ti ob vnovičnem zagonu vseeno čisti. S
   tem med zagonom pridobim veliko časa.

<sect1>Kako poiskati največje datoteke na disku
<p>
<tscreen><verb>
ls -l | sort +4n
</verb></tscreen>
Tisti, ki ste zares na tesnem s prostorom, lahko uporabite tudi
naslednji način. Resda bo trajalo nekaj časa, a odlično deluje:
<tscreen><verb>
cd /
ls -lR | sort +4n
</verb></tscreen>

<sect1>Kako natisniti strani, da jih boste lahko pozneje preluknjali in vstavili v mapo
<p>
<tscreen><verb>
#!/bin/sh
# /usr/local/bin/print
# preprosta urejena oblika izpisa na list, da ga boste lahko
# preluknjali in vstavili v mapo.

cat $1 | pr -t -o 5 -w 85 | lpr
</verb></tscreen>

<sect1>Način za iskanje določenih regularnih izrazov v drevesnih strukturah datotek
<p>
Ta skript imenujem '<tt>forall</tt>' (za vse). Uporabite ga na naslednji
   način:
<tscreen><verb>
forall /usr/include grep -i ioctl
forall /usr/man grep ioctl
</verb></tscreen>
Pa še vsebina skripta <tt>forall</tt>:
<tscreen><verb>
#!/bin/sh
if [ 1 = `expr 2 \> $#` ]
then
      echo Usage: $0 dir cmd [optargs]
      exit 1
fi
dir=$1
shift
find $dir -type f -print | xargs "$@"
</verb></tscreen>

<sect1>Skripti za odstranjevanje varnostnih kopij datotek in samodejno shranjenih datotek, ki jih tvorijo nekateri programi
<p>
Tu je preprost dvovrstični skript, ki preišče ureditev imenika in
   odstrani <tt>emacs</tt>ove samodejno shranjene (<tt>#</tt>) datoteke,
varnostne kopije
   datotek (<tt>-</tt>), datoteke <tt>.o</tt> in datoteke <tt>.log</tt>,
 ki jih naredi TeX. Prav tako ga lahko uporabite za stiskanje datotek
 <tt>.tex</tt> in <tt>README</tt>. V svojem
   sistemu sem ga imenoval '<tt>squeeze</tt>' (stiskač).
<tscreen><verb>
#!/bin/sh
#SQUEEZE odstrani nepotrebne datoteke in stisne datoteke .tex in README
#Avtor Barry tolnas, tolnas@sun1.engr.utk.edu
#
echo squeezing $PWD
find  $PWD \( -name \*~ -or -name \*.o -or -name \*.log -or -name \*\#\) -exec rm -f {} \;
find $PWD \( -name \*.tex -or -name \*README\* -or -name \*readme\* \) -exec gzip -9 {} \;
</verb></tscreen>

<sect1>Kako ugotoviti, kateri proces zasede največ pomnilnika?
<p>
<tscreen><verb>
ps -aux | sort +4n
</verb></tscreen>
-ALI-
<tscreen><verb>
ps -aux | sort +5n
</verb></tscreen>

<sect1>Priprava programa vi na programiranje v programskem jeziku C
<p>
V prostem času veliko programiram v programskem jeziku C, zato sem
   pripravil program <tt>vi</tt>, tako da je primeren za programiranje v tem
   jeziku. Tu je moj <tt>.exrc</tt>:
<tscreen><verb>
set autoindent
set shiftwidth=4
set backspace=2
set ruler
</verb></tscreen>
Čemu rabijo te nastavitve? <tt>Autoindent</tt> povzroči, da <tt>vi</tt> avtomatsko
   poravna vsako vrstico glede na poravnavo prve vrstice, <tt>shiftwidth</tt>
   nastavi razdaljo <tt>^T</tt> na štiri presledke, <tt>backspace</tt> nastavi
 način backspace,
   <tt>ruler</tt> pa povzroči, da <tt>vi</tt> izpisuje število vrstic.
Če se želite pomakniti
   v določeno vrstico, npr. dvajseto, uporabite:
<tscreen><verb>
vi +20 myfile.c
</verb></tscreen>

<sect1>Uporaba ctags za poenostavitev programiranja
<p>
Večina hekerjev ima <tt>ctags</tt> že nameščen v svoj računalnik, vendar
   ga ne uporabljajo. Zelo uporaben je lahko pri urejanju določenih
   funkcij. Predpostavimo, da imate v eni izmed številnih izvirnih datotek v
   imeniku programa, ki ga pišete, neko funkcijo, ki bi jo radi
   posodobili. To funkcijo bomo poimenovali <tt>foo()</tt>. Prav tako ne veste,
   kje v izvirni datoteki je ta funkcija. V tem primeru vam lahko pomaga
   <tt>ctags</tt>. Ko ga zaženete, program v trenutnem imeniku ustvari datoteko z
   imenom <tt>tags</tt>, ki obsega seznam vseh funkcij, podatke, v katerih
   datotekah so te funkcije in kje so v datotekah said. Datoteka <tt>tags</tt>
   je videti nekako tako:
<tscreen><verb>
ActiveIconManager     iconmgr.c     /^void ActiveIconManager(active)$/
AddDefaultBindings    add_window.c  /^AddDefaultBindings ()$/
AddEndResize          resize.c      /^AddEndResize(tmp_win)$/
AddFuncButton         menus.c       /^Bool AddFuncButton (num, cont, mods, func, menu, item)$/
AddFuncKey            menus.c       /^Bool AddFuncKey (name, cont, mods, func, menu, win_name, action)$/
AddIconManager        iconmgr.c     /^WList *AddIconManager(tmp_win)$/
AddIconRegion         icons.c       /^AddIconRegion(geom, grav1, grav2, stepx, stepy)$/
AddStartResize        resize.c      /^AddStartResize(tmp_win, x, y, w, h)$/
AddToClientsList      workmgr.c     /^void AddToClientsList (workspace, client)$/
AddToList             list.c        /^AddToList(list_head, name, ptr)$/
</verb></tscreen>
Da bi uredili npr. funkcijo <tt>AddEndResize()</tt> v programu <tt>vim</tt>,
zaženite:
<tscreen><verb>
vim -t AddEndResize
</verb></tscreen>
S tem boste ustrezno datoteko odprli v urejevalniku, kazalec pa bo na
začetku funkcije.

<sect1>Zakaj se sendmail ob zagonu v distribuciji RedHat obesi za 5 minut?
<p>
To je precej pogosta težava, skoraj že FAQ. Ne vem, ali jo je RedHat
   odpravil v svoji distribuciji, lahko pa jo odpravite sami.
   Poglejte v datoteko <tt>/etc/hosts</tt> in ugotovili boste, da je videti
nekako tako:
<tscreen><verb>
127.0.0.1               localhost       vasaskatla
</verb></tscreen>
Ko se <tt>sendmail</tt> zažene, poišče ime gostitelja (v tem primeru vasaskatla).
   Potem ugotovi, da je IP za vasaskatla 127.0.0.1. <tt>Sendmail</tt> tega ne 
   mara, zato začne novo iskanje. To nadaljuje tako dolgo, dokler končno
   ne obupa in konča. To težavo je mogoče zelo enostavno odpraviti. Uredite 
   datoteko <tt>/etc/hosts</tt> in jo preoblikujte nekako tako:
<tscreen><verb>
127.0.0.1               localhost
10.56.142.1             vasaskatla
</verb></tscreen>

<sect1>Kako lahko preuredim distribucijo RedHat tako, da bom lahko uporabljal ukaz ls z barvami?
<p>
Distribucija RedHat ima barvni <tt>ls</tt>, ne vem pa, zakaj ne omogočijo uporabe
   barv kot privzete nastavitve. Težavo rešite tako:

Najprej vnesite <tt>eval 'DIRCOLORS'</tt>.

Nato <tt>alias ls='ls --color=auto'</tt>.

In vstavite <tt>'alias.....'</tt> v datoteko <tt>/etc/bashrc</tt>.

<sect1>Kako lahko ugotovim, v kateri knjižnici v /usr/lib je določena funkcija?
<p>
Kaj storiti, če prevajate neki program in pozabite vključiti
   potrebno knjižnico? Vsa poročila gcc so funkcijska imena.Tu je
   preprost ukaz, ki bo našel, kar iščete:
<tscreen><verb>
for i in *; do echo $i:;nm $i|grep tgetnum 2&gt;/dev/null;done
</verb></tscreen>
Kjer je <tt>tgetnum</tt> ime funkcije, ki jo iščete.

<sect1>Prevedel sem preizkusni programček v jeziku C, ko pa ga poženem, ne dobim nobenega rezultata!
<p>
Verjetno ste program prevedli v binarno datoteko z imenom <tt>test</tt>, mar
   ne? Linux ima program z imenom <tt>test</tt>, ki preveri, ali je določen
   pogoj izpolnjen, in rezultata nikoli ne izpiše na zaslon. Namesto vnosa
   <tt>test</tt> uporabite <tt>./test</tt>.


<sect>Podrobni nasveti
<p>
<sect1>Deljenje izmenjalnih particij med Linuxom in Windows
<p>
<enum>
 <item>Sformatirajte particijo kot particijo za DOS in na njej ustvarite
   izmenjalno datoteko za Windows, vendar operacijskega sistema Windows
   še ne zaženite (naj izmenjalna datoteka zaenkrat ostane prazna, da
   jo je mogoče dobro stisniti).
 <item>Znova zaženite računalnik v Linuxu in shranite particijo v
   datoteko. Npr. če je bila to particija <tt>/dev/hda8</tt>:
<tscreen><verb>
dd if=/dev/hda8 of=/etc/dosswap
</verb></tscreen>
 <item>Stisnite izmenjalno datoteko za DOS; ker je navidezno prazna, jo je
   mogoče zelo dobro stisniti:
<tscreen><verb>
gzip -9 /etc/dosswap
</verb></tscreen>
 <item>Da bi pripravili in namestili izmenjalno datoteko v Linuxu, dodajte
   v datoteko <tt>/etc/rc</tt> naslednje: <tt><em>XXXXX</em></tt> je
   število blokov v navidezni particiji
<tscreen><verb>
mkswap /dev/hda8 XXXXX
swapon -av
</verb></tscreen>
Preverite, ali ste v datoteko <tt>/etc/fstab</tt> dodali vnos
za izmenjalno particijo.
<p>
 <item>Če vaš osnovni/zagonski paket podpira <tt>/etc/brc</tt> ali
   <tt>/sbin/brc</tt>, v datoteko <tt>/etc/brc</tt> dodajte naslednje (drugače to opravite
   ročno, ko želite računalnik zagnati v DOS|OS/2 in poskušate
   izmenjalno particijo pretvoriti nazaj v različico za Dos/Windows):
<tscreen><verb>
swapoff -av
zcat /etc/dosswap.gz | dd of=/dev/hda8 bs=1k count=100
</verb></tscreen>
# Ne pozabite, da se tako zapiše nazaj na particijo samo prvih
sto blokov. Empirično sem ugotovil, da to zadošča.
</enum>
&gt;&gt;Kakšne so prednosti in pomanjkljivosti takega početja?

Prednost: prihranite precejšno količino prostora na disku.
   Pomanjkljivost: Če 5. korak ni avtomatiziran, boste morali to postoriti
   ročno. To bo upočasnilo vnovični zagon za nanosekundo :-)

<sect1>Obnavljanje zbrisanih datotek
<p>
Tu je zvijača, ki sem jo moral uporabiti že večkrat.

Obnovitev zbrisane tekstovne datoteke obupanega uporabnika.

Če po nesreči odstranite tekstovno datoteko, npr. neko elektronsko
   sporočilo ali rezultate nočne programerske seanse, ni nujno, da je vse
   izgubljeno. Če je datoteka bila na disku in na njem ostala več kot 30
   sekund, je njena vsebina morda še vedno na particiji diska.

Vsebino datoteke na particiji diska lahko poiščete z ukazom
   <tt>grep</tt>.

Na primer, pred kratkim sem zbrisal del elektronskega sporočila. Takoj
   sem prekinil vse operacije, ki bi particijo lahko spremenile: v tem
   primeru sem se samo izognil shranjevanju datotek, prevajanju itd. V
   drugih primerih sem moral sistem celo privesti na način enega samega
   uporabnika in odklopiti datotečni sistem.

Na particiji diska sem potem uporabil ukaz <tt>egrep</tt>: v mojem primeru je
bilo elektronsko sporočilo v imeniku <tt>/usr/local/hime/michael</tt>. Iz
izhoda ukaza <tt>df</tt> sem lahko ugotovil, da je ta na particiji
<tt>/dev/hdb5</tt>:
<tscreen><verb>
sputnik3:~ % df
Filesystem         1024-blocks  Used Available Capacity   Mounted on
/dev/hda3              18621    9759     7901     55%   /
/dev/hdb3             308852  258443    34458     88%   /usr
/dev/hdb5             466896  407062    35720     92%   /usr/local

sputnik3:~ % su
Password:
[root@sputnik3 michael]# egrep -50 'ftp.+COL' /dev/hdb5 &gt; /tmp/x
</verb></tscreen>
Kadar delam s particijami diska, sem zelo previden. Torej sem si privoščil
   kratek premor in pred potrditvijo preveril, ali res razumem pomen ukaza. V
   tem primeru je bila v elektronskem sporočilu beseda '<tt>ftp</tt>', ki ji je
   sledilo besedilo in na koncu še beseda '<tt>COL</tt>'. Sporočilo je bilo dolgo
   okrog 20 vrstic, torej sem uporabil 50, da bi dobil vse vrstice okrog
   izraza. Včasih sem uporabljal tudi 3000 in s tem zagotovil, da sem
   dobil nazaj vse vrstice izvirne kode. Rezultat sem iz ukaza <tt>egrep</tt>
   usmeril na drugo particijo diska in s tem preprečil, da bi se
   sporočilo, ki ga iščem, prepisalo.

Izhod sem preiskal z uporabo ukaza <tt>strings</tt>:
<tscreen><verb>
strings /tmp/x | less
</verb></tscreen>
in seveda našel elektronsko sporočilo.

Ta metoda ni zanesljiva. Morda je bilo nekaj prostora ali pa ves prostor
   na disku znova uporabljen.

Ta zvijača je verjetno uporabna samo v sistemih z enim uporabnikom.
   V sistemih z več uporabniki z visoko dejavnostjo diskov se je morda
   prostor na disku, ki ste ga sprostili, znova porabil. Prav tako
   večina izmed nas ne more kar tako preprečiti uporabe računalnika
   drugim uporabnikom, kadar želimo obnoviti neko datoteko.

V domačem sistemu me je ta zvijača v zadnjih nekaj letih rešila 
   približno trikrat, po navadi takrat, ko sem pomotoma zavrgel
   rezultate celodnevnega dela: če moje delo preživi do točke, ko
   me prevzame občutek, da sem dosegel pomemben napredek, to delo shranim na
   disketo in te zvijače sploh ne uporabljam pogosto.

<sect1>Kako uporabljati oznake za nespremenljivost
<p>
Uporabite oznako za nespremenljivost.
<p>
Takoj po tem, ko boste namestili in nastavili svoj sistem, preglejte
   datoteke <tt>/bin/sbin</tt>, <tt>/usr/bin</tt>, <tt>/usr/sbin</tt>,
 <tt>/usr/lib</tt> (in še nekatere
   druge običajne osumljence) in brez predsodkov uporabite ukaz
<tt>chattr +i</tt>. To vrstico dodajte tudi v datoteke jedra v korenskem
imeniku.
   Naredite nov imenik '<tt>mkdir /etc/.dist/</tt>' in prekopirajte vsebino
   imenika <tt>/etc</tt> (to naredim v dveh korakih z uporabo
<tt>/tmp/etcdist.tar</tt> in
   se s tem izognem podvajanju) v ta novi imenik. (Lahko bi tudi
   ustvarili imenik <tt>/etc/.dist.tar.gz</tt> -- in ga označili kot
 nespremenljivega).

Vzrok za vse to delo je zmanjšanje škode, ki bi jo lahko naredili,
kadar boste prijavljeni kot korenski uporabnik.  Tako ne boste mogli
prepisati datotek z napačnim preusmeritvenim operatorjem in s
presledkom v ukazu '<tt>rm -fr</tt>' (še vedno lahko naredite veliko
škodo, ampak vsaj vaše knjižnice in binarne datoteke bodo bolj
zaščitene).
<p>
S tem boste tudi onemogočili ali vsaj otežili uporabo številnih
varnostnih in preklicnih storitev (ker večina temelji na prepisovanju
datotek med izvajanjem programa SUID, ki <em>ne ponuja poljubnih
ukazov lupine</em>).
<p>
Edina neprijetnost bo nastala pri gradnji in izvajanju ukaza "<tt>make
install</tt>" na različnih vrstah sistemskih binarnih datotek. Po
drugi strani pa boste s tem preprečili, da bi '<tt>make install</tt>'
prepisal datoteke. Kadar pozabite prebrati <tt>Makefile</tt> in
<tt>chattr -i</tt>, datoteke, ki bodo prepisane (in imenike, katerim
želite datoteke dodati) -- in se ukaz <tt>make</tt> ne izvede, samo
uporabite ukaz <tt>chattr</tt> in ga znova zaženite. Izkoristite lahko
tudi priložnost in prestavite stare binarne datoteke, knjižnice ali
karkoli je že v imeniku <tt>.old/</tt>, jih preimenujete, stisnete ali
počnete z njimi, kar pač želite.

<sect1>Nasveti, kam dati nove stvari
<p>
Vse nove stvari se začnejo pod <tt>/usr/local</tt>! Ali v
<tt>/usr/local/'hostname'</tt>.
   Če je vaša distribucija ena tistih, ki pusti imenik <tt>/usr/local</tt>
 prazen,
   tvorite svoje imenike <tt>/usr/local/src</tt>, <tt>/usr/local/bin</tt>,
 itd. in jih
   uporabljajte. Če vaša distribucija v drevesno strukturo
   imenika <tt>/usr/local</tt> shrani stvari, boste verjetno uporabili ukaz '<tt>mkdir
   /usr/local/'hostname'</tt>' in mu podelili 'wheel' group <tt>+w</tt> (prav tako jih
   naredim SUID in SGID in s tem zagotovim, da lahko vsak član skupine
   wheel upravlja samo svoje datoteke in vse ustvarjene datoteke
   pripadajo skupini wheel).

Disciplinirajte se in nove pakete <em>vedno!, vedno!, vedno!</em> shranite v
   <tt>/usr/local/src/.from/$KJERKOLI_SEM_JIH_DOBIL/</tt> (za <tt>.tar</tt>
 oz. katerekoli
   datoteke) in jih zgradite v imeniku <tt>/usr/local/src</tt> (ali
   <tt>/$HOSTNAME/src</tt>). Preverite, ali se namesti pod lokalno
 ureditev.
   Če je paket <em>nujno treba</em> namestiti v <tt>/bin</tt>, <tt>/usr/bin</tt>
 ali kjerkoli
   drugje, podajte symlink od lokalne ureditve do vsakega posameznega
   elementa.

Vzrok za to -- čeprav je več dela -- je pomoč pri osamitvi tistih
   stvari, za katere je treba narediti varnostne kopije, jih obnoviti
   ali znova namestiti pri opravilu popolne vnovične namestitve z
   distribucijskega nosilca (navadno s plošče CD). Z uporabo imenika
   <tt>/usr/local/.from</tt> vzdržujete tudi dnevnik z informacijami, kje ste
   dobili izvirno kodo -- kar vam je v pomoč pri iskanju novih različic
   -- je pa nujno potreben, kadar nadzorujete sezname objav o
   varnosti.

Eden mojih domačih sistemov (s katerega kličem) je bil sestavljen,
   preden sem začel uporabljati tak sistem. Še vedno ne <em>poznam</em>
   vsega, po čemer se razlikuje od sistema, pripravljenega po namestitvi.
   To se mi dogaja, kljub temu da zelo malo delam s konfiguracijo
   domačega sistema in sem <em>edini</em>, ki ga uporablja.

V primerjavi s tem so vsi sistemi, ki sem jih nastavil v službi (ko so
   mi zaupali vlogo sistemskega upravitelja), nastavljeni tako
   -- in čeprav so jih upravljali različni ljudje in so bili velikokrat
   nadgrajeni, dobro vem, kateri elementi so bili dodani
   <em>naknadno</em>, po začetni namestitvi in nastavitvi.


<sect1>Kako spremeniti vse velike črke v imenih datotek v male črke
<p>
V razdelku 2c nasvetov 12. izdaje sem opazil kar nekaj prezahtevnih
ali nepotrebnih postopkov. Ker jih je več, vam jih pošiljam:
<tscreen><verb>
#!/bin/sh
# lowerit
# spremeni vse velike črke v imenih datotek v trenutnem imeniku v male črke
# uporabna samo za navadne datoteke -- ne spreminja imen imenikov
# preden prepiše datoteko, boste morali to potrditi
for x in `ls`
 do
 if &lsqb; ! -f $x &rsqb;; then
   continue
   fi
 lc=`echo $x  | tr '&lsqb;A-Z&rsqb;' '&lsqb;a-z&rsqb;'`
 if &lsqb; $lc != $x &rsqb;; then
   mv -i $x $lc
 fi
 done
</verb></tscreen>
Uh, to je pa dolg skript. Za izvajanje tega opravila jaz ne bi pisal
skripta. Namesto tega bi v ukazni vrstici uporabil ukaz:
<tscreen><verb>
for i in * ; do [ -f $i ] && mv -i $i `echo $i | tr '[A-Z]' '&lsqb;a-z&rsqb;'`; done;
</verb></tscreen>
Avtor pravi, da je skript zapisal v tej obliki zaradi večje
   razumljivosti (glej spodaj).

V naslednjem zgledu, o dodajanju in odstranjevanju
   uporabnikov, Geoff dela dokaj dobro, razen v zadnjem koraku. Vnovični
   zagon? Resno upam, da avtor računalnika ne zaganja znova vedno,
   kadar odstrani uporabnika. Opraviti morate samo prva dva koraka.
   Kakšne procese pa naj bi uporabnik sploh uporablja? Morda irc bot?
   Postopek ubijete z enostavnim ukazom
<tscreen><verb>
kill -9 `ps -aux |grep ^&lt;username&gt; |tr -s " " |cut -d " " -f2`
</verb></tscreen>
Zgled; uporabniško ime je foo
<tscreen><verb>
kill -9 `ps -aux |grep ^foo |tr -s " " |cut -d " " -f2`
</verb></tscreen>
S tem je delo opravljeno; gremo naprej k pozabljenemu korenskemu geslu.

Rešitev, ki je navedena v glasilu, je najbolj univerzalna, ne pa tudi
   najenostavnejša. Z LILO in loadlin lahko vsak poda zagonski parameter
   "single" in računalnik se neposredno zažene v privzeti lupini brez
   poziva za prijavo in geslo. V tem primeru lahko pred vnosom "init 3"
   za zagon večuporabniškega načina vsakdo spremeni ali zbriše katerokoli
   geslo. Število vnovičnih zagonov v tem primeru: 1, število
   vnovičnih zagonov v drugih primerih: 2

Justin Dossey

<sect1>Kako nadgraditi sendmail
<p>
Začeli bomo z neobdelano, čisto izvirno kodo. Najprej si priskrbite
   izvirno kodo Sendmaila. Zajel sem različico 8.9.0, kar pa je zelo
   zahtevno opravilo, kakor boste ugotovili. Kodo sem dobil na
   <url url="ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.9.0.tar.gz">.

Dolga je okrog 1 MB in glede na to, da uporabljam 8.7.6, mislim, da je
   vredna truda. Če bo to delovalo, boste nedvomno izvedeli, drugače ne
   bom mogel izdati nove različice HOWTO :)

Ko ste kodo prenesli, jo razpakirajte. V trenutnem imeniku bom
   ustvaril imenik z imenom <tt>sendmail-8.9.0</tt>. Premaknite se v ta imenik ter
   preberite datoteki <tt>README</tt> in <tt>RELESE_NOTES</tt> (presenečeni boste nad
   opravljenimi nadgraditvami). Premaknite se zdaj v <tt>src</tt>. V tem imeniku
   boste opravili večino dela.

Kratko sporočilo: Sendmail je kratek, zelo uporaben, dobro napisan
   program. Binarna datoteka se v računalniku 5x86 133 z 32 MB RAM
   prevede v manj kot 5 minutah! Celotno prevajanje in namestitev (brez
   nastavitev) traja manj kot 15 minut!

   Navadno v svojem sistemu ne zaganjam BIND, zato sem našel
   naslednje vrstice:
<tscreen><verb>
# ifndef NAMED_BIND
#  define NAMED_BIND    1     /* uporabi berkeleyjski internetni strežnik */
# endif
</verb></tscreen>
in spremenil 1 v 0:
<tscreen><verb>
# ifndef NAMED_BIND
#  define NAMED_BIND    0     /* uporabi berkeleyjski internetni strežnik */
# endif
</verb></tscreen>
Pri distribuciji Debian 1.3.1 se <tt>db.h</tt> glede na privzeto vrednost
   namesti v <tt>/usr/include/db</tt>, namesto v <tt>/usr/include</tt>, kjer jo <tt>sendmail</tt>
 poskuša najti. Pojdite v imenike <tt>src</tt>, <tt>mailstats</tt>,
<tt>makemap</tt>, <tt>praliases</tt> in <tt>smrsh</tt> in tam izvedite
 naslednji ukaz:
<tscreen><verb>
./Build -I/usr/include/db
</verb></tscreen>
Ko boste s tem gotovi, <tt>cd ..</tt> in vnesite <tt>make install</tt>.
 Tako! Program
   sendmail različice 8.9.0 naj bi bil zdaj nameščen! V tem primeru sem
   predpostavil, da ste prej že opravili izvirno nastavitev. Da bi v
   mojem sistemu vse potekalo gladko, saj gostim brezplačne poštne
   sezname za tiste, ki uporabljajo <tt>majordomo</tt>, sem moral na začetek
   datoteke <tt>/etc/sendmail.cf</tt> dodati:
<tscreen><verb>
O DontBlameSendmail=forwardfileinunsafedirpath, forwardfileinunsafedirpathsafe
</verb></tscreen>
Dandanes je <tt>sendmail</tt> zelo občutljiv za dovoljenja imenikov in datotek ter
   bo sporočal napake o imenikih in datotekah v privzetih imenih ali
   datotekah <tt>.forward</tt>, ki jih lahko spreminjajo skupine ali so prosto
   dostopne. Ker ni dobro odpraviti te občutljivosti, uporabljam v
   konzoli samo način enega uporabnika in se mi je zdelo, da je v redu tudi,
 če je na voljo ta mala razpoka v sistemu varnosti. YMMV

<sect1>Nekaj nasvetov za nove sistemske upravitelje
<p>
Ustvarite in vzdržujte <tt>/README.'hostname'</tt> in/ali
   <tt>/etc/README.'hostname'</tt> &lsqb;ali, če je le mogoče,
   <tt>/usr/local/etc/README.'hostname'</tt>  - Vzdrževalec.&rsqb;

Od prvega dne upravljanja sistem zapisuje stvari v omrežni
   dnevnik. Morda boste v rootov /bash_logout vnesli vrstico
   "<tt>vi /README.$(ime gostitelja)</tt>". To lahko opravite tudi tako, da
   napišete skript za <tt>su</tt> ali <tt>sudo</tt>, ki počne nekaj podobnega:
<tscreen><verb>
function exit \
        { unset exit; exit; \
          cat ~/tmp/session.$(date +%y%m%d) \
          &gt;&gt; /README.$(hostname) && \
          vi /README.$(hostname)
          }
script -a ~/tmp/session.$(date +%y%m%d)
/bin/su.org -
</verb></tscreen>
(Dnevnik ustvarite z ukazom <tt>typescript</tt>. Prav tako ustvarite
   funkcijo, ki bo avtomatizirala, dopolnjevala in posodabljala dnevnik.)

Priznati moram, da te avtomatizacije nisem vgradil. Do zdaj sem se
   zanašal na samodisciplino. Kakorkoli že, s to zamislijo sem se igral
   (naredil sem celo prototip skripta in funkcije lupine, kot lahko
   vidite.) Nekaj, kar me pri tem moti, je ukaz '<tt>script</tt>' sam. Mislim, da
   bom moral zajeti izvire in dodati nekaj parametrov ukazne vrstice (za
   prekinitev/zaustavitev shranjevanja skriptov iz ukazne vrstice), preden
   bom začel uporabljati ta način.

Moj zadnji nasvet (v tem trenutku):

Korenska pot mora biti sestavljena iz '<tt>PATH= /bin</tt>'

To je to. Nič drugega v korenski poti. Za vse, kar počne korenski
   uporabnik, poskrbi symlink iz <tt>/bin</tt>, privzeto ime ali funkcija lupine,
   oziroma je skript ali binarna različica v <tt>/bin</tt> ali pa je izpisana z
   eksplicitno potjo.

S tem se vsi, ki se prijavljajo kot korenski uporabnik, zavedajo
   (včasih zelo boleče), kako zaupajo binarnim različicam. Pameten
   sistemski upravitelj z več uporabniki bo redno pregledoval datoteke
   <tt>/bin</tt> in <tt>/.*history</tt>, da bi našel vzorce in zančne napake.

Zares dobro motivirani sistemski upravitelji bodo poiskali
   opravila, ki jih je mogoče avtomatizirati, mesta, na katerih je mogoče vnesti
   logična preverjanja in opravila (zagon urejevalnikov, MTA in druge
   obsežne interaktivne programe, z izpopolnjenimi lastnostmi skriptov, ki
   jih je mogoče vnašati v prosojne ali podatkovne datoteke, kot je
   neslavni <tt>vi ./.exrc</tt> in <tt>emacs ./.emacs</tt> in celo
 bolj zahrbten <tt>$EXINIT</tt> in
   vgrajeni makri v glavi/nogi), ki jih je treba opravljati brez
   korenskih privilegijev. Seveda je take vrste ukaze mogoče zaganjati
   s:
<tscreen><verb>
cp $data $some_users_home/tmp
su -c $origcommand $whatever_switches
cp $some_users_home/tmp $data
</verb></tscreen>
(kjer so specifikacije odvisne od ukaza).

Večina teh zadnjih varnostnih ukrepov prenese na domačo delovno
   postajo ali postajo z enim samim uporabnikom, so pa zelo dober način 
   upravljanja večjega števila uporabnikov, še posebej javnosti
   izpostavljeni sistemi (kot tisti pri netcomu.)

<sect1>Kako nastaviti xdm-ovega izbiralca za izbor gostitelja
<p>
<enum>
 <item>Uredite datoteko, ki zažene <tt>xdm</tt> (najverjetneje je to datoteka
   <tt>/etc/rc/rc.6</tt> ali <tt>/etc/rc.local</tt>), tako da bo imela v razdelku
 za zagon <tt>xdm</tt>
   naslednje vrstice:
<tscreen><verb>
/usr/bin/X11/xdm
exec /usr/bin/X11/X -indirect hostname
</verb></tscreen>
 <item>Uredite datoteko <tt>/usr/lib/X11/xdm/Xservers</tt> in odstranite znak za
   komentar v vrstici, ki zažene strežnik v krajevnem računalniku (npr.
   z začetnim nizom <tt>0:</tt>)
 <item>Znova zaženite računalnik in delo je opravljeno.
</enum>
To sem dodal zato, ker sem ga hotel nastaviti tudi za svojo podmrežo,
   pa sem za odpravo vseh težav potreboval skoraj en teden.

Opozorilo: s starimi distribucijami SLS (1.1.1) lahko po vrstici
za klic <tt>xdm</tt> izpustite <tt>-nodaemon</tt>: to NE deluje pri
poznejših izdajah.

<sect>Administrativni podatki
<p>
<sect1>Zahvale
<p>
Nasvete v tem spisu so dodali
Alan Cox &lt;A.Cox@swansea.ac.uk&gt;,
Arrigo Triulzi &lt;a.triulzi@ic.ac.uk&gt;,
Barry Tolnas &lt;tolnas@nestor.engr.utk.edu&gt;,
Dale Lutz, &lt;dal@wimsey.com&gt;,
Didier Juges &lt;dj@destin.nfds.net&gt;,
Hans Zoebelein &lt;zocki@gold-fish.cube.net&gt;,
Jim Dennis &lt;jadestar@rahul.net&gt;,
Jon Tombs &lt;jon@gtex02.us.es&gt;,
Justin Dossey &lt;dossey@ou.edu&gt;,
Michael Hamilton &lt;michael@actrix.gen.nz&gt;,
Mick Ghazey &lt;mick@lowdown.com&gt;,
Mike Dickey &lt;mdickey@thorplus.lib.purdue.edu&gt;,
Otto Hammersmith &lt;ohammers@cu-online.com&gt;,
Paul Anderson &lt;paul@geeky1.ebtech.net&gt;,
Pawel Veselow &lt;vps@unicorn.miimm.spb.su&gt;,
Raul Deluth Miller &lt;rockwell@nova.umd.edu&gt;,
Simon Amor &lt;simon@foobar.co.uk&gt;,
Ted Stern &lt;stern@amath.washington.edu&gt; in
Tony Acero &lt;ace3@midway.uchicago.edu&gt;.

<sect1>Najnovejše različice
<p>
Najnovejšo različico prevoda tega spisa dobite na naslovu
<url url="http://www.lugos.si/delo/slo/HOWTO-sl/Tips-HOWTO-sl.html">.
</article>
