since2012/04/23

     
 
最近升级日期:2009/09/09

大标题的图示手动新增使用者

一般来说,我们不很建议大家使用手动的方式来新增使用者,为什么呢? 因为使用者的创建涉及到 GID/UID 等权限的关系,而且,与文件/目录的权限也有关系, 使用 useradd 可以帮我们自动配置好 UID/GID 家目录以及家目录相关的权限配置, 但是,手动来添加的时候,有可能会忘东忘西,结果导致一些困扰的发生。

不过,要了解整个系统,最好还是手动来修改过比较好,至少我们的账号问题可以完全依照自己的意思去修订, 而不必迁就于系统的默认值啊!但是,还是要告诫一下朋友们,要手动配置账号时, 您必须要真的很了解自己在作什么,尤其是与权限有关的配置方面喔!好吧!底下就让我们来玩一玩啰~ ^_^


小标题的图示一些检查工具

既然要手动修改账号的相关配置文件,那么一些检查群组、账号相关的命令就不可不知道啊~ 尤其是那个口令转换的 pwconv 及 pwuconv 这两个玩意~可重要的很呢!底下我们稍微介绍一下这些命令吧!


  • pwck

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 这个命令的啦!


  • pwconv

这个命令主要的目的是在『将 /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 就很重要啰!


  • pwunconv

相对于 pwconv , pwunconv 则是『将 /etc/shadow 内的口令栏数据写回 /etc/passwd 当中, 并且删除 /etc/shadow 文件。』这个命令说实在的,最好不要使用啦! 因为他会将你的 /etc/shadow 删除喔!如果你忘记备份,又不会使用 pwconv 的话,粉严重呢!


  • chpasswd

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 有关,因此,整个动作是这样的:

  1. 先创建所需要的群组 ( vi /etc/group );
  2. 将 /etc/group 与 /etc/gshadow 同步化 ( grpconv );
  3. 创建账号的各个属性 ( vi /etc/passwd );
  4. 将 /etc/passwd 与 /etc/shadow 同步化 ( pwconv );
  5. 创建该账号的口令 ( passwd accountname );
  6. 创建用户家目录 ( cp -a /etc/skel /home/accountname );
  7. 更改用户家目录的属性 ( 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

总之,账号管理是很重要的!希望上面的说明能够对大家有点帮助啦!


 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室