Kasutajakeskkond Debianis

Allikas: Kuutõrvaja

Sissejuhatus

Kasutajakeskkonna (ingl. k. user environment) moodustavad need tingimused ja piirangud, mis võimaldavad kasutajal operatsioonisüsteemi kasutada ning rakenduvad kasutaja protsessidele. Kasutajakeskkonna määratlevad

  • süsteemsed ressursipiirangud (ingl. k. resource limits) - määravad kui palju süsteemi ressurssi on kasutajal võimalik kasutada, nt kui palju protsesse saab kasutaja samaaegselt käivitada või kui palju on kasutajal kasutada kettaruumi
  • keskkonnamuutujad - keskkonnamuutujate abil saab kasutaja poolt käivitatavaid programme sh shelli protsessi ennast juhtida, nt määrata lokaadi omadusi või bash history suuruse

Üldiselt iga arvutis töötav protsess töötab omas keskkonnas, kus tema tööd mõjutavad süsteemsed ressursipiirangud ja keskkonnamuutujad, kusjuures vaikimisi pärib protsessi poolt käivitatud protsess oma eelkäija keskkonna, st talle rakendatakse samu piiranguid ja keskkonnamuutujatel on samasugused väärtused.

Süsteemis tootavad protsessid võib jagada kaheks selle alusel, kas nad on seotud nö tty terminaliga või mitte

tty terminaliga mitte seotud protsessid

  • need käivitatakse tavaliselt süsteemi alglaadimisel
  • ps aux väljundis on TTY tulbas väärtus '?'
 USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 root      2884  0.0  0.0  48864  1184 ?        Ss   May24   0:00 /usr/sbin/ssh

tty terminaliga seotud protsessid

  • need on käivitanud süsteemi terminalilt (nt arvuti füüsiline või serial konsool või ssh'ga seotud pseudo-terminal) sisse loginud kasutaja
  • protsessi 0, 1 ja 2 file descriptor'id on seotud terminaliga, st programm ootab vaikimisi sisendit terminalilt ja kirjutab väljundi ja veaväljundi terminalile
  • protsessi saab klaviatuurilt Ctrl-C abil lõpetada (mis on samaväärne INT signaali saatmisega)
  • TTY tulbas on esitatud nn controlling terminali nimi
 USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 mart     16002  0.0  0.1  42528  2624 pts/5   Ss+  May29   0:00 ssh mart@10.0.5.8

Käesolevas tekstis püütakse selgelt väljendada kumma juhtumiga on tegemist, aga valdavalt käsitletekse ühel või teisel moel terminaliga seotud protsesse.

Üldiselt on osa kasutajakeskkonna omadustest kasutajale ette antud ning osalt saab kasutaja keskkonna omadusi muuta, nt

  • tavaliselt kasutaja ei saa muuta oma kasutajanime ja UID väärtust
  • kasutaja ei suurendada arvu, mis määrab kui palju tema käivitatud protsess saab samaaegselt faile avada, aga ta saab seda arvu vähendada
  • kasutaja saab muuta oma lokaadi määranguid

Süsteemi kasutajate andmebaas

Vaikimisi on andmed süsteemi kasutajate kohta kirjas failides, kusjuures NSS (Name Service Switch) toetab ka muid andmebaase, nt LDAP kataloog)

  • /etc/passwd - kasutajate andmed
  • /etc/group - gruppide kirjeldused
  • /etc/shadow - paroolide krüptogrammid

Kasutaja moodustamiseks võib redigeerida tavalise tekstieditoriga faile /etc/passwd, /etc/group ja /etc/shadow aga sobivam on kasutada programme groupadd ja useradd, nt nii

 # groupadd mart
 # useradd -g mart -m -d /home/mart -s /bin/bash mart

Ning omistada kasutajale parool

 # passwd mart

Tulemusena lisatakse kasutaja andme mainitud kolme faili

 # grep mart /etc/passwd /etc/group /etc/shadow
 /etc/passwd:mart:x:1000:1000::/home/mart:/bin/bash
 /etc/group:mart:x:1000:
 /etc/shadow:mart:$1$PvykLyXa$AxhjUndHit.WIcheFQoEI.:14114:0:99999:7:::

