手动增加使用者
一般来说,我们不很建议大家使用手动的方式来新增使用者,为什么呢? 因为使用者的建立涉及到 GID/UID 等权限的关系,而且,与档案/目录的权限也有关系, 使用 useradd 可以帮我们自动设定好 UID/GID 家目录以及家目录相关的权限设定, 但是,手动来增加的时候,有可能会忘东忘西,结果导致一些困扰的发生。
不过,要瞭解整个系统,最好还是手动来修改过比较好,至少我们的帐号问题可以完全依照自己的意思去修订, 而不必迁就于系统的预设值啊!但是,还是要告诫一下朋友们,要手动设定帐号时, 您必须要真的很瞭解自己在作什么,尤其是与权限有关的设定方面喔! 好吧!底下就让我们来玩一玩啰~ ^_^
一些检查工具
既然要手动修改帐号的相关设定档,那么一些检查群组、帐号相关的指令就不可不知道啊~ 尤其是那个密码转换的 pwconv 及 pwuconv 这两个玩意~可重要的很呢! 底下我们稍微介绍一下这些指令吧!
# pwck
pwck 这个指令在检查 /etc/passwd 这个帐号设定档内的资讯,与实际的家目录是否存在等资讯, 还可以比对 /etc/passwd /etc/shadow 的资讯是否一致,另外, 如果 /etc/passwd 内的资料栏位错误时,会提示使用者修订。 一般来说,我只是利用这个玩意儿来检查我的输入是否正确就是了。
[root@linux ~]# pwck
user adm: directory /var/adm does not exist
user news: directory /etc/news does not exist
user uucp: directory /var/spool/uucp 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@linux ~]# echo "dmtsai:abcdefg" | chpasswd
神奇吧!这样就可以更新了呢!在预设的情况中, chpasswd 使用的是 DES 加密方法来加密, 我们可以使用 chpasswd -m 来使用 FC4 预设的 MD5 加密方法,不过, FC4 似乎怪怪的,我老是无法使用 -m 来达成这个指令。无论如何, 还是可以直接使用 chpasswd 来应用 DES 加密喔! 使用 DES 方法加密后,在 /etc/shadow 的密码栏内,他的密码位数为 13 位, 瞭乎??
小标题的图示特殊帐号,如纯数字帐号的建立
在我们瞭解了 UID/GID 与帐号的关系之后,基本上,您应该瞭解了,为啥我们不建议使用纯数字的帐号了! 因为很多时候,系统会搞不清楚那组数字是‘帐号’还是‘UID’,这不是很好啦~ 也因此,在早期某些版本底下,是没有办法使用数字来建立帐号的。例如在 Red Hat 9 的环境中, 使用‘ useradd 1234 ’他会显示‘ useradd: invalid user name '1234' ’呼呼!瞭解了吗?! (不过,这个问题在 FC4 却不存在!因为 FC4 可以建立纯数字的帐号说~)
不过,有的时候,长官的命令难为啊~有时还是得要建立这方面的帐号的,那该如何是好? 呵呵!当然可以手动来建立这样的帐号啦!不过,为了系统安全起见,鸟哥还是不建议使用纯数字的帐号的啦! 因此,底下的范例当中,我们使用手动的方式来建立一个名为 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@linux ~]# vi /etc/group
# 在最后一行加入底下这一行!
normalgroup:x:520:
[root@linux ~]# grpconv
[root@linux ~]# grep 'normalgroup' /etc/group /etc/gshadow
/etc/group:normalgroup:x:520:
/etc/gshadow:normalgroup:x::
# 简单!搞定群组啰! ^_^
2. 建立 normaluser 这个帐号,假设 UID 700 没被使用掉!
[root@linux ~]# vi /etc/passwd
# 在最后一行加入底下这一行!
normaluser:x:700:520::/home/normaluser:/bin/bash
3. 同步化密码,并且建立该使用者的密码
[root@linux ~]# pwconv
[root@linux ~]# grep 'normaluser' /etc/passwd /etc/shadow
/etc/passwd:normaluser:x:700:520::/home/normaluser:/bin/bash
/etc/shadow:normaluser:x:13030:0:99999:7:::
# 呵呵!没错没错!已经建立妥当啰~但是密码还不对~
[root@linux ~]# passwd normaluser
Changing password for user normaluser.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
4. 建立使用者家目录,并且修订权限!
[root@linux ~]# cp -a /etc/skel /home/normaluser
[root@linux ~]# chown -R normaluser:normalgroup /home/normaluser
别怀疑!这样就搞定了一个帐号的设定了! 从此以后,你可以建立任何名称的帐号啰~不过,还是不建议您设定一些很怪很怪的帐号名称啦!
小标题的图示不开放终端机登入的帐号 (ex>mail acccount)
刚刚我们上面建立的这个帐号是‘可以登入系统的帐号’,如果想要建立一个不能登入系统的帐号, 例如单纯使用邮件收发信件而已的帐号,那么又该如何设定呢?很简单啦~ 你可以这样想:
* 因为不需要登入系统,所以建议 shell 栏位给予 /sbin/nologin ;
* 因为不需要登入,所以家目录也可以先不建立。
也就是说,其实所有的步骤与刚刚上头提到的动作都一样,不过,少掉了很多与家目录有关的设定行为就是了。 底下我假设我的系统里面有个叫做 mail 的群组 (/etc/group) ,他的 GID 是 12 (以 FC4 为例), 另外,这个使用者的帐号为 popuser ,假设 UID 为 720 ,那么该如何建立呢?
1. 修改帐号属性
[root@linux ~]# vi /etc/passwd
popuser:x:720:12::/home/popuser:/sbin/nologin
2. 密码同步,并且给予密码!
[root@linux ~]# pwconv
[root@linux ~]# passwd popuser
这样就又 OK 了~哇!真是太简单了杰克~....
那么又该如何删除这些帐号呢?啊!还是建议利用 userdel 啦~简单~乾脆又俐落~ 如果想要暂时移除而已的话,那么利用 passwd -l 及 passwd -u 吧! ^_^。 如果真的那么想要手动来移除这个帐号的话,就这样做:
1. 先以 find / -user account 找出所有的帐号档案,并将他删除;
2. 将 /etc/passwd 与 /etc/shadow 的相关资料删除;
3. 将 /etc/group 及 /etc/gshadow 相关资料删除;
4. 将 /home 底下关于该帐号的目录删除;
5. 到 /var/spool/mail 以及 /var/spool/cron 里面将相关的使用者档案删除。
这样就手动删除啦~
一个大量建置帐号的范例
不要怀疑,很多时候,我们都可能需要大量的建置帐号的, 举例来说,学校要帮同学建立他们的帐号,那就很可能需要啦~ 一般来说,建立帐号要进行的前制工作很多,包括要建立帐号名称与该帐号的密码对应表~ 这个是最讨厌的啦~而且还要决定需要使用哪一个群组~呼呼~好讨厌的感觉那~
目前很多网站都有提供大量建立帐号的工具,例如台南县网中心的卧龙大师:
提供的好用的 cmpwd 程式, 不过,其实我们也可以利用简单的 script 来帮我们达成喔!例如底下这支程式, 他的执行结果与卧龙大师提供的程式差不多啦~ 但是因为我是直接以 useradd 来新增的, 所以,即使不瞭解 UID ,也是可以适用的啦~
整支程式的特色是:
* 预设不允许使用纯数字方式建立帐号;
* 可加入年级来区分帐号;
* 可设定帐号的起始号码与帐号数量;
* 有两种密码建立方式,可以与帐号相同或程式自行以乱数建立密码档。
执行方法也简单的要命~请自行参考的啦!不再多说~ 使用时请注意,不要在公家使用的主机上面进行测试,因为..... 这支程式会大量建立帐号嘛!^_^
#!/bin/bash
#
# 这支程式主要在帮您建立大量的帐号之用,
# 更多的使用方法请参考:
#
#
# 本程式为鸟哥自行开发,在 FC4 上使用没有问题,
# 但不保证绝不会发生错误!使用时,请自行负担风险~
#
# History:
# 2005/09/05 VBird 刚刚才写完,使用看看先~
PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH
accountfile="user.passwd"
# 1. 进行帐号相关的输入先!
read -p "帐号开头代码 ( Input title name, ex> std )======> " username_start
read -p "帐号层级或年级 ( Input degree, ex> 1 or enter )=> " username_degree
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
testing1=`echo $nu_amount | grep '[^0-9]' `
testing2=`echo $nu_start | grep '[^0-9]' `
if [ "$testing1" != "" ] || [ "$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
account=$username_start$username_degree$i
if [ "$pwm" == "1" ]; then
password="$account"
else
password=""
test_nu=0
until [ "$test_nu" == "8" ]
do
temp_nu=$(($RANDOM*50/32767+30))
until [ "$temp_nu" != "60" ]
do
temp_nu=$(($RANDOM*50/32767+30))
done
test_nu=$(($test_nu+1))
temp_ch=`printf "\x$temp_nu"`
password=$password$temp_ch
done
fi
echo "$account":"$password" | tee -a "$accountfile"
done
# 3. 开始建立帐号与密码!
cat "$accountfile" | cut -d':' -f1 | xargs -n 1 useradd -m
chpasswd < "$accountfile"
pwconv
echo "OK!建立完成!"
这支程式可以在底下连结下载:
阅读(1231) | 评论(0) | 转发(0) |