1.每个登陆的使用者至少都会取得两个 ID ,一个是使用者 ID (User ID ,简称 UID)、一个是群组 ID (Group ID ,简称 GID)。
2.用户账号
(1)/etc/passwd 文件结构:
每一行都代表一个账号,有几行就代表有几个账号在你的系统中! 不过需要特别留意的是,里头很多账号本来就 是系统正常运行所必须要的,我们可以简称他为系统账号, 例如 bin, daemon, adm, nobody 等等,这些账号 请 不要随意的杀掉他呢!
七个字段:
[root@www ~]# head -n 4 /etc/passwd
root:x:0:0:root:/root:/bin/bash <==等一下做为底下说明用
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
账号名称;密码;UID;GID;用户信息说明列;主文件夹;Shell
(2)/etc/shadow 文件结构:
各程序当然需要读取 /etc/passwd 来了解不同账号的权限。 因此 /etc/passwd 的权限需配置为 -rw-r--r--
[root@www ~]# head -n 4 /etc/shadow
root:$1$/30QpE5e$y9N/D0bh6rAACBEz.hqo00:14126:0:99999:7::: <==底下说明用
bin:*:14126:0:99999:7:::
daemon:*:14126:0:99999:7:::
adm:*:14126:0:99999:7:::
九个字段:
账号名称;密码;最近更动密码的日期;密码不可被更动的天数;密码需要重新更改的天数;密码需要更改期限前的警告天数;密码过期后的账号宽限时间;账号失效时间;保留;
3.有效的初始用户组:groups,newgrp
(1)/etc/group 文件结构
[root@www ~]# head -n 4 /etc/group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
用户组名称,用户组密码,GID,此用户组支持的账号名称
groups: 有效与支持群组的查看
newgrp: 有效用户组的切换
(2)/etc/gshadow
[root@www ~]# head -n 4 /etc/gshadow
root:::root
bin:::root,bin,daemon
daemon:::root,bin,daemon
sys:::root,bin,adm
组名;
口令栏,同样的,开头为 ! 表示无合法口令,所以无群组管理员;
群组管理员的账号 (相关信息在 gpasswd 中介绍);
该群组的所属账号 (与 /etc/group 内容相同!)
4.新增与移除使用者: useradd
[root@www ~]# useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\
> [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号名
选项与参数:
-u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个账号;
-g :后面接的那个组名就是我们上面提到的 initial group 啦~
该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。
-G :后面接的组名则是这个账号还可以加入的群组。
这个选项与参数会修改 /etc/group 内的相关数据喔!
-M :强制!不要创建用户家目录!(系统账号默认值)
-m :强制!要创建用户家目录!(一般账号默认值)
-c :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们配置的啦~
-d :指定某个目录成为家目录,而不要使用默认值。务必使用绝对路径!
-r :创建一个系统的账号,这个账号的 UID 会有限制 (参考 /etc/login.defs)
-s :后面接一个 shell ,若没有指定则默认是 /bin/bash 的啦~
-e :后面接一个日期,格式为『YYYY-MM-DD』此项目可写入 shadow 第八字段,
亦即账号失效日的配置项目啰;
-f :后面接 shadow 的第七字段项目,指定口令是否会失效。0为立刻失效,
-1 为永远不失效(口令只会过期而强制于登陆时重新配置而已。)
5. Passwd
[root@www ~]# passwd [--stdin] <==所有人均可使用来改自己的口令
[root@www ~]# passwd [-l] [-u] [--stdin] [-S] \
> [-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号 <==root 功能
6. Usermod
可以直接到 /etc/passwd 或 /etc/shadow 去修改相对应字段的数据, 不过,Linux 也有提供相关的命令让大家来进行账号相关数据的微调。
[root@www ~]# usermod [-cdegGlsuLU] username
7. Userdel
删除用户的相关数据,而用户的数据有:
用户账号/口令相关参数:/etc/passwd, /etc/shadow
使用者群组相关参数:/etc/group, /etc/gshadow
用户个人文件数据: /home/username, /var/spool/mail/username.
[root@www ~]# userdel [-r] username
8.用户功能
(1)Finger
查阅很多用户相关的信息
[root@www ~]# finger [-s] username
选项与参数:
-s :仅列出用户的账号、全名、终端机代号与登陆时间等等;
-m :列出与后面接的账号相同者,而不是利用部分比对 (包括全名部分)
(2)Chfn
[root@www ~]# chfn [-foph] [账号名]
选项与参数:
-f :后面接完整的大名;
-o :您办公室的房间号码;
-p :办公室的电话号码;
-h :家里的电话号码!
(3)Chsh
[vbird1@www ~]$ chsh [-ls]
选项与参数:
-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容!
-s :配置修改自己的 Shell 啰
(4)Id
[root@www ~]# id [username]
9.新增与删除用户组
Groupadd; groupmod 简单修改; groupdel;
10.什么是 ACL
ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的 read,write,execute 权限之外的细部权限配置。ACL 可以针对单一使用者,单一文件或目录来进行 r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。
11.ACL 的配置技巧: getfacl, setfacl
getfacl:取得某个文件/目录的 ACL 配置项目;
setfacl:配置某个目录/文件的 ACL 规范。
12.用户身份切换:
(1)Su
(2)Sudo:
并非所有人都能够运行 sudo , 而是仅有规范到 /etc/sudoers 内的用户才能够运行 sudo
执行流程:
当用户运行 sudo 时,系统于 /etc/sudoers 文件中搜寻该使用者是否有运行 sudo 的权限;
若使用者具有可运行 sudo 的权限后,便让使用者『输入用户自己的口令』来确认;
若口令输入成功,便开始进行 sudo 后续接的命令(但 root 运行 sudo 时,不需要输入口令);
若欲切换的身份与运行者身份相同,那也不需要输入口令。
13.PAM 模块简介
PAM 可以说是一套应用程序编程接口 (Application Programming Interface, API),他提供了一连串的验证机制,只要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 (成功或失败)。
14.PAM 模块配置语法
PAM 藉由一个与程序相同文件名的配置文件来进行一连串的认证分析需求。我们同样以 passwd 这个命令的呼叫 PAM 来说明好了。 当你运行 passwd 后,这支程序呼叫 PAM 的流程是:
用户开始运行 /usr/bin/passwd 这支程序,并输入口令;
passwd 呼叫 PAM 模块进行验证;
PAM 模块会到 /etc/pam.d/ 找寻与程序 (passwd) 同名的配置文件;
依据 /etc/pam.d/passwd 内的配置,引用相关的 PAM 模块逐步进行验证分析;
将验证结果 (成功、失败以及其他信息) 回传给 passwd 这支程序;
passwd 这支程序会根据 PAM 回传的结果决定下一个动作 (重新输入新口令或者通过验证!)
15.查询使用者: w, who, last, lastlog
用户对谈: write, mesg, wall
用户邮件信箱: mail
16.一些检查工具:
Pwck
pwck 这个命令在检查 /etc/passwd 这个账号配置文件内的信息,与实际的家目录是否存在等信息, 还可以比对 /etc/passwd /etc/shadow 的信息是否一致,另外,如果 /etc/passwd 内的数据字段错误时,会提示使用者修订。
Pwconv:
比对 /etc/passwd 及 /etc/shadow ,若 /etc/passwd 内存在的账号并没有对应的 /etc/shadow 口令时,则 pwconv 会去 /etc/login.defs 取用相关的口令数据,并创建该账号的 /etc/shadow 数据;
若 /etc/passwd 内存在加密后的口令数据时,则 pwconv 会将该口令栏移动到 /etc/shadow 内,并将原本的 /etc/passwd 内相对应的口令栏变成 x !
pwunconv
相对于 pwconv , pwunconv 则是『将 /etc/shadow 内的口令栏数据写回 /etc/passwd 当中, 并且删除 /etc/shadow 文件。』这个命令说实在的,最好不要使用啦! 因为他会将你的 /etc/shadow 删除喔!如果你忘记备份,又不会使用 pwconv 的话,粉严重呢!
chpasswd
chpasswd 是个挺有趣的命令,他可以『读入未加密前的口令,并且经过加密后, 将加密后的口令写入 /etc/shadow 当中。
17.批量新建账号模板
由于 CentOS 5.x 的 passwd 已经提供了 --stdin 的功能,因此如果我们可以提供账号口令的话, 那么就能够很简单的建置起我们的账号口令了。底下鸟哥制作一个简单的 script 来运行新增用户的功能喔!
[root@www ~]# vi account1.sh
#!/bin/bash
# 这支程序用来创建新增账号,功能有:
# 1. 检查 account1.txt 是否存在,并将该文件内的账号取出;
# 2. 创建上述文件的账号;
# 3. 将上述账号的口令修订成为『强制第一次进入需要修改口令』的格式。
# 2009/03/04 VBird
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
# 检查 account1.txt 是否存在
if [ ! -f account1.txt ]; then
echo "所需要的账号文件不存在,请创建 account1.txt ,每行一个账号名称"
exit 1
fi
usernames=$(cat account1.txt)
for username in $usernames
do
useradd $username <==新增账号
echo $username | passwd --stdin $username <==与账号相同的口令
chage -d 0 $username <==强制登陆修改口令
done
接下来只要创建 account1.txt 这个文件即可!鸟哥创建这个文件里面共有十行,你可以自行创建该文件! 内容每一行一个账号。注意,最终的结果会是每个账号具有与账号相同的口令,且初次登陆后, 必须要重新配置口令后才能够再次登陆使用系统资源!
[root@www ~]# vi account1.txt
std01
std02
std03
std04
std05
std06
std07
std08
std09
std10
[root@www ~]# sh account1.sh
Changing password for user std01.
passwd: all authentication tokens updated successfully.
....(后面省略)....
范例:
#!/bin/bash
#
# 这支程序主要在帮您创建大量的账号之用,更多的使用方法请参考:
# http://cn.linux.vbird.org/linux_basic/0410accountmanager.php#manual_amount
#
# 本程序为鸟哥自行开发,在 CentOS 5.x 上使用没有问题,
# 但不保证绝不会发生错误!使用时,请自行负担风险~
#
# History:
# 2005/09/05 VBird 刚刚才写完,使用看看先~
# 2009/03/04 VBird 加入一些语系的修改与说明,修改口令产生方式 (用 openssl)
export LANG=zh_TW.big5
export PATH=/sbin:/usr/sbin:/bin:/usr/bin
accountfile="user.passwd"
# 1. 进行账号相关的输入先!
echo ""
echo "例如我们昆山四技的学号为: 4960c001 到 4960c060 ,那么:"
echo "账号开头代码为 :4"
echo "账号层级或年级为 :960c"
echo "号码数字位数为(001~060):3"
echo "账号开始号码为 :1"
echo "账号数量为 :60"
echo ""
read -p "账号开头代码 ( Input title name, ex> std )======> " username_start
read -p "账号层级或年级 ( Input degree, ex> 1 or enter )=> " username_degree
read -p "号码部分的数字位数 ( Input \# of digital )======> " nu_nu
read -p "起始号码 ( Input start number, ex> 520 )========> " nu_start
read -p "账号数量 ( Input amount of users, ex> 100 )=====> " nu_amount
read -p "口令标准 1) 与账号相同 2)随机数自定义 ==============> " pwm
if [ "$username_start" == "" ]; then
echo "没有输入开头的代码,不给你运行哩!" ; exit 1
fi
# 判断数字系统
testing0=$(echo $nu_nu | grep '[^0-9]' )
testing1=$(echo $nu_amount | grep '[^0-9]' )
testing2=$(echo $nu_start | grep '[^0-9]' )
if [ "$testing0" != "" -o "$testing1" != "" -o "$testing2" != "" ]; then
echo "输入的号码不对啦!有非为数字的内容!" ; exit 1
fi
if [ "$pwm" != "1" ]; then
pwm="2"
fi
# 2. 开始输出账号与口令文件!
[ -f "$accountfile" ] && mv $accountfile "$accountfile"$(date +%Y%m%d)
nu_end=$(($nu_start+$nu_amount-1))
for (( i=$nu_start; i<=$nu_end; i++ ))
do
nu_len=${#i}
if [ $nu_nu -lt $nu_len ]; then
echo "数值的位数($i->$nu_len)已经比你配置的位数($nu_nu)还大!"
echo "程序无法继续"
exit 1
fi
nu_diff=$(( $nu_nu - $nu_len ))
if [ "$nu_diff" != "0" ]; then
nu_nn=0000000000
nu_nn=${nu_nn:1:$nu_diff}
fi
account=${username_start}${username_degree}${nu_nn}${i}
if [ "$pwm" == "1" ]; then
password="$account"
else
password=$(openssl rand -base64 6)
fi
echo "$account":"$password" | tee -a "$accountfile"
done
# 3. 开始创建账号与口令!
cat "$accountfile" | cut -d':' -f1 | xargs -n 1 useradd -m
chpasswd < "$accountfile"
pwconv
echo "OK!创建完成!"