Процессы, права доступа
Как кому разрешать и запрещать делать разные вещи. Дело вот в чём: в линуксе обычный пользователь достаточно сильно поражён в правах. Говоря простым языком, он может изменять файлы в своём каталоге и свои файлы в /tmp. Ещё он может часть файлов читать, но не больше. Поскольку такова практика работы в linux, то почти любая программа должна работать от лица обычного пользователя, и тут не имеем проблем, свойственных Windows.
Есть три вида доступа:
- Чтение. Означает, что файл можно читать.
- Запись. Означает, что файл можно изменять.
- Использование, исполнение. Означает, что файл можно исполнять.
ls -l выведет права, количество имён у файла, пользователь, группу, размер, время изменения и имя файла. Первый символ в правах обозначает тип файла (- у обычных файлов, d у каталогов, другие символы у специальных файлов). Посмотри ls -l /bin/ | head. Можно увидеть, что файлы исполняемые.
$ ls -l /bin/ | head итого 5204 -rwxr-xr-x 1 root root 2852 Ноя 23 2007 arch lrwxrwxrwx 1 root root 4 Июл 15 21:23 awk -> gawk -rwxr-xr-x 1 root root 13004 Май 22 2007 basename -rwxr-xr-x 1 root root 470980 Окт 5 2007 bash lrwxrwxrwx 1 root root 4 Июл 15 21:23 bash2 -> bash lrwxrwxrwx 1 root root 5 Июл 15 21:22 bunzip2 -> bzip2 lrwxrwxrwx 1 root root 5 Июл 15 21:22 bzcat -> bzip2 -rwxr-xr-x 1 root root 30360 Май 18 2007 bzip2 -rwxr-xr-x 1 root root 22008 Май 18 2007 bzip2recover
Создадим файл MyExecutable с простым скриптом и ппробуем запустить его.
$ cat > MyExecutable #!/bin/sh echo "Hello!" $ ./MyExecutable bash: ./MyExecutable: Отказано в доступе
Узреем, что отказано в доступе. Если скажем ls -l MyExecutable, то увидим, что у него нет бита исполнения.
$ ls -l MyExecutable -rw-r--r-- 1 george george 24 Июл 18 16:29 MyExecutable
Если скажем chmod +x MyExecutable, то исполнение файла станет возможным.
chmod +x MyExecutable $ ls -l MyExecutable -rwxr-xr-x 1 george george 24 Июл 18 16:29 MyExecutable $ ./MyExecutable Hello!
После того, как мы скажем chmod -r MyExecutable, то мы не сможем читать, но сможем писать:
$ chmod -r MyExecutable $ cat MyExecutable cat: MyExecutable: Отказано в доступе $ ls -l MyExecutable --wx--x--x 1 george george 24 Июл 18 16:29 MyExecutable $ ./MyExecutable /bin/sh: ./MyExecutable: Отказано в доступе $ cat >> MyExecutable echo "Hello?" $ chmod +r MyExecutable $ ./MyExecutable Hello! Hello?
Как работает эта программа? Как работают бинарные, понятно, а как она Hello вывела? Наверное, её выполнил shell. Он её выполнил, потому что он указан в первой строчке файла, после #!. По умолчанию используется (для текствых файлов, у которых эта первая строчка не указана) /bin/sh.
Более хитро три вида доступа устроено применительно к каталогам. Каталог это такой список файлов, где хранится имя файла и соответствующий ему индексный дескриптор. Когда мы обращаемся к файлу по имени, то мы неявно производим поиск по этой таблице соответствий, чтобы узнать, откуда с диска брать файл. Итак, права:
- Чтение из каталога --- доступ к списку файлов
- Запись в каталог --- изменить список файлов
- Использование каталога --- возможность получить доступ к файлу в каталоге
По принципу прав --x делаются директории с именами файлов, известных только избранным.
Теперь разберёмся с ограничением доступа.
Вопрос: кто записывает файл, читает из файла? Вовсе не пользователь, как об этом некоторые думают, а процесс. Вся работа системы состоит в том, что процессы что-то делают с файлами. В каждый момент времени выполняется много процессов. Команда ps показывает список процессов, по умолчанию, привязанных к текущей консоли, -e --- все процессы, -f --- более полная информация.
$ ps PID TTY TIME CMD 4753 pts/2 00:00:00 bash 6155 pts/2 00:00:00 ps $ ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:28 ? 00:00:00 init [5] root 2 1 0 10:28 ? 00:00:00 [migration/0] root 3 1 0 10:28 ? 00:00:00 [ksoftirqd/0] root 4 1 0 10:28 ? 00:00:00 [watchdog/0] root 5 1 0 10:28 ? 00:00:00 [events/0] root 6 1 0 10:28 ? 00:00:00 [khelper] root 7 1 0 10:28 ? 00:00:00 [kthread] root 10 7 0 10:28 ? 00:00:00 [kblockd/0] root 11 7 0 10:28 ? 00:00:00 [kacpid] root 92 7 0 10:28 ? 00:00:00 [cqueue/0] root 93 7 0 10:28 ? 00:00:00 [kseriod] root 132 7 0 10:28 ? 00:00:00 [pdflush] root 133 7 0 10:28 ? 00:00:00 [pdflush] root 134 7 0 10:28 ? 00:00:00 [kswapd0] root 135 7 0 10:28 ? 00:00:00 [aio/0] root 635 7 0 10:28 ? 00:00:00 [kjournald] root 733 1 0 10:28 ? 00:00:00 /sbin/udevd --daemon root 953 7 0 10:28 ? 00:00:00 [khubd] root 1039 7 0 10:28 ? 00:00:00 [kgameportd] root 1052 7 0 10:28 ? 00:00:00 [kpsmoused] root 2448 1 0 10:29 ? 00:00:00 /sbin/auditd root 2450 2448 0 10:29 ? 00:00:00 /sbin/audispd root 2451 7 0 10:29 ? 00:00:00 [kauditd] rpc 2481 1 0 10:29 ? 00:00:00 /sbin/portmap -l syslogd 2607 1 0 10:29 ? 00:00:00 /sbin/syslogd -u syslogd -j /v klogd 2636 1 0 10:29 ? 00:00:00 /sbin/klogd -c 1 -x -u klogd - 100 2938 1 0 10:29 ? 00:00:00 /usr/bin/dbus-daemon --system root 2990 1 0 10:29 ? 00:00:00 /usr/sbin/acpid 110 3030 1 0 10:29 ? 00:00:00 /usr/sbin/hald root 3031 3030 0 10:29 ? 00:00:00 hald-runner root 3036 3031 0 10:29 ? 00:00:00 hald-addon-input: Listening on 110 3044 3031 0 10:29 ? 00:00:00 hald-addon-acpi: listening on root 3049 3031 0 10:29 ? 00:00:01 hald-addon-storage: polling /d root 3186 1 0 10:29 ? 00:00:00 /usr/sbin/gpm -m /dev/psaux -t root 3216 1 0 10:29 ? 00:00:00 /usr/sbin/crond root 3270 1 0 10:29 ? 00:00:00 /usr/sbin/atieventsd root 3299 1 0 10:29 ? 00:00:00 /usr/sbin/rundm /dev/tty1 /dev root 3310 3299 0 10:29 ? 00:00:00 xdm -nodaemon root 3401 3310 3 10:29 tty7 00:13:21 X -nolisten tcp -auth /etc/X11 root 3414 3310 0 10:29 ? 00:00:00 -:0 root 3415 1 0 10:29 ? 00:00:00 /usr/sbin/cupsd dhcpd 3471 1 0 10:29 ? 00:00:00 /usr/sbin/dhcpd root 3733 1 0 10:29 ? 00:00:00 /usr/libexec/postfix/master postfix 3750 3733 0 10:29 ? 00:00:00 qmgr -l -t fifo -u -c root 3807 1 0 10:29 tty1 00:00:00 /bin/login root 3808 1 0 10:29 tty2 00:00:00 /sbin/mingetty tty2 root 3809 1 0 10:29 tty3 00:00:00 /sbin/mingetty tty3 root 3810 1 0 10:29 tty4 00:00:00 /sbin/mingetty tty4 root 3811 1 0 10:29 tty5 00:00:00 /sbin/mingetty tty5 root 3812 1 0 10:29 tty6 00:00:00 /sbin/mingetty tty6 george 3836 3414 0 10:34 ? 00:00:00 /bin/sh /etc/xdg/xfce4/xinitrc george 3888 1 0 10:34 ? 00:00:00 /usr/bin/dbus-launch --sh-synt george 3889 1 0 10:34 ? 00:00:00 /usr/bin/dbus-daemon --fork -- george 3892 1 0 10:34 ? 00:00:00 ssh-agent -u george 3952 3836 0 10:34 ? 00:00:00 /bin/sh /etc/xdg/xfce4/xinitrc george 3953 3952 0 10:34 ? 00:00:00 xscreensaver -no-splash george 3956 3836 0 10:34 ? 00:00:00 /usr/bin/xfce4-session george 3960 1 0 10:34 ? 00:00:02 xfce-mcs-manager george 3962 1 0 10:34 ? 00:00:03 xfwm4 george 3964 1 0 10:34 ? 00:00:15 xfce4-panel george 3966 1 0 10:34 ? 00:00:00 Thunar --daemon george 3968 1 0 10:34 ? 00:00:00 /usr/lib/gam_server george 3970 1 0 10:34 ? 00:00:03 xfdesktop george 3972 3964 0 10:34 ? 00:00:02 /usr/lib/xfce4/panel-plugins/x george 3973 3964 0 10:34 ? 00:00:00 /usr/lib/xfce4/panel-plugins/x root 3977 3807 0 10:34 tty1 00:00:00 -bash george 4090 1 0 10:41 ? 00:00:00 /bin/sh /usr/bin/xbrowser /usr george 4096 4090 0 10:41 ? 00:00:00 /bin/sh /usr/lib/firefox/run-m george 4101 4096 0 10:41 ? 00:02:19 /usr/lib/firefox/firefox-bin / george 4107 1 0 10:42 ? 00:00:00 /usr/lib/gconfd-2 14 george 4143 1 0 10:53 ? 00:00:09 /usr/bin/Terminal george 4144 4143 0 10:53 ? 00:00:00 gnome-pty-helper george 4146 4143 0 10:53 pts/0 00:00:00 bash george 4273 4143 0 12:49 pts/1 00:00:00 bash george 4311 4273 0 13:15 pts/1 00:00:00 bash george 4751 4311 0 14:52 pts/1 00:00:00 script -t 5.script george 4752 4751 0 14:52 pts/1 00:00:00 script -t 5.script george 4753 4752 0 14:52 pts/2 00:00:00 bash -i postfix 4909 3733 0 15:29 ? 00:00:00 pickup -l -t fifo -u -c george 6013 1 0 15:51 ? 00:00:00 xbindkeys george 6162 4753 0 16:41 pts/2 00:00:00 ps -ef
Каждому процессу соответствует идентификатор процесса. Среди процессов есть куски ядра, зарегистрированные как процессы (имена таких процессов взяты в квадратные скобки; они существуют для того, чтобы ядру можно было посылать сигналы). Процессы порождают друг друга, поэтому в выдаче указан не только идентификатор процесса, но и его папы. Если родительский процесс умер, а сын живёт, то их усыновляет init.
Программы могут обмениваться разным способами, один из них --- сигналы. В программе kill -l приведён список всех сигналов, поддерживаемых ОС.
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
С данного терминала можно запускать много процессов, но только один может занимать терминал --- foreground-процесс (по вводу один, по выводу много). Для запуска процесса в фоне нужно дописать в конце команды &. Если процесс в фоне, то можно его перевести в fg и убить, или сказать ps -H, посмотреть номер процесса и убить ненужный.
Почему групп прав три штуки?
Работа происходит следующим образом: после логина запускается логин шелл. Этому первому процессу присваивается id процесса и ему присваивается некий идентификатор пользователя, который зарегистрировался в системе. Все процессы обязательно принадлежат какому-то пользователю. Пользователь определяется по номеру (UID). То есть программа, обеспечивающая авторизацию пользователя в системе, при логине лезет в базу пользователей, проверяет пароль, создаёт новый процесс, меняет ему UID и выполняет (exec) в этом процессе шелл.
Все файлы также принадлежат какому-то пользователю. Сразу возникает вопрос --- как определять, какой процесс может иметь доступ к какому файлу? Интуитивно получается две категории уровня доступа: первый уровень доступа (u) --- какие права имеет процессы пользователя-владельца по отношению к файлу. Третье (o) --- определяет, какие права имеют процессы других пользователей.
В такой дихотомии есть слабое звено, с которым часто приходится сталкиваться во время совместной работы --- если надо, чтобы одни имели доступ, а другие --- не имели. Для этого существует множественный субъект, группа пользователей. Для того, чтобы вводить соотношение между несколькими пользователями вместе и файлом, вводится понятие группа. Что такое группа? У каждого файла прописан не только пользователь, но и группа. Например, ls -ld /etc/tcb.
$ ls -ld /etc/tcb drwx--x--- 41 root shadow 4096 Июл 17 13:15 /etc/tcb
Любой пользователь может принадлежать любому количеству групп. Эта информация отчасти лежит в файле /etc/passwd (основная группа). Информация о других вхождениях в группы есть в /etc/group. Для того, чтобы узнать, у кого какой id, можно воспользоваться командой id.
$ id uid=500(george) gid=500(george) группы=10(wheel),14(uucp),19(proc),22(cdrom),71(floppy),80(cdwriter),81(audio),83(radio),119(xgrp),422(camera),423(scanner),500(george)
Таким образом, мы получаем не два уровня доступа, а три, второй триплет rwx (g) определяет права доступа для группы.
Сведения о ресурсах
Готовность (%) |
Продолжительность (ак. ч.) |
Подготовка (календ. ч.) |
Полный текст (раб. д.) |
Предварительные знания |
Level |
Maintainer |
Start date |
End date |
20 |
1 |
1 |
1 |
|
1 |
|
|