一、前言
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
每个用户账号都拥有一个惟一的用户名和各自的口令,以及每个用户的独有文件夹(/home/用户名),Root用户的目录比较特殊(/ROOT),用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
预设情況下,系统中所有的帐号与一般身份使用者,以及 root 的相关信息,都是记录在 /etc/passwd 文件中,每个人的密码则是记录在 /etc/shadow 文件下, 所有的组群名称记录在 /etc/group 內。
二、用户管理
2.1 用户创建
1)基本语法
useradd 选项 用户名
2)选项
- -c:加上备注文字,备注文字保存在 passwd 的备注栏中
- -d:指定用户登入时的启始目录
- -D:变更预设值
- -e:指定账号的有效期限,缺省表示永久有效
- -f:指定在密码过期后多少天即关闭该账号
- -g:指定用户所属的起始群组
- -G:指定用户所属的附加群组
- -m:自动建立用户的登入目录
- -M:不要自动建立用户的登入目录
- -n:取消建立以用户名称为名的群组
- -r:建立系统账号
- -s:指定用户登入后所使用的 Shell
- -u:指定用户 ID 号
3)实例
useradd –d /usr/txl -m txl
此命令创建了一个用户 txl,其中 -d 和 -m 选项用来为登录名 txl 产生一个主目录 /usr/txl(/usr为默认的用户主目录所在的父目录)。
2.2 用户删除
1)基本语法
userdel 选项 用户名
2)选项
- -r:把用户的主目录一起删除
3)实例
userdel -r txl
此命令删除用户txl在系统文件中(主要是 /etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。
2.3 用户口令管理
用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。
指定和修改用户口令的 Shell 命令是 passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。
1)基本语法
passwd 选项 用户名
普通用户修改自己的口令时,passwd 命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令
2)选项
- -l 锁定口令,即禁用账号。
- -u 口令解锁。
- -d 使账号无口令。
- -f 强迫用户下次登录时修改口令。
3)实例
例如,假设当前用户是 txl,则下面的命令修改该用户自己的口令:
$ passwd Old password:****** New password:******* Re-enter new password:*******
如果是超级用户,可以用下列形式指定任何用户的口令:
# passwd txl New password:******* Re-enter new password:*******
2.4 用户修改
修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录 Shell 等。
1)基本语法
usermod 选项 用户名
2)选项
- -c<备注>:修改用户帐号的备注文字
- -d<登入目录>:修改用户登入时的目录
- -e<有效期限>:修改帐号的有效期限
- -f<缓冲天数>:修改在密码过期后多少天即关闭该帐号
- -g<群组>:修改用户所属的群组
- -G<群组>:修改用户所属的附加群组
- -l<帐号名称>:修改用户帐号名称
- -L:锁定用户密码,使密码无效
- -s<shell>:修改用户登入后所使用的shell
- -u<uid>:修改用户ID
- -U:解除密码锁定
常用的选项包括 -c, -d, -m, -g, -G, -s, -u 以及 -o 等
,这些选项的意义与 useradd
命令中的选项一样,可以为用户指定新的资源值。
另外,有些系统可以使用选项:-l 新用户名,这个选项指定一个新的账号,即将原来的用户名改为新的用户名,如:
usermod -s /bin/ksh -d /home/z –g developer txl
此命令将用户 txl 的登录 Shell 修改为 ksh,主目录改为 /home/z,用户组改为 developer。
3)实例
usermod -s /sbin/nologin txl
此命令禁止用户 txl 进行 Shell 登录。
2.5 用户切换
使用 su 命令切换当前用户身份到其他用户身份,除 root 外,需要键入该使用者的密码。
1)基本语法
su [-] 用户 [选项]
使用 su 命令只是切换了身份,但 Shell 环境仍然是普通用户的 Shell;而使用 su - 则会连用户和 Shell 环境一起切换。
2)选项
- -c <指令> 或 --command=<指令>:执行完指定的指令后,即恢复原来的身份
- -f 或 --fast:适用于 csh 与 tsch,使 shell 不用去读取启动文件
- -l 或 --login:改变身份时,也同时变更工作目录,以及 HOME,SHELL,USER,logname。此外,也会变更 PATH 变量
- -m, -p 或 --preserve-environment:变更身份时,不要变更环境变量
- -s <shell> 或 --shell=<shell>:指定要执行的shell
- --help:显示帮助
- --version;显示版本信息
三、用户组管理
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
3.1 用户组创建
1)基本语法
groupadd 选项 用户组
2)选项
- -g:GID 指定新用户组的组标识号(GID)
- -o:一般与-g选项同时使用,表示新用户组的 GID 可以与系统已有用户组的 GID 相同
3)实例
groupadd group1
此命令向系统中增加了一个新组 group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。
3.2 用户组删除
1)基本语法
groupdel 用户组
2)实例
groupdel group1
此命令从系统中删除组 group1。
3.3 用户组修改
1)基本语法
groupmod 选项 用户组
2)选项
- -g:GID 为用户组指定新的组标识号
- -o:与 -g 选项同时使用,用户组的新 GID 可以与系统已有用户组的 GID 相同
- -n <新用户组>:将用户组的名字改为新名字
3)实例
groupmod –g 10000 -n group3 group2
此命令将组 group2 的标识号改为 10000,组名修改为 group3。
四、文件 /etc/passwd
1)用户名:每个用户的标识字符串,在同一系统中是惟一的,且大小写敏感
2)口令:这里的 x 表示是暗文显示
3)用户标识号(uid):每个用户必须被分配一个userid,0为 root 保留 ID,1-99为系统保留,分配给系统预定义帐号。
Linux用户可以分为3类:超级用户(root 用户标识号是0)、管理用户和普通用户。
系统中有一类用户称为伪用户(psuedo users),这些用户在 /etc/passwd 文件中也占有一条记录,但是不能登录,因为它们的登录Shell为 /sbin/nologin。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。
常见的伪用户:
伪用户 | 含义 |
---|---|
bin | 拥有可执行的用户命令文件 |
sys | 拥有系统文件 |
adm | 拥有帐户文件 |
uucp | UUCP使用 |
lp | lp或lpd子系统使用 |
nobody | NFS使用 |
除了上面列出的伪用户外,还有许多标准的伪用户,例如:audit, cron, mail, usenet 等,它们也都各自为相关的进程和文件所需要。
4)组标识号(gid):字段记录的是用户所属的用户组。它对应着 /etc/group 文件中的一条记录。
5)用户描述:包含有关用户的一些信息,如用户的真实姓名、办公室地址、联系电话等,这个字段并没有什么实际的用途。
6)主目录:用户的起始工作目录,它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。
7)登录 Shell:用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即 Shell,Shell 是用户与 Linux 系统之间的接口
若设置为:/sbin/nologin,则代表这个用户不能登录。这样做的好处是,ftp 用户只能通过 ftp 登录 ftp 服务器,而不能登录到 shell 中。
五、Shell Script 实例
有时候为了安全,我们的软件在运行时不推荐使用 ROOT 账户运行。所以我们会有个初始化 shell 脚本,来创建用户和初始化文件:
- 判断用户是否存在(譬如叫 txl),没有则创建
- 创建后设置密码为123
- 切换为 txl 用户,在它对应环境变量里新建一个shell文件,执行后输出 i am txl,并且除了 root 外,只能 txl 用户运行(root 也不能方便的运行)
5.1 判断用户是否存在
1)通过 /etc/passwd 文件内容判断
USER_COUNT=`cat /etc/passwd | grep '^txl:' -c` if [ $USER_COUNT -gt 0 ] then #... fi
2)通过 Shell 特殊变量判断
useradd txl if [ $? -eq 0 ] then #... fi
Shell 特殊变量:
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 输入的参数的具体内容(将输入的参数作为一个单词) |
$@ | 输入的参数的具体内容(将输入的参数作为一个多个对象,即是所有参数的一个列表) |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
5.2 屏蔽错误提示信息
当执行 useradd txl 时,如果该用户存在,会输出一个错误提示信息,可以通过空设备文件 /dev/null 屏蔽:
useradd txl 2 > /dev/null if [ $? -eq 0 ] then #... fi
/dev/null :代表空设备文件
> :代表重定向到哪里,例如:echo "123" > /home/123.txt
1 :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 :表示stderr标准错误
& :表示等同于的意思,2>&1,表示2的输出重定向等同于1
5.3 设置用户密码
使用 passwd 修改密码需要提示和确认,需要强迫设置:
echo "123" | passwd txl --stdin
stdin:标准输入(键盘)
--stdin:使用非交互模式输入
在 Debian / Ubuntu 中没有该参数,可以使用 chpasswd 命令:
echo txl:123 | chpasswd
完整代码:
# USER_COUNT=`cat /etc/passwd | grep '^txl:' -c` useradd txl 2>/dev/null if [ $? -eq 0 ] then echo "123" | passwd txl --stdin echo "done" else if [ ! -d /home/txl/bin ] then su - txl -c "mkdir bin" echo "bin is created" fi su - txl -c 'echo "echo i am txl" > bin/me' su - txl -c 'chmod u+x bin/me' fi