一般来说,我们不很建议大家使用手动的方式来新增使用者,为什么呢?
因为使用者的创建涉及到 GID/UID 等权限的关系,而且,与文件/目录的权限也有关系,
使用 useradd 可以帮我们自动配置好 UID/GID 家目录以及家目录相关的权限配置,
但是,手动来添加的时候,有可能会忘东忘西,结果导致一些困扰的发生。
不过,要了解整个系统,最好还是手动来修改过比较好,至少我们的账号问题可以完全依照自己的意思去修订,
而不必迁就于系统的默认值啊!但是,还是要告诫一下朋友们,要手动配置账号时,
您必须要真的很了解自己在作什么,尤其是与权限有关的配置方面喔!好吧!底下就让我们来玩一玩啰~ ^_^
一些检查工具
既然要手动修改账号的相关配置文件,那么一些检查群组、账号相关的命令就不可不知道啊~
尤其是那个口令转换的 pwconv 及 pwuconv 这两个玩意~可重要的很呢!底下我们稍微介绍一下这些命令吧!
pwck 这个命令在检查 /etc/passwd 这个账号配置文件内的信息,与实际的家目录是否存在等信息,
还可以比对 /etc/passwd /etc/shadow 的信息是否一致,另外,如果 /etc/passwd 内的数据字段错误时,会提示使用者修订。
一般来说,我只是利用这个玩意儿来检查我的输入是否正确就是了。
[root@www ~]# pwck
user adm: directory /var/adm does not exist
user uucp: directory /var/spool/uucp does not exist
user gopher: directory /var/gopher does not exist
|
瞧!上面仅是告知我,这些账号并没有家目录,由于那些账号绝大部分都是系统账号,
确实也不需要家目录的,所以,那是『正常的错误!』呵呵!不理他。 ^_^。
相对应的群组检查可以使用 grpck 这个命令的啦!
这个命令主要的目的是在『将 /etc/passwd 内的账号与口令,移动到 /etc/shadow 当中!』
早期的 Unix 系统当中并没有 /etc/shadow 呢,所以,用户的登陆口令早期是在 /etc/passwd
的第二栏,后来为了系统安全,才将口令数据移动到 /etc/shadow 内的。使用 pwconv 后,可以:
- 比对 /etc/passwd 及 /etc/shadow ,若 /etc/passwd 内存在的账号并没有对应的
/etc/shadow 口令时,则 pwconv 会去 /etc/login.defs 取用相关的口令数据,并创建该账号的 /etc/shadow 数据;
- 若 /etc/passwd 内存在加密后的口令数据时,则 pwconv 会将该口令栏移动到 /etc/shadow 内,并将原本的
/etc/passwd 内相对应的口令栏变成 x !
一般来说,如果您正常使用 useradd 添加使用者时,使用 pwconv 并不会有任何的动作,因为 /etc/passwd 与
/etc/shadow 并不会有上述两点问题啊! ^_^。不过,如果手动配置账号,这个 pwconv 就很重要啰!
相对于 pwconv , pwunconv 则是『将 /etc/shadow 内的口令栏数据写回 /etc/passwd 当中,
并且删除 /etc/shadow 文件。』这个命令说实在的,最好不要使用啦!
因为他会将你的 /etc/shadow 删除喔!如果你忘记备份,又不会使用 pwconv 的话,粉严重呢!
chpasswd 是个挺有趣的命令,他可以『读入未加密前的口令,并且经过加密后,
将加密后的口令写入 /etc/shadow 当中。』这个命令很常被使用在大量建置账号的情况中喔!
他可以由 Standard input 读入数据,每笔数据的格式是『 username:password 』。
举例来说,我的系统当中有个用户账号为 dmtsai ,我想要升级他的口令 (update) ,
假如他的口令是 abcdefg 的话,那么我可以这样做:
[root@www ~]# echo "dmtsai:abcdefg" | chpasswd -m
|
神奇吧!这样就可以升级了呢!在默认的情况中, chpasswd 使用的是 DES 加密方法来加密,
我们可以使用 chpasswd -m 来使用 CentOS 5.x 默认的 MD5 加密方法。这个命令虽然已经很好用了,不过 CentOS 5.x
其实已经提供了『 passwd --stdin 』的选项,老实说,这个 chpasswd 可以不必使用了。但考虑其他版本不见得会提供
--stdin 给 passwd 这个命令,所以您还是得要了解一下这个命令用途!
特殊账号,如纯数字账号的手工创建
在我们了解了 UID/GID 与账号的关系之后,基本上,您应该了解了,为啥我们不建议使用纯数字的账号了!因为很多时候,系统会搞不清楚那组数字是『账号』还是『 UID
』,这不是很好啦~也因此,在早期某些版本底下,是没有办法使用数字来创建账号的。例如在 Red Hat 9 的环境中,
使用『 useradd 1234 』他会显示『 useradd: invalid user name '1234' 』了解了吗?
Tips: 在较新的 distribution 当中,纯数字的账号已经可以被 useradd 创建了。不过鸟哥还是非常不建议使用纯数字账号。
例如在 setfacl 的配置值中,若使用『 setfacl -m u:501:rwx filename 』那个 501 代表的是 UID 还是账号?
因为 setfacl 的配置是支持使用 UID 或账号的,纯数字账号很容易造成系统的误解!
| |
不过,有的时候,长官的命令难为啊 @_@ 有时还是得要创建这方面的账号的,那该如何是好?
呵呵!当然可以手动来创建这样的账号啦!不过,为了系统安全起见,鸟哥还是不建议使用纯数字的账号的啦!
因此,底下的范例当中,我们使用手动的方式来创建一个名为 normaluser 的账号,
而且这个账号属于 normalgroup 这个群组。OK!那么整个步骤该如何是好呢?
由前面的说明来看,您应该了解了账号与群组是与 /etc/group, /etc/shadow, /etc/passwd, /etc/gshadow
有关,因此,整个动作是这样的:
- 先创建所需要的群组 ( vi /etc/group );
- 将 /etc/group 与 /etc/gshadow 同步化 ( grpconv );
- 创建账号的各个属性 ( vi /etc/passwd );
- 将 /etc/passwd 与 /etc/shadow 同步化 ( pwconv );
- 创建该账号的口令 ( passwd accountname );
- 创建用户家目录 ( cp -a /etc/skel /home/accountname );
- 更改用户家目录的属性 ( chown -R accountname.group /home/accountname )。
够简单的咯吧!让我们来玩一玩啰~
1. 创建群组 normalgroup ,假设 520 这个 GID 没有被使用!并且同步化 gshadow
[root@www ~]# vi /etc/group
# 在最后一行加入底下这一行!
normalgroup:x:520:
[root@www ~]# grpconv
[root@www ~]# grep 'normalgroup' /etc/group /etc/gshadow
/etc/group:normalgroup:x:520:
/etc/gshadow:normalgroup:x::
# 最后确定 /etc/group, /etc/gshadow 都存在这个群组才行!搞定群组啰!
2. 创建 normaluser 这个账号,假设 UID 700 没被使用掉!
[root@www ~]# vi /etc/passwd
# 在最后一行加入底下这一行!
normaluser:x:700:520::/home/normaluser:/bin/bash
3. 同步化口令,并且创建该用户的口令
[root@www ~]# pwconv
[root@www ~]# grep 'normaluser' /etc/passwd /etc/shadow
/etc/passwd:normaluser:x:700:520::/home/normaluser:/bin/bash
/etc/shadow:normaluser:x:14307:0:99999:7:::
# 确定 /etc/passwd, /etc/shadow 都含有 normaluser 的信息了!但是口令还不对~
[root@www ~]# passwd normaluser
Changing password for user normaluser.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
4. 创建用户家目录,并且修订权限!
[root@www ~]# cp -a /etc/skel /home/normaluser
[root@www ~]# chown -R normaluser:normalgroup /home/normaluser
[root@www ~]# chmod 700 /home/normaluser
|
别怀疑!这样就搞定了一个账号的配置了!
从此以后,你可以创建任何名称的账号啰~不过,还是不建议您配置一些很怪很怪的账号名称啦!
大量建置账号范本(适用 passwd
--stdin 选项)
由于 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.
....(后面省略)....
|
这支简单的脚本你可以在按如下的连结下载:
另外,鸟哥的 script 是在 zh_TW.big5 的语系下创建的,如果你需要转成万国码 (utf8) 的编码格式,
请下载上述文件后,利用第十章谈到的 iconv 来处理语系的问题!
大量建置账号的范例(适用于连续数字,如学号)
前一小节的内容已经可以满足很多朋友的账号建置方法了,不过,某些时候上述的 script 还是很麻烦!
因为需要手动编辑 account1.txt 嘛!如果是类似学校单位这种学号非常类似的账号时,有没有更快的方案?
此外,如果需要每个班级同属于一个群组,不同班级的群组不同,又该如何建置?这是比较麻烦啦!
目前很多网站都有提供大量创建账号的工具,例如台南县网中心的卧龙大师:
提供的好用的 cmpwd 程序,但是小三大师的程序仅供学术单位使用,一般个人是无权使用的(参考上述连结的授权)。
不过,其实我们也可以利用简单的 script 来帮我们达成喔!例如底下这支程序,
他的运行结果与小三大师提供的程序差不多啦~但是因为我是直接以 useradd 来新增的,
所以,即使不了解 UID ,也是可以适用的啦~整支程序的特色是:
- 默认不允许使用纯数字方式创建账号;
- 可加入年级来区分账号;
- 可配置账号的起始号码与账号数量;
- 有两种口令创建方式,可以与账号相同或程序自行以随机数创建口令文件。
运行方法也简单的要命~请自行参考的啦!不再多说~使用时请注意,不要在公家使用的主机上面进行测试,因为.....
这支程序会大量创建账号嘛!^_^
#!/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!创建完成!"
|
如果有需要创建同一班级具有同一群组的话,可以先使用 groupadd 创建群组后,
将该群组加入『 cat "$accountfile" | cut -d':' -f1 | xargs -n 1 useradd -m -g
groupname 』那行!这支脚本可以在底下连结下载:
如果仅是测试而已,想要将刚刚创建的使用者整个删除,则可以使用如下的脚本来进行删除!
[root@www ~]# vi delaccount2.sh
#!/bin/bash
usernames=$(cat user.passwd | cut -d ':' -f 1)
for username in $usernames
do
echo "userdel -r $username"
userdel -r $username
done
[root@www ~]# sh delaccount2.sh
|
总之,账号管理是很重要的!希望上面的说明能够对大家有点帮助啦!