ja moodustatakse kasuta kasutaja kodukataloog /home/mart kuhu kopeeritakse failid kataloogis /etc/skel, vaikimisi

 # find /etc/skel -type f
 /etc/skel/.bash_logout
 /etc/skel/.profile
 /etc/skel/.bashrc

Kasutajakeskkond

Arvuti konsoolilt või pseudo-terminalilt (nt ssh programmi abil) bash shelli kasutava kasutaja süsteemi sisse logimisel

  • rakendatakse vastavalt PAM mooduli login seadistusfailist /etc/pam.d/login või mooduli ssh seadistusfailist /etc/pam.d/ssh tulenevad seadistused ja piirangud (reeglina /etc/security/limits.conf)
  • käivitatakse sellele kasutajale failis /etc/passwd seadistatud shell'i protsess login shellina kõnealuse kasutaja õigustes
  • algväärtustatakse kasutajakeskkond süsteemse profiili /etc/profile ja nn punktifailide, vaikimisi ainult .profile abil, kusjuures ~/.bash_profile ja ~/.bash_login faile Debianis vaikimisi ei kasutata
  • väljalogimisel täidetakse failis ~/.bash_logout kirjas olevad tegevused

Peale süsteemi sisselogimist on kasutajal shell nö ees ja ta saab arvutit kasutama hakata, nt kävitada protsesse.

Tuuma parameetrid

Süsteemi tööd kontrollib kõige globaalsemal tasemel ca 700 nn tuuma ehk sysctl parameetrit, süsteem arvutab neile sobivad väärtused alglaadimise ajal, osa sõltub kasutatava füüsilise ressursi olemasolust. Osa parameetreid saab ainult lugeda, aga mitmeid neist saab juurkasutaja muuta vastuvalt vajadusele, nt määratleda, kas arvuti töötab ruuterina või mitte. Süsteemi alglaadimisel loetakse /etc/sysctl.conf faili sisu muudatuste kehtestamiseks. Parasjagu kehtestatud piiranguid saab küsida sysctl utiliidi abil

 $ /sbin/sysctl fs.file-max
 fs.file-max = 198467

Parameetrite väärtusi saab muuta juurkasutaja öeldes nt

 # sysctl -w net.ipv4.ip_forward=0

Tekstikonsoolilt sisseloginud kasutaja keskkond

Arvuti tekstikonsoolilt sh serial konsoolilt sisse logides esmalt täidetakse PAM login mooduli seadistusfailis /etc/pam.d/login kirjeldatud tegevused, vaikimisi

  • /etc/security/limits.conf - seadistatakse globaalsed ressursipiirangud

ja seejärel bash shelli käivitamisel kasutatakse selliseid seadistusfaile

  • /etc/profile - globaalne profiilifail, mis määrab PATH ja PS1 väärtused erinevalt tava-ja juurkasutajale
  • kasutaja shelli punktifailid - kolmest kasutatakse ainult esimese, mis leidub, faile vaadatakse läbi sellises järjekorras ~/.bash_profile, ~/.bash_login, ~/.profile

Vaikimisi on kasutaja jaoks kirjeldatud sellised keskkonnamuutujad

 $ env
 SHELL=/bin/bash
 TERM=vt100
 HUSHLOGIN=FALSE
 USER=priit
 LS_COLORS=no=00:fi=00:di=01;...
 MAIL=/var/mail/priit
 PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
 PWD=/home/priit
 HISTCONTROL=ignoreboth
 SHLVL=1
 HOME=/home/priit
 LOGNAME=priit
 _=/usr/bin/env

Punktifailid on tavalised tekstifailid, ei alga '#!/bin/bash' järgnevusega ja ei ole iseenesest käivitatavad, tavaliselt on nad ainult kasutajale loetavad ja kirjutatavad, kuid süsteem loeb nende sisu ja käivitab seal esitatud käsud.

