Управление пользователями
!!! Ошибка в учебнике: syslog.d используется не для хранения настрек, а для хранения сокетов, из которых читаются журналы.
!!! Патч к предыдущему модулю: salt это не 2a, тут более хитрый алгоритм.
Мы уже говорили про пароли, но не сказали, как пользователь может сменить себе пароль. В частности, выше говорилось, что пароли в линуксе вообще не зранятся. Есть специальный файл passwd в каталоге /etc, в котором хранится вся информация о пользователе, кроме информации о пароле. Ещё там нет информации о том, каково время жизни пароля, и ещё кое-чего. Всё это хранится в файле shadow, в обычных линуксах он лежит в /etc; в ALT-linux'e и СПО на базе ALT-linux'a это хранится в /etc/tcb/имя пользователя/shadow. Из чего состоит файл passwd? Из списка пользователей и информации о том, как настраивать сеанс работы. Каждая строчка соответствует отдельному входному имени. Дублирование первого поля либо запрещено, либо (что ещё хуже) превращается в игру "кто заметит первую строчку, кто последнюю", поля в строчках разделяются двоеточиями, это один из самых старых форматов в unix-подобных системах, где поля разделяются двоеточиями, есть ещё несколько файлов такого формата.
$ head /etc/passwd root:x:0:0:System Administrator:/root:/bin/bash bin:x:1:1:bin:/:/dev/null daemon:x:2:2:daemon:/:/dev/null adm:x:3:4:adm:/var/adm:/dev/null lp:x:4:7:lp:/var/spool/lpd:/dev/null mail:x:8:12:mail:/var/spool/mail:/dev/null news:x:9:13:news:/var/spool/news:/dev/null uucp:x:10:14:uucp:/var/spool/uucp:/dev/null games:x:12:100:games:/usr/games:/dev/null ftp:x:14:50:FTP User:/var/ftp:/dev/null
- первое поле --- входное имя
- второе поле --- раньше соответствовало паролю, теперь там буква x лежит в знак того, что надо идти в другой файл
- третье поле --- идентификатор пользователя, uid
- четвёртое поле --- идентификатор группы, gid. Именно этот идентификатор группы считается первичным, а все остальные группы, в которые пользователь входит, лежат в /etc/group/, они вторичные. Разницы практически никакой, но тем не менее.
- пятое поле --- так называемое полное имя, оно же gecos. Слово gecos имеет довольно смешную историю. Так называлась операционная система, к которой был подключён принтер, и Кену и Денису нужно было как-то хранить информацию о том, какой пароль для захода на эту операционную систему нужно использовать при печати. Эту-то информацию они и хранили в этом поле, поэтому оно так называется. Потом, разумеется, всё это вместе с gekos'ом выбросили, а в образовавшемся поле стали хранить всякую информацию о пользователях. Кстати, команда смены полного имени позволяет ввести туда три разных рода информации - пользователь, комната, телефон. Которые разделяются запятыми. Но это, скорее, баловство.
- шестое поле --- домашний каталог, home dir.
- седьмое поле --- программа, которая запускается для пользователя в качестве shell'а. Если то, что написано в качестве запускаемой оболочки, не содержится в файле /etc/shells, то есть, там написано странное слово, некоторая затычка, nologin, например, такой пользователь, даже при наличии настоящего пароля, не сможет зарегистрироваться в системе вообще. Если вписать этот, допустим, nologin в /etc/shells, вы организуете некую странность, просто так пользователь зайти не сможет, потому что он зайдёт, программа выполнится с ошибкой, но подсистемы, которые определяют, есть ли у пользователя shell, то есть, является ли эта учётная запись непосредственно пользовательской, в этом случае будут считать, что эта учётная запись - пользовательская, т.е. ей разрешено подключаться к системе. И, например, там может работать SSH, или что-нибудь ещё. Поэтому, есть три эшелона: пользователи, у которых настоящий шелл, включённый в /etc/shells, пользователи, у которых какая-то штука, которая в /etc/shells не включена, но запускается при логине (считается, что пользователь тоже может регистрироваться в системе), и пользователи, у которых ненастоящий, отсутствующий в /etc/shells шелл. Для чего нужны пользователи у которых ненастоящий шелл? Для разделения прав доступа к разным файлам разных частей системы, эти разные части принадлежат разным пользователям и процессы, которые с ними работают, также принадлежат разным пользователям. Вот мы видим страшного рута который может делать всё, и с точки зрения безопасности было бы оптимально, чтобы как можно меньше процессов запускалось от его лица. Поэтому для каждой системной службы заводится специальный пользватель, и все файлы, соответствующие системной службе, особенно те, которые нужно будет в процессе менять (допустим, он кэш создаёт, хранит временные файлы...) будут принадлежать этому пользователю, процесс, который будет реализовывать системную службу, будет принадлежать этому самому пользователю, залогиниться им нельзя, потому что пароля у него нет и потому что логина ему тоже не дают. Между те он не будет являться суперпользователем, поэтому если произойдёт атака и мжно будет этой служобй злоуптребить, то максимум, что можно будет сделать, так попортить свои сбственные файлы. Такие пользователи называются псевдопользователями или системными пользователями, их обычно довольно много, на машине, на которой стоит немного служб их около 44.
Здесь вроде всё понятно. Давайте теперь заглянем в /etc/group. В файле этом содержится список имеющихся групп. Каджый пользователь может состоять в нескольких группах и каждая группа может включать несколько пользователей.
$ head /etc/group root:x:0: bin:x:1:root daemon:x:2:root sys:x:3:root,bin,adm adm:x:4:root tty:x:5: disk:x:6:root lp:x:7: mem:x:8: kmem:x:9:
Сведения о членстве в группе оформляется таким образом:
- первое поле --- имя группы
- втрое --- пароль группы, который, кажется, никогда не используется.
- третье поле --- идентификатор группы.
- четвёртое поле --- здесь через запятую перечислены входые имена пользователей. Почему это важно: когда вы запускаете процесс, он выясняет членство в базовой группе, потому что вы, когда залогинились, получили uid и gid, а вот членство процесса в остальных группах выясняется путём того, в каких группах содержится ваш login name, то есть с каким именем вы зашли, и это-то имя, но не uid, и смотрится в /etc/group. То есть, вы можете сделать двух разных пользователей, у которых будет одинаквый uid, но разные имена, и сделать им членство в разных группах. Правда, зачем это нужно, лектор не знает, и вообще, это достаточно мутная штука.
Создадим нового пользователя. Это делает программа useradd.
# usearadd -u -G wheel -c "Newly Added Admin" admin
Мы создали пользователя admin, который состоит в дополнительной группе wheel. Поскольку мы не указали ключ -u, uid был выбран первый попавшийся, мы не указали ключ -g, поэтому была создана новая группа admin и идентификатор её был выбран первый попавшийся. Нельзя считать, что не по этой команде будет создан пользователь admin, группа admin и uid будет совпадать с gid'ом. Например, если пользователь с номером 510 не существовал, а группа с таким номером существовала, и 510 было бы первым свободным номером uid'а, польователь создался бы с uid'ом 510, а gid был бы первый свободныё - например, 520. Такое поведение появилось недавно, раньше надо было указывать, в какую группу вы собираетесь добавить пользователей, и, как правило, сразу несколько пользователей добавлялись в одну и ту же группу. С некоторых пор стало популярно добавлять каждого пользователя в отдельную группу, и, если его нужно добавить ещё и в общую группу, эту общюю группу выносить отдельно в /etc/group. Это делается по двум соображениям. Во-первых, просто глядя в /etc/group удобно просмотреть всех пользователей, которые являются членами какой-то общей группы. Посмотрим, к чему привела эта операция.
# grep admin /etc/passwd /etc/group /etc/passwd:admin:x:501:501:Newly Added Admin:/home/admin:/bin/bash /etc/group:wheel:x:10:root,saj,admin /etc/group:ftpadmin:x:51: /etc/group:cvsadmin:x:53: /etc/group:netadmin:x:104: /etc/group:wineadmin:x:57: /etc/group:admin:x:501:
Появилась группа admin (gid 501), пользователь admin (uid 501), а ещё этот пользователь добавился в группу wheel, этому пользвателю автоматически создался домашний каталог (в bsd для этого надо было говорить -m, иначе он не создастся). В домашний каталог автоматически скопировались некоторые настроечные файлы из /etc/skel. Вот, кстати, полезное знание для системного администратора: если вы хотите, чтобы у ваших пользователей при создании настраивалось какое-то минимальное окружение, настройки KDE, например, посмотрите, как точно устроено копирование файла из /etc/skel и подсуньте туда нужные файлы.
Пользователь заведён, и почти всё у него есть, единственное, чего у него нет --- пароля. Прежде чем переходить к этому, лектор сразу расскажет, как удалять пользователя. Это делается при помощи команды userdel, у неё есть ключ -r, который удаляет не только пользователя, но и homedir и его почту, лежащую в /var/mail. Сразу вопрос: хорошо ли удалять пользователей? Существует мнение, что пользователей удалять вообще не надо. Смотрите: вы завели некоторого пользователя, он что-то делал, у него был какой-то uid, и какое-то личное входное имя. Вы его удалили. Встаёт вопрос: удалять ли его домашний каталог или нет? Допустим, вы его не удалили. И так случилось, чт пользователь имел наибольший uid в вашем passwd, и теперь наименьший свободный uid совпадает с uid этого пользователя. Вы заводите следующего пользователя, и у него оказывается такой же uid. И он получает доступ в домашний каталог удалённого пользователя. Так случилось, потому что вы его удалили. На самом деле, если вы хотите, чтобы пользователь просто не работал в системе, над навсегда запретить логин. Для этого надо манипулировать командой sbin/passwd, где есть ключ -l (--lock), которая что-то делает с файлом shadow, после чего пользователь просто не сможет логиниться. Есть небольшая вероятность, что такой заблокированный пользователь сможет, например, логинится в ssh, если там отключена функция user login. Суперпользователь может модифицировать настройки уже заведённго пользователя разными способами, в частности, поменять некую информацию, которая хранится не в passwd, а в shadow. Например, сделать пароль временным, то есть пароль будет дейстовать некоторое время, после чего просрочится. Для этого служит ключ -e. Там вроде ещё была возможность сделать предупреждения, чтобы принудить пользователя менять парль раз в какое-то время.
Возвращаемся к заведению пользователя. Пользователя мы завели, а пароль не задали. По умолчанию пользователь создаётся такой, что зайти в систему он не может. Поэтому надо сменить пароль. Пароль можно задать вручную, то есть, сказать passwd имя пользователя. Нужно заметить, что программа passwd, которую мы запускаем из-под рута и программа passwd, которую мы запускаем из-под обычного пользователя - разные программы с разными опциями. Одна лежит в /bin (для обычных пользователей), а другая в /sbin. воспользоваться bin/passwd. А можно задать пароль двумя другими способами:
- Можно указать пароль в -p. Правда, это будет уже не пароль, а хэш. В альте blowfish'ные пароли, их так просто не получить. Что рекомендует делать в этом случае лектор: можно поставить пакет python-module-bcrypt, запустить питон и сказать bcrypt.hashpw("password", bcrypt.gensalt(8)).
[root@class305 ~]# python Python 2.4.4 (#1, Jan 23 2008, 16:24:35) [GCC 4.1.1 20070105 (ALT Linux, build 4.1.1-alt11)] on linux2 Type "help", "copyright", "credits" or "license" for more information. [?1034h>>> import bcrypt >>> help(bcryot[K[Kpt) [?1049h[?1h=[42;1H[KHelp on package bcrypt: [1mNAME[0m bcrypt - OpenBSD Blowfish password hashing. [1mFILE[0m /usr/lib/python2.4/site-packages/bcrypt/__init__.py [1mDESCRIPTION[0m This module implements the OpenBSD Blowfish password hashing algorithm, as described in "A Future-Adaptable Password Scheme" by Niels Provos and David Mazieres. This system hashes passwords using a version of Bruce Schneier's Blowfish block cipher with modifications designed to raise the cost of off-line password cracking. The computation cost of the algorithm is parametised, so it can be increased as computers get faster. Passwords are hashed using the hashpw() routine: hashpw(password, salt) -> hashed_password Salts for the the second parameter may be randomly generated using the gensalt() function: gensalt(log_rounds = 12) -> random_salt The parameter "log_rounds" defines the complexity of the hashing. The cost increases as 2**log_rounds. [1mPACKAGE CONTENTS[0m _bcrypt [1mFUNCTIONS[0m [1mencode_salt[0m(...) encode_salt(csalt, log_rounds) -> encoded_salt Encode a raw binary salt and the specified log2(rounds) as a standard bcrypt text salt. Used internally by bcrypt.gensalt() [1mgensalt[0m(log_rounds=12) Generate a random text salt for use with hashpw(). "log_rounds" [42;1H[K[7mlines 1-41 [27m[42;1H[K[?1l>[?1049l >>> help(bcrypt) >>> [Khelp(bcrypt) [?1049h[?1h=[42;1H[KHelp on package bcrypt: [1mNAME[0m bcrypt - OpenBSD Blowfish password hashing. [1mFILE[0m /usr/lib/python2.4/site-packages/bcrypt/__init__.py [1mDESCRIPTION[0m This module implements the OpenBSD Blowfish password hashing algorithm, as described in "A Future-Adaptable Password Scheme" by Niels Provos and David Mazieres. This system hashes passwords using a version of Bruce Schneier's Blowfish block cipher with modifications designed to raise the cost of off-line password cracking. The computation cost of the algorithm is parametised, so it can be increased as computers get faster. Passwords are hashed using the hashpw() routine: hashpw(password, salt) -> hashed_password Salts for the the second parameter may be randomly generated using the gensalt() function: gensalt(log_rounds = 12) -> random_salt The parameter "log_rounds" defines the complexity of the hashing. The cost increases as 2**log_rounds. [1mPACKAGE CONTENTS[0m _bcrypt [1mFUNCTIONS[0m [1mencode_salt[0m(...) encode_salt(csalt, log_rounds) -> encoded_salt Encode a raw binary salt and the specified log2(rounds) as a standard bcrypt text salt. Used internally by bcrypt.gensalt() [1mgensalt[0m(log_rounds=12) Generate a random text salt for use with hashpw(). "log_rounds" [42;1H[K[7mlines 1-41 [27m[42;1H[K[?1l>[?1049l >>> bcrypt.hashpw ("password", gensalt(bgensalt(cgensalt(rgensalt(ygensalt(pgensalt(tgensalt(.gensalt( >>> bcrypt.hashpw ("password", bcrypt.g >>> bcrypt.hashpw ("password", bcrypt.ge >>> bcrypt.hashpw ("password", bcrypt.gen >>> bcrypt.hashpw ("password", bcrypt.gens >>> bcrypt.hashpw ("password", bcrypt.gensa >>> bcrypt.hashpw ("password", bcrypt.gensal >>> bcrypt.hashpw ("password", bcrypt.gensalt >>> bcrypt.hashpw ("password", bcrypt.gensalt(8)) '$2a$08$sckI/qqNsYZF7pghe4dZjO/BZmwKedPHNA8J8sWDDGJws0ixVAsOm' >>> ]0;root@class305: /root[root@class305 ~]# vim [K[K[K[Kpython -c 'import bcrypt,[K; print bcrypt.hashpw ("password", bcrypt.gensalt(8))' $2a$08$Ty7PEbsGYa4FB3FbbQ6vwu6aFofEZVUnAURYSs9c57Kp17IFEBGWy ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.hashpw ("password", bcrypt.gensalt(8))' $2a$08$Q2sqERhq3tdZgaBZtIMasOPU1WpMeHaTfzKqGrfG9HUIikW.R0IZK ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.hashpw ("password", bcrypt.gensalt(8))' $2a$08$pl63efovjGw8aaOZaRtGgObE72Ek.ePTQeVMspOwz5KEOoR99Yu/K ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.hashpw ("password", bcrypt.gensalt(8))' [root@class305 ~]# python -c 'import bcrypt; print bcrypt.hashpw ("password", bcrypt.gensalt(8))' [root@class305 ~]# python[K -c 'import bcrypt; print bcrypt.hashpw ("password", bcrypt.gensalt(8))' [root@class305 ~]# python -c 'import bcrypt; print bcrypt.hashpw ("password", bcrypt.gensalt(8))[1P'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pbcrypt.gensalt(8)'[1Pcrypt.gensalt(8)' $2a$08$pL2BfFAh2EElwaGcpLta1O ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.gensalt(8)' $2a$08$1G23OcIEnkjMpTBHxB1QEO ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.gensalt(8)' $2a$08$T1t4xsEpGhNXKl/vlLK7pu ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.gensalt(8)' $2a$08$BQVPZKwo/owsSvQreWwiK. ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.gensalt(8)' $2a$08$fpl1rrf2jYrrZ3kedB4E4u ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.gensalt(8)' $2a$08$cH35yzoCJ15qKiYnpQUwVu ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.gensalt(8)'[1P)'9)' $2a$09$lQTpt2S/N5gQU9Jn0n9Kc. ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.gensalt(9)'[1P)'4)'2)' $2a$31$RLjSHOfBKvJZqbJKZD8Er. ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.gensalt(42)' | wc -c 30 ]0;root@class305: /root[root@class305 ~]# python -c 'import bcrypt; print bcrypt.hashpw ("password", bcrypt.gensalt(8))' | wc -c 61
- Кто знает перл, пользуется перлом для той же цели. Специальной утилиты для этого нет. Это та штука, которую можно использовать для задания пароля. Почему лектор это вспомнил: если нужно создать кучу пользователей, и вы хотите просто написать скрипт, который заводит много пользователей и задаёт им какие-то пароли, то этот пароль можно либо заранее сгенерировать, взять от него хэш из passwd и подставлять, либо можно его вычислять на основании имени и ещё чего-то, либо как-то генерировать пароль pwgen'ом, его превращать в хэш, а пользователю отдавать пароль.
# pwgen oi1Sieg1 Coovah3o chi1Et7t zei0Ub0A aeQua4Sh Oyei6aij aebe3Eod uafai1Pa vu1AiFiu Phe4Eep5 aZiesh4o pheeBi2a Ahvo5cu8 Jei9Efae giK2aide Nohf6bah Gi2heira eis7te6Z rai4eeSh GeeK9ui5 aesh6Ud6 nuiCe5im aphai8oX oChoo9Sh UChek0He akei6Ien Reib8ahk xooJ3sai vaeL7miu up4saeSo wiith9Es choD7iex pheV2ohf ahY0ooCh uekohv9A ood8Awae ekaiHah9 Chif5toH iF4ga1es ePhah0Ai jaiShee7 Asa6GeeB iezou1Do bie7eeRe Luxieng3 keiZee5A Pach3Voo Iish5Wie aiv5ra5O Quahgo8s deeXae2f ohVa7OhD pieh8aeH HahGhae6 eebai6Je iZooch9I Bub7pee1 ep9NaPhe Bahveiv5 Eechee8g Wae6jogh Uch8eoxe Mokaet2t ech7OeKa Aingeew8 zub1ohSo koTae2ek dohn1Ahk Ceim8Foo cee9eeTh UGho4nah Cho4aiTh shiwee8I faecie0S aKaa8uen iezei6Qu EeHiiha7 Eexiech6 muWea6du ReeYi2he vei7aiCe aiDohj0o iuSaum3f ca2queeL quaek1Ca ai5Iu3aC ieWe5We6 Cohk3ei9 mo1SeiG8 XeeN7aej GooTh0fa tie5TaeJ bah9ooSh nah2Dai7 aiCe0oeW Bah8Zuye yohv5Eet aegie5Uz iZie6ca6 iw4Jaib4 oGhee9ie taexoe5A eeY6iehu ibaew6Vu xie2Ieh8 eihe6eTa ooMe0oga ahli6eB7 ba2eaRah om7eiT2i Ie8shiWe Uiya3eew Kai9ni2d Shoh2ePh EiZ4fe9Z ieSeipo0 ahxoi5Ee uNochae9 JooXo5uu BareiV0x aa4Ishi2 jae9ohXa AeFo7Tha Zohthoo1 Ua4eeTho zo9Oa0Ph caiN7zeb bueZ2the eelui6Ue joo8Baat phee8Tae ieQue4th eiya7eiJ ahGo7tho usoh7AhK mee9Fiec au7Oow6u ohn8ohJu phij8Toh aigi1EiZ oZahmah0 quooGae3 Quaej7tu Ceexu7da Quae4huz hoPhei6s Ahp3oopu aeGh7heg sah7ahMa ahCh0iit eiquae2A eixae7Uc ingahCh5 Yai7ohve ohC3quee joth3Bay voyai8Bo shuNgoo3 wai5Kaiv ieJah3Ei
Pwgen'ом можно регулировать длину пароля, символы и т.п. В общем, если вам лень придумывать пароль по алгоритму, который был описан вчера, используйте pwgen.
Что ещё осталось на эту тему: мы создали пользователя admin, и он добавился только в одну группу --- wheel. А неплохо было бы добавить его в другие группы. Зачем добавлять пользователя в большое количество групп? При работе (в особенности с десктпом) было бы неплохо первому залогиненому пользователю выдать доступ к различным ресурсам (съёмным дискам, аудио, ...). Первому пользователю, ктрый зарегистрировался в системе, модуль pam'а выдаёт некие устройства из числа нахдящихся в /dev. Реально выдаёт, он меняет им uid, можно посмотреть ls -l /dev/ | grep имя искомого пользователя.
# ls -l /dev/ | grep saj crw-rw---- 1 saj audio 14, 12 Jul 31 2008 adsp crw-rw---- 1 saj audio 14, 4 Jul 31 2008 audio crw------- 1 saj root 5, 1 Jul 31 14:07 console crw-rw---- 1 saj audio 14, 25 Jul 31 2008 dmmidi1 crw-rw---- 1 saj audio 14, 3 Jul 31 2008 dsp crw------- 1 saj root 29, 0 Jul 31 2008 fb0 brw-rw---- 1 saj floppy 2, 0 Jul 31 2008 fd0 brw-rw---- 1 saj floppy 2, 84 Jul 31 2008 fd0u1040 brw-rw---- 1 saj floppy 2, 88 Jul 31 2008 fd0u1120 brw-rw---- 1 saj floppy 2, 28 Jul 31 2008 fd0u1440 brw-rw---- 1 saj floppy 2, 124 Jul 31 2008 fd0u1600 brw-rw---- 1 saj floppy 2, 44 Jul 31 2008 fd0u1680 brw-rw---- 1 saj floppy 2, 60 Jul 31 2008 fd0u1722 brw-rw---- 1 saj floppy 2, 76 Jul 31 2008 fd0u1743 brw-rw---- 1 saj floppy 2, 96 Jul 31 2008 fd0u1760 brw-rw---- 1 saj floppy 2, 116 Jul 31 2008 fd0u1840 brw-rw---- 1 saj floppy 2, 100 Jul 31 2008 fd0u1920 brw-rw---- 1 saj floppy 2, 12 Jul 31 2008 fd0u360 brw-rw---- 1 saj floppy 2, 16 Jul 31 2008 fd0u720 brw-rw---- 1 saj floppy 2, 120 Jul 31 2008 fd0u800 brw-rw---- 1 saj floppy 2, 52 Jul 31 2008 fd0u820 brw-rw---- 1 saj floppy 2, 68 Jul 31 2008 fd0u830 srwx------ 1 saj root 0 Jul 31 14:07 gpmctl brw-r----- 1 saj cdrom 22, 0 Jul 31 2008 hdc crw-rw---- 1 saj audio 14, 18 Jul 31 2008 midi1 crw-rw---- 1 saj audio 14, 0 Jul 31 2008 mixer crw-rw---- 1 saj audio 14, 16 Jul 31 2008 mixer1 crw-rw---- 1 saj audio 14, 1 Jul 31 2008 sequencer crw-rw---- 1 saj audio 14, 8 Jul 31 2008 sequencer2
А ещё в этом /dev есть куча устройств, которым специальный модуль pam'a ничего не меняет, которые принадлежат не к группе root или wheel, а к группе audio, floppy и т.д. Для этого-то и нужно включать пользователя в эти группы, чтобы он имел туда доступ.
Возвращаемся к теме. Как добавить пользователя в группу: в стандартном POSIX добавление/удаление в группах не было реализовано на уровне команды. Предполагалось, что сделать это легко: человек берёт текстовый редактор и вписывает, что нужно, в /etc/group. Ещё можно сказать usermod -G, и пишете список групп, в которых пользователь должен быть членом. Проблемма состоит в том, что если он уже член десяти групп, вам нужно сначала получить десять групп, потом добавить туда те, которые вы хотите и поле этого только добавлять. В общем, не атомарная операция. В альте для этго есть команда gpasswd.
# gpasswd -a admin xgrp proc Adding user admin to group proc
Сведения о ресурсах
Готовность (%) |
Продолжительность (ак. ч.) |
Подготовка (календ. ч.) |
Полный текст (раб. д.) |
Предварительные знания |
Level |
Maintainer |
Start date |
End date |
21 |
1 |
1 |
1 |
|
1 |
|
|