$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
rich:x:500:500:Rich Blum:/home/rich:/bin/bash
...
rich:$1$.FfcK0ns$f1UgiyHQ25wrB/hykCn020:11627:0:99999:7:::
用来向 Linux 系统添加新用户的主要工具是 useradd。该命令可以一次性轻松创建新用户账 户并设置用户的$HOME 目录结构。 useradd 命令使用系统的默认值以及命令行参数来设置用户 账户。要想查看所使用的 Linux 发行版的系统默认值,可以使用加入了-D 选项的 useradd 命令。
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
useradd 命令的默认值使用/etc/default/useradd 文件设置。另外,进一步的安全设置在 /etc/login.defs 文件中定义。可以调整这些文件,改变 Linux 系统默认的安全行为。
-D 选项显示了在命令行中创建新用户账户时, 如果不明确指明具体值, useradd 命令所使用的默认值。这些默认值的含义如下。
useradd 命令允许管理员创建默认的 H O M E 目录配置,然后将其作为创建新用户 HOME 目录配置,然后将其作为创建新用户 HOME目录配置,然后将其作为创建新用户HOME 目录的模板。这样就能自动在每个新用户的$HOME 目录里放置默认的系统文件了。
/etc/skel 目录下是bash shell 环境的标准启动文件。系统会自动将这些默认文件复制到你创建的每个用户的$HOME 目录。
对很多 Linux 发行版而言, useradd 命令默认并不创建 H O M E 目录,但是 − m 命令行选项会使其创建 HOME 目录,但是-m 命令行选项会使其创建 HOME目录,但是−m命令行选项会使其创建HOME 目录。可以在/etc/login.defs 文件中更改该行为。
用户账户管理命令需要以 root 用户账户登录或者通过 sudo 命令运行。
要想在创建新用户时改变默认值或默认行为,可以使用相应的命令行选项(但如果总是需要改动某个值, 则最好还是修改一下系统默认值),useradd 命令行选项如下:
| 选项 | 描述 |
|---|---|
| -c comment | 给新用户添加备注 |
| -d home_dir | 为主目录指定一个名字(如果不想用登录名作为主目录名的话) |
| -e expire_date | 用 YYYY-MM-DD 格式指定账户过期日期 |
| -f inactive_days | 指定账户密码过期多少天后禁用该账户; 0 表示密码一过期就立即禁用, -1 表示不使用这个功能 |
| -g initial_group | 指定用户登录组的 GID 或组名 |
| -G group … | 指定除登录组之外用户所属的一个或多个附加组 |
| -k | 必须和-m 一起使用,将/etc/skel 目录的内容复制到用户的$HOME 目录 |
| -m | 创建用户的$HOME 目录 |
| -M | 不创建用户的$HOME 目录,即便默认设置里要求创建 |
| -n | 创建一个与用户登录名同名的新组 |
| -r | 创建系统账户 |
| -p passwd | 为用户账户指定默认密码 |
| -s shell | 指定默认的登录 shell |
| -u uid | 为账户指定一个唯一的 UID |
可以使用-D 选项来修改系统默认的新用户设置。相应的选项如下:
| 选项 | 描述 |
|---|---|
| -b default_home | 修改用户$HOME 目录默认创建的位置 |
| -e expiration_date | 修改新账户的默认过期日期 |
| -f inactive | 修改从密码过期到账户被禁用的默认天数 |
| -g group | 修改默认的组名称或 GID |
| -s shell | 修改默认的登录 shell |
# useradd -D -s /bin/tsch
# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/tsch
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
#
用户账户修改工具:
| 命令 | 描述 |
|---|---|
| usermod | 修改用户账户字段,还可以指定主要组(primary group )以及辅助组(secondary group )的所属关系 |
| passwd | 修改已有用户的密码 |
| chpasswd | 从文件中读取登录名及密码并更新密码 |
| chage | 修改密码的过期日期 |
| chfn | 修改用户账户的备注信息 |
| chsh | 修改用户账户的默认登录 shell |
usermod 命令是用户账户修改工具中最强大的一个, 提供了修改/etc/passwd 文件中大部分 字段的相关选项,只需指定相应的选项即可。大部分选项与 useradd 命令的选项一样(比如-c 用于修改备注字段, -e 用于修改过期日期, -g 用于修改默认的登录组)。除此之外,还有另外 一些也许能派上用场的选项。
passwd 命令可以方便地修改用户密码。如果只使用 passwd 命令, 则修改的是你自己的密码。系统中的任何用户都能修改自己的密 码,但只有 root 用户才有权限修改别人的密码。
chpasswd 命令可以为系统中的大量用户修改密码。chpasswd 命令能从标准输入自动读取一系列以冒号分隔的登录名和密码对偶(login name and password pair), 自动对密码加密, 然后为用户账户设置密码。你也可以用重定向命令将包含 username:password 对偶的文件重定向给该命令。
# chpasswd < users.txt
chsh、chfn 和 chage 用于修改特定的账户信息。 chsh 命令可以快速修改默认的用户登录 shell。使用时必须用 shell 的全路径名作为参数, 不能只用 shell 名。
# chsh -s /bin/csh test
Changing shell for test.
Shell changed.
chfn 命令提供了在/etc/passwd 文件的备注字段中保存信息的标准方法。chfn 命令会将用于 Unix 的 finger 命令的信息存入备注字段, 而不是简单地写入一些随机文本(比如名字或昵称之 类), 或是干脆将备注字段留空。
finger 命令可以非常方便地查看 Linux 系统的用户信息。出于安全性的考虑,大多数Linux 发行版没有默认安装 finger命令。请注意,安装该命令可能会使你的系统受到攻击漏洞的影响。
如果使用 chfn 命令时不加任何选项,则会询问你要将哪些内容写入备注字段:
chage 命令可用于帮助管理用户账户的有效期。相关选项如下:
| 选项 | 描述 |
|---|---|
| -d | 设置自上次修改密码后的天数 |
| -E | 设置密码过期日期 |
| -I | 设置密码过期多少天后锁定账户 |
| -m | 设置更改密码的最小间隔天数 |
| -M | 设置密码的最大有效天数 |
| -W | 设置密码过期前多久开始出现提醒信息 |
chage 命令的日期值可以用下面两种方式中的任意一种表示:
chage 命令的一个好用的功能是设置账户的过期日期。有了它,就可以创建在特定日期自动过期的临时用户,再也不用操心删除用户了。过期的账户跟锁定的账户类似:账户仍然存在,但用户无法用其登录。
root:x:0:root
bin:x:1:root,bin,daemon
...
rich:x:500:
...
$ ls -l
total 68
-rw-rw-r-- 1 rich rich 50 2010-09-13 07:49 file1.gz
...
-rwxrwxr-x 1 rich rich 4882 2010-09-18 13:58 myprog
$ touch newfile
$ ls -al newfile
-rw-r--r-- 1 rich rich 0 Sep 20 19:16 newfile
$ umask
0022
| 权限 | 二进制值 | 八进制值 | 描述 |
|---|---|---|---|
| — | 000 | 0 | 没有任何权限 |
| –x | 001 | 1 | 只有执行权限 |
| -w- | 010 | 2 | 只有写入权限 |
| -wx | 011 | 3 | 有写入和执行权限 |
| r– | 100 | 4 | 只有读取权限 |
| r-x | 101 | 5 | 有读取和执行权限 |
| rw- | 110 | 6 | 有读取和写入权限 |
| rwx | 111 | 7 | 有全部权限(读取、写入和执行) |
$ umask 026
$ touch newfile2
$ ls -l newfile2
-rw-r----- 1 rich rich 0 Sep 20 19:46 newfile2
chmod options mode file
[ugoa...][[+-=][rwxXstugo...]
$ chmod o+r newfile
$ ls -l newfile
-rwxrw-r-- 1 rich rich 0 Sep 20 19:16 newfile
$ chmod u-x newfile
$ ls -l newfile
-rw-rw-r-- 1 rich rich 0 Sep 20 19:16 newfile
chown options owner[.group] file
// 可以使用登录名或 UID 来指定文件的新属主:
# chown dan newfile
# ls -l newfile
-rw-rw-r-- 1 dan rich 0 Sep 20 19:16 newfile
// chown 命令也支持同时修改文件的属主和属组:
# chown dan.shared newfile
# ls -l newfile
-rw-rw-r-- 1 dan shared 0 Sep 20 19:16 newfile
// 可以只修改文件的默认属组:
# chown .rich newfile
# ls -l newfile
-rw-rw-r-- 1 dan rich 0 Sep 20 19:16 newfile
// 如果你的 Linux 系统使用与用户登录名相同的组名,则可以同时修改二者:
# chown test. newfile
# ls -l newfile
-rw-rw-r-- 1 test test 0 Sep 20 19:16 newfile
// shared 组的任意成员都可以写入该文件:
$ chgrp shared newfile
$ ls -l newfile
-rw-rw-r-- 1 rich shared 0 Sep 20 19:16 newfile
Linux 系统中共享文件的方法是创建组。
创建新文件时, Linux 会用默认的UID 和 GID来给文件分配权限。要想让其他用户也能访问文件,要么修改所有用户一级的安全权限, 要么给文件分配一个包含其他用户的新默认属组。
如果想在大范围内创建并共享文件, 这会很烦琐。幸好有一种简单的解决方法。Linux 为每个文件和目录存储了 3 个额外的信息位。
SGID 位对文件共享非常重要。启用 SGID 位后,可以强制在共享目录中创建的新文件都属 于该目录的属组,这个组也就成了每个用户的属组。
SGID 位会强制某个目录下新建文件或目录都沿用其父目录的属组,而不是创建这些文件的用户的属组。这便于系统用户之间共享文件。
可以通过 chmod 命令设置 SGID,将其添加到标准 3 位八进制值之前(组成 4 位八进制值),或者在符号模式下用符号 s。
SUID 、SGID 和粘滞位的八进制值
| 二进制值 | 八进制值 | 描述 |
|---|---|---|
| 000 | 0 | 清除所有位 |
| 001 | 1 | 设置粘滞位 |
| 010 | 2 | 设置 SGID 位 |
| 011 | 3 | 设置 SGID 位和粘滞位 |
| 100 | 4 | 设置 SUID 位 |
| 101 | 5 | 设置 SUID 位和粘滞位 |
| 110 | 6 | 设置 SUID 位和 SGID 位 |
| 111 | 7 | 设置所有位 |
要创建一个共享目录,使目录中的所有新文件都沿用目录的属组,只需设置该目录的 SGID 位。
$ mkdir testdir
$ ls -l
drwxrwxr-x 2 rich rich 4096 Sep 20 23:12 testdir/
$ chgrp shared testdir
$ chmod g+s testdir
$ ls -l
drwxrwsr-x 2 rich shared 4096 Sep 20 23:12 testdir/
$ umask 002
$ cd testdir
$ touch testfile
$ ls -l
total 0
-rw-rw-r-- 1 rich shared 0 Sep 20 23:13 testfile
$ touch test
$ ls -l
total 0
-rw-r----- 1 rich rich 0 Apr 19 17:33 test
$ getfacl test
# file: test
# owner: rich
# group: rich
user::rw-
group::r--
other::---
$
setfacl [options] rule filenames
// 为 test 文件添加了 sales 组的读写权限。
$ setfacl -m g:sales:rw test
$ ls -l
total 0
-rw-rw----+ 1 rich rich 0 Apr 19 17:33 test
// 可以再次使用 getfacl 命令查看 ACL。
$ getfacl test
# file: test
# owner: rich
# group: rich
user::rw-
group::r--
group:sales:rw-
mask::rw-
other::---
// 要想删除权限,可以使用-x 选项:
$ setfacl -x g:sales test
$ getfacl test
# file: test
# owner: rich
# group: rich
user::rw-
group::r--
mask::r--
other::---
$ sudo setfacl -m d:g:sales:rw /sales