Failide läbivaatamise ja kehtestamise osas on hea veenduda tekitades kõik failid alustuseks ning kirjutades neile sisse

 $ cat .bash_profile
 PUNKT_BASH_PROFILE_ON_OLEMAS=punkt_bash_profile_on_olemas
 $ cat .bash_login
 PUNKT_BASH_LOGIN_ON_OLEMAS=punkt_bash_login_on_olemas
 $ cat .profile
 PUNKT_PROFILE_ON_OLEMAS=punkt_profile_on_olemas

Ning seejärel sisse logides on käsuga env näha, millised punktifaile on süsteem tegelikult kasutanud. Sarnaselt saab stat programmiga kaudselt kontrollida, milliseid faile on kasutatud.

Kui kasutaja soovib ise ulimit väärtusi muuta, siis seda sobib teha .bashrc failist lisades nt faili lõppu read

 ulimit -n 80

Näiteks küsides arvutilt kasutaja login shelli protsessile 17731 vastavaid andmed, sh keskkonnamuutujaid öeldakse (miinus märk bash ees tähistab ajalooliselt asjalolu, et tegu on login shelliga)

 $ ps e -p 17731
 PID TTY      STAT   TIME COMMAND
 17731 ttyS1    S+     0:00 -bash TERM=vt100 HOME=/home/priit SHELL=/bin/bash USER=priit\
   LOGNAME=priit PATH=/usr/local/bin:/usr/bin:/bin:/usr/games MAIL=/var/mail/priit HUSHLOGIN=FALSE

Sama protsess paistab w käsu väljundis selliselt

 # w
 16:40:39 up 7 days,  1:35,  3 users,  load average: 0.00, 0.00, 0.00
 USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
 priit    ttyS1    -                12:48    2:11m  0.28s  0.28s -bash
 ...

Kuna tegu on login shelli kasutusjuhuga, siis väljalogimisel täidetakse failis ~/.bash_logout kirjas olevad tegevused.

SSH abil pseudo-terminalilt sisseloginud kasutaja keskkond

Arvutisse pseudo-terminalilt sisse logides, nt ssh kliendiga, esmalt täidetakse PAM ssh mooduli seadistusfailis /etc/pam.d/ssh kirjeldatud tegevused, vaikimisi

  • /etc/environment - vaikimisi ei ole kasutuses, fail on tühi
  • /etc/security/pam_env.conf - vaikimisi ei ole kasutuses, fail on tühi
  • /etc/default/locale - 'dpkg-reconfigure locale' seadistab failile sisu, nt rea 'LANG=et_EE.UTF-8'
  • /etc/security/limits.conf - seadistatakse globaalsed ressursipiirangud

ja seejärel bash shelli käivitamisel kasutatakse selliseid seadistusfaile

  • /etc/profile - globaalne profiilifail, mis määrab PATH ja PS1 väärtused erinevalt tava ja juurkasutajale
  • kasutaja shelli punktifailid - kolmest kasutatakse ainult esimese, mis leidub, faile vaadatakse läbi sellises järjekorras ~/.bash_profile, ~/.bash_login, ~/.profile

Vaikimisi on ssh puhul oluline tähele panna, et tuuakse kaasa LANG muutuja ning moodustatakse veel mõned iseloomulikud muutujad

 $ env
 TERM=xterm
 SHELL=/bin/bash
 SSH_CLIENT=192.168.10.10 50602 22
 SSH_TTY=/dev/pts/1
 USER=priit
 LS_COLORS=no=00:fi=00:...
 MAIL=/var/mail/priit
 PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
 PWD=/home/priit
 LANG=hiinakeel
 HISTCONTROL=ignoreboth
 SHLVL=1
 HOME=/home/priit
 LOGNAME=priit
 SSH_CONNECTION=192.168.10.10 50602 192.168.10.250 22
 DISPLAY=localhost:11.0
 _=/usr/bin/env

Kuna tegu on login shelli kasutusjuhuga, siis väljalogimisel täidetakse failis ~/.bash_logout kirjas olevad tegevused.

Mitte-login shelli kasutamine

Mitte-login shelli kasutamine tähendab, et bash käivitatakse, aga see ei toimu seoses süsteemi sisselogimisega, sellisel juhul on kaks võimalust

  • mitte-login shelli kasutamine interaktiivses režiimis - nt kasutaja käivitab shellis olles uuesti shelli, st öeldes
 $ echo $SHLVL
 1
 $ bash
 $ echo $SHLVL
 2

Kasutaja nn mitte-login shelli (ingl. k. non-login shell) puhul päritakse töötavalt shellilt enamus kasutajakeskkonna omadusi ning kasutatakse /etc/bash.bashrc ja .bashrc uue shelli väärtustamiseks. Ei kasutata PAM moodulite seadistusi ega /etc/profile ega ~/.profile faile.

Selleks, et login ja mitte-login shelli keskkond oleks sarnane loetakse ~/.profile faili lõpus sisse ~/.bashrc sisu.

  • mitte-login shelli kasutamine mitte-interaktiivses režiimis - nt kasutaja käivitab shell skripti moodustades faili sisuga
 $ cat skript.sh
 !#/bin/bash
 echo olen skript
 $ chmod 0755 skript.sh
 $ ./shript.sh
 olen skript

Mitte-login shelli kasutamisel mitte-interaktiivselt puhul päritakse töötavalt shellilt enamus kasutajakeskkonna omadusi, kuid ei kasutata /etc/bash.bashrc ega ~/.bashrc faile. Keskkonnamuutuja BASH_ENV abil saab viidata failile, mis nö source'itakse

 $ cat bash_env.src
 echo olen BASH_ENV muutuja poolt viidatud faili sisu
 $ export BASH_ENV=/home/mart/bash_env.src
 $ ./skript.sh
 olen BASH_ENV muutuja poolt viidatud faili sisu
 olen skript

Asjakohane autentne info on bash manuaalis (man bash) sektsioonis INVOCATION.

su ja sux programmide kasutamine

su programmi (switch user) kasutab tavaliselt juurkasutaja selleks, et sooritada tegevusi mõne muu kasutajana. Kui kasutada võtit '-l' või '-', siis asendatakse juurkasutaja shell su programmi argumendina näitadatud kasutaja login shelliga (algväärtustatakse keskkonnamuutujad, asendatakse töökataloog)

 # pwd
 /root
 # su - mart
 $ pwd
 /home/mart

sux on su programmi wrapper, mis võimaldab edastada X credentials'isid ja tulemusena saab avanenud shellist kasutada ka X serverit, st avada kasutajana graafilise kasutajaliidesega programme, tarkvara paigaldamised tuleb öelda

 # apt-get install sux

sudo programmi kasutamine

TODO

Graafiliselt konsoolilt sisseloginud kasutaja keskkond

Arvuti graafiliselt konsoolilt sisse logides kasutatakse selliseid seadistusfaile

  • TODO

Süsteemi alglaadimise käigus käivitatud protsessi kasutajakeskkond

TODO

set, env, export ja source kasutamine

Teatud mööndustega võib üldiselt öelda, et bash shelli kasutava kasutaja keskkonnas on kahesuguseid keskkonnamuutujaid

  • lokaalsed - nende abil saab nt lugeda käesoleva shelli omadusi
 $ echo $BASH_VERSION
 3.2.39(1)-release

või lihtsalt kasutada neid muutujatena shellis käske andes, nt arhiveerida kataloogid nimedega 1 2 3 4

 $ for i in 1 2 3 4; do tar zcf $i.tgz $i; done

Oluliseks lokaalse muutuja tunnuseks on, et nende väärtusi ei anta edasi keskkonnas käivitatud shellile.

  • eksporditavad - need on muude omaduste poolest samasugused keskkonnamuutujad nagu lokaalsedki, aga nende väärtused antakse edasi keskkonnas käivitatud shellile
 $ echo $LANG
 C
 $ bash
 $ echo $LANG
 $ C

env

env programmi abil saab anda argumendiks oleva programmile külge keskkonna, nt

 $ env GCC=/usr/bin/gcc-4.1 ./programminimi

kusjuures põhiliselt kasutatakse bash shellist käsku env ilma argumentideta eksporditud keskkonnamuutujate ja vastavate väärtuste nimekirja esitamiseks.

set

set käsu abil saab seada lokaalsete muutuja väärtust käesoleva shelli eksemplari jaoks, kusjuures seda ei anta edasi alamshellile

 $ set MUUTUJA_LOKAALNE=muutujavaartus_lokaalne

kujuures ilma argumentidega set käsk esitab kõik käesolevas shellis kirjeldatud muutujad.

Samaväärne on öelda

 $ MUUTUJA_LOKAALNE=muutujavaartus_lokaalne

unset abil saab eemaldada set või export abil seadistatud muutujate väärtusi

 $ unset MUUTUJA_LOKAALNE

Üheks praktiliseks juhtumiks on nt kompileerimisel kompilaatori versiooni valimine

 $ GCC=/usr/bin/gcc-4.1 make

export

export käsu abil saab seada muutuja väärtust käesoleva shelli eksemplari jaoks, kusjuures see antakse edasi alamshellile. Sellise omadusega muutujat saab moodustada kahe sammuna

 $ set MUUTUJA_EDASIANTAV=muutujavaartus_edasiantav
 $ export MUUTUJA_EDASIANTAV

või ühe sammuna

 $ export MUUTUJA_EDASIANTAV=muutujavaartus_edasiantav

Kuna tegu on küll eksporditava keskkonnamuutujaga, aga siiski keskkonnamuutujaga, saab teda mälust kustutada öeles

$ unset MUUTUJA_EDASIANTAV

source

source käsu abil saab täita tekstifailis sisalduvad käsud käesolevas shellis, tavaliselt kasutatakse seda muutujate väärtuste ja funktsioonide kirjelduste käesolevasse shelli sisselugemiseks

 $ source failinimi.src

Samaväärne on öelda

 $ . ./failinimi.src

umask

umask määrab, millised loabitid on vaikimisi moodustataval failil. Vaikimisi on moodustatav fail loabittidega 0644 ja parasjagu kehtivat umask väärtust saab küsida öeldes

 $ umask 
 0022
 $ umask -S
 u=rwx,g=rx,o=rx

Globaalne umask seadistatakse failis /etc/profile.

Bash completion

Keerukama bash completioni kasutamiseks kui niisama käsu lõpunikirjutamine peab süsteemis olema pakett bash-completion, kusjuures vaikimisi on see paigaldatud. Nt võimaldab bash-completion tarkvara lõpetada käsu argumente

  • sisestades 'cd tühik-tab' esitatakse nimekirja käesolevas kataloogis olevatest alamkataloogidest
  • sisestades 'rpm2cpio-tühik-tab' esitatakse nimekirja .rpm failidest
  • sisestades 'gunzip-tühik-tab' esitatakse nimekiri .gz failidest

Completion on laiendatav, tavaliselt paketid lisavad laiendusi kataloogi /etc/bash_completion.d, nt Subversion

 # dpkg -S /etc/bash_completion.d/subversion
 subversion: /etc/bash_completion.d/subversion

Subversioni puhul esitatakse tulemusena 'svn-tühik' sisestamisel nimekiri võimalikest nö esimestest svn argumentidest.

Probleemid

Kui Lenny puhul lisada kasutaja ilma shelli näitamata, siis määratakse kasutaja shelliks /bin/sh. Bash completioni iseärasuste tõttu saab /bin/sh kasutav kasutaja valides nt 'cd-tühik' sellise veateate, ' ' vahel tegelikult tühikut pole

 $ cd -sh: <( compgen -d -- ' ' ): No such file or directory

Probleemi lahendab kasutaja shellina /bin/bash kasutamine. Kusjuures juurkasutaja shell on vaikimisi /bin/bash.

ulimit - ressursipiirangute kehtestamine

Kasutaja ressursipiirangud on määratud /etc/security/limits.conf faili sisuga, kasutaja jaoks nt sellised ühes süsteemis vaikimisi juhtumil

 $ ulimit -a
 core file size          (blocks, -c) 0
 data seg size           (kbytes, -d) unlimited
 scheduling priority             (-e) 0
 file size               (blocks, -f) unlimited
 pending signals                 (-i) 4095
 max locked memory       (kbytes, -l) 32
 max memory size         (kbytes, -m) unlimited
 open files                      (-n) 1024
 pipe size            (512 bytes, -p) 8
 POSIX message queues     (bytes, -q) 819200
 real-time priority              (-r) 0
 stack size              (kbytes, -s) 8192
 cpu time               (seconds, -t) unlimited
 max user processes              (-u) 4095
 virtual memory          (kbytes, -v) unlimited
 file locks                      (-x) unlimited

kus

  • core file size 0 - core faile ei salvestata
  • open files 1024 - ühe protsessi poolt samaaegselt avada lubatud failide arv
  • max user processes - operatsioonisüsteemis kasutajale lubatud samaaegselt töötavate protsesside arv

Nt konkreetse kasutaja jaoks saab süsteemselt piirangu seada kasutades limits.conf failis ridu

 priit   hard    nproc   20
 priit   hard    nofile  100

Töötava protsessi ulimit väärtusi saab küsida /proc protsessi kataloogist, nt

# cat /proc/9387/limits 
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            ms        
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
...

Selleks, et ühe või teise programmi jaoks limits.conf kehtestuks, peab olema ta vastavas PAM moodulis kasutusel, nt su puhul peab /etc/pam.d/su sisaldama muu hulgas rida

session    required   pam_limits.so

Bash shell kasutamine

Tõenäolselt enamasti leiab bash shelli kasutamine aset Xterm programmi aknas. Lisaks ilmsele on abiks shortcut kombinatsioonide kasutamine

  • Ctrl-D - ütleb exit, st logib välja kui tegu on nn login-shelliga
  • Ctrl-A - viib kursori rea algusse
  • Ctrl-E - viib kursori rea lõppu

Prompt

Prompti ehk kasutaja käsurea alguses oleva teksti määrab keskkonnamuutuja PS1 väärtus, vaikimisi on see kirjeldatud failis ~/.bashrc sektsioonis

 if [ "$color_prompt" = yes ]; then
   PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
 else
   PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '    
 fi

Aliases

Alias'teks nimetatakse kasutaja enda poolt kirjeldatud järgnevusi, nt kirjeldame ll täitma käsku 'ls -l'

 $ alias ll='ls -l'

Öeldes seejärel ll täidetakse tegelikult käsk 'ls -l'.

Aliase kirjeldus saab eemaldada öeldes

 $ unalias ll

Aliasel on kõrgem prioriteet kui failisüsteemist käivitatud programminimedel, st kui nimed langevad kokku, täidetakse aliasele vastav käsk.

Tavaliselt kirjeldatakse aliased failis ~/.bash_aliases, näitele vastaval juhul peaks seal sisalduma rida

 alias ll='ls -l'

~/.bash_aliases faili kasutamiseks tuleb failis ~/.bashrc eemaldada kommentaarid sektsiooni eest

 if [ -f ~/.bash_aliases ]; then
   . ~/.bash_aliases
 fi

Programmide käivitamine

Kui programmi iseloom on selline, et ta jääb nö niisama terminalil käima, siis sobib teda käivitada start-stop-daemon abil, nii

 # start-stop-daemon -v -m -b --start --pidfile /tmp/tcpdump.pid  \
   --startas /usr/sbin/tcpdump -- -w /tmp/log.log host 1.1.1.1

ja seisata nii

 # start-stop-daemon -v --stop --pidfile /tmp/tcpdump.pid

Süsteemsed kasutajad

TODO

Kasulikud lisamaterjalid