Linux 账号管理(转)
useradd
passwd
chage
usermod
userdel
finger
chfn
chsh
id
groupadd
groupmod
groupdel
gpasswd
useradd
完全参考默认值创建一个用户,名称为 vbird1
[root@www ~]# useradd vbird1 [root@www ~]# ll -d /home/vbird1 drwx------ 4 vbird1 vbird1 4096 Feb 25 09:38 /home/vbird1 # 默认会创建用户家目录,且权限为 700 !这是重点!
[root@www ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird1:x:504:505::/home/vbird1:/bin/bash /etc/shadow:vbird1:!!:14300:0:99999:7::: /etc/group:vbird1:x:505: <==默认会创建一个与账号一模一样的群组名
由于在 /etc/shadow 内仅会有口令参数而不会有加密过的口令数据,因此我们在创建使用者账号时, 还需要使用『 passwd 账号 』来给予口令才算是完成了用户创建的流程。
假设我已知道我的系统当中有个组名为 users ,且 UID 700 并不存在,请用 users 为初始群组,以及 uid 为 700 来创建一个名为 vbird2 的账号
[root@www ~]# useradd -u 700 -g users vbird2 [root@www ~]# ll -d /home/vbird2 drwx------ 4 vbird2 users 4096 Feb 25 09:59 /home/vbird2 [root@www ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird2:x:700:100::/home/vbird2:/bin/bash /etc/shadow:vbird2:!!:14300:0:99999:7::: # 看一下,UID 与 initial group 确实改变成我们需要的了!
在这个范例中,我们创建的是指定一个已经存在的群组作为使用者的初始群组,因为群组已经存在, 所以在 /etc/group 里面就不会主动的创建与账号同名的群组了! 此外,我们也指定了特殊的 UID 来作为使用者的专属 UID 喔!
创建一个系统账号,名称为 vbird3
[root@www ~]# useradd -r vbird3 [root@www ~]# ll -d /home/vbird3 ls: /home/vbird3: No such file or directory <==不会主动创建家目录 [root@www ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird3:x:100:103::/home/vbird3:/bin/bash /etc/shadow:vbird3:!!:14300:::::: /etc/group:vbird3:x:103:
我们在谈到 UID 的时候曾经说过一般账号应该是 500 号以后,那用户自己创建的系统账号则一般是由 100 号以后起算的。 所以在这里我们加上 -r 这个选项以后,系统就会主动将账号与账号同名群组的 UID/GID 都指定小于 500 以下, 在本案例中则是使用 100(UID) 与 103(GID) 啰!此外,由于系统账号主要是用来进行运行系统所需服务的权限配置, 所以系统账号默认都不会主动创建家目录的!
useradd 的默认值
[root@www ~]# useradd -D GROUP=100 <==默认的群组 HOME=/home <==默认的家目录所在目录 INACTIVE=-1 <==口令失效日,在 shadow 内的第 7 栏 EXPIRE= <==账号失效日,在 shadow 内的第 8 栏 SHELL=/bin/bash <==默认的 shell SKEL=/etc/skel <==用户家目录的内容数据参考目录 CREATE_MAIL_SPOOL=yes <==是否主动帮使用者创建邮件信箱(mailbox)
passwd
使用 useradd 创建了账号之后,在默认的情况下,该账号是暂时被封锁的, 也就是说,该账号是无法登陆的,配置口令就使用 passwd
请 root 给予 vbird2 口令
[root@www ~]# passwd vbird2 Changing password for user vbird2. New UNIX password: <==这里直接输入新的口令,屏幕不会有任何反应 BAD PASSWORD: it is WAY too short <==口令太简单或过短的错误! Retype new UNIX password: <==再输入一次同样的口令 passwd: all authentication tokens updated successfully. <==竟然还是成功修改了!
用 vbird2 登陆后,修改 vbird2 自己的口令
[vbird2@www ~]$ passwd <==后面没有加账号,就是改自己的口令! Changing password for user vbird2. Changing password for vbird2 (current) UNIX password: <==这里输入『原有的旧口令』 New UNIX password: <==这里输入新口令 BAD PASSWORD: it is based on a dictionary word <==口令检验不通过,请再想个新口令 New UNIX password: <==这里再想个来输入吧 Retype new UNIX password: <==通过口令验证!所以重复这个口令的输入 passwd: all authentication tokens updated successfully. <==有无成功看关键词
与 root 不同的是,一般账号在更改口令时需要先输入自己的旧口令 (亦即 current 那一行),然后再输入新口令 (New 那一行)。 要注意的是,口令的规范是非常严格的,尤其新的 distributions 大多使用 PAM 模块来进行口令的检验,包括太短、 口令与账号相同、口令为字典常见字符串等,都会被 PAM 模块检查出来而拒绝修改口令,此时会再重复出现『 New 』这个关键词! 那时请再想个新口令!若出现『 Retype 』才是你的口令被接受了!重复输入新口令并且看到『 successfully 』这个关键词时才是修改口令成功喔!
使用 standard input 创建用户的口令
[root@www ~]# echo "abc543CC" | passwd --stdin vbird2 Changing password for user vbird2. passwd: all authentication tokens updated successfully.
这个动作会直接升级用户的口令而不用再次的手动输入!好处是方便处理,缺点是这个口令会保留在命令中, 未来若系统被攻破,人家可以在 /root/.bash_history 找到这个口令呢!所以这个动作通常仅用在 shell script 的大量创建使用者账号当中!
管理 vbird2 的口令使具有 60 天变更、10 天口令失效的配置
[root@www ~]# passwd -S vbird2 vbird2 PS 2009-02-26 0 99999 7 -1 (Password set, MD5 crypt.) # 上面说明口令创建时间 (2009-02-26)、0 最小天数、99999 变更天数、7 警告日数 # 与口令不会失效 (-1) 。 [root@www ~]# passwd -x 60 -i 10 vbird2 [root@www ~]# passwd -S vbird2 vbird2 PS 2009-02-26 0 60 7 10 (Password set, MD5 crypt.)
让 vbird2 的账号失效,观察完毕后再让她激活
[root@www ~]# passwd -l vbird2 [root@www ~]# passwd -S vbird2 vbird2 LK 2009-02-26 0 60 7 10 (Password locked.) # 嘿嘿!状态变成『 LK, Lock 』了啦!无法登陆喔! [root@www ~]# grep vbird2 /etc/shadow vbird2:!!$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10:: # 其实只是在这里加上 !! 而已! [root@www ~]# passwd -u vbird2 [root@www ~]# grep vbird2 /etc/shadow vbird2:$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10:: # 口令字段恢复正常!
chage
除了使用 passwd -S 之外,有没有更详细的口令参数显示功能呢?有的!那就是 chage 了!
列出 vbird2 的详细口令参数
[root@www ~]# chage -l vbird2 Last password change : Feb 26, 2009 Password expires : Apr 27, 2009 Password inactive : May 07, 2009 Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 60 Number of days of warning before password expires : 7
chage 有一个功能很不错喔!如果你想要让『使用者在第一次登陆时, 强制她们一定要更改口令后才能够使用系统资源』,可以利用如下的方法来处理的!
创建一个名为 agetest 的账号,该账号第一次登陆后使用默认口令,但必须要更改过口令后,使用新口令才能够登陆系统使用 bash 环境
[root@www ~]# useradd agetest [root@www ~]# echo "agetest" | passwd --stdin agetest [root@www ~]# chage -d 0 agetest # 此时此账号的口令创建时间会被改为 1970/1/1 ,所以会有问题!
尝试以 agetest 登陆的情况
You are required to change your password immediately (root enforced) WARNING: Your password has expired. You must change your password now and login again! Changing password for user agetest. Changing password for agetest (current) UNIX password: <==这个账号被强制要求必须要改口令!
非常有趣吧!你会发现 agetest 这个账号在第一次登陆时可以使用与账号同名的口令登陆, 但登陆时就会被要求立刻更改口令,更改口令完成后就会被踢出系统。再次登陆时就能够使用新口令登陆了!
usermod
在 useradd 的时候加入了错误的配置数据。或者是,在使用 useradd 后,发现某些地方还可以进行细部修改。 此时,当然我们可以直接到 /etc/passwd 或 /etc/shadow 去修改相对应字段的数据, 不过,Linux 也有提供相关的命令让大家来进行账号相关数据的微调呢~那就是 usermod 啰~
usermod 的选项与 useradd 非常类似! 这是因为 usermod 也是用来微调 useradd 添加的使用者参数嘛!不过 usermod 还是有新增的选项, 那就是 -L 与 -U ,不过这两个选项其实与 passwd 的 -l, -u 是相同的!
修改使用者 vbird2 的说明栏,加上『VBird's test』的说明。
[root@www ~]# usermod -c "VBird's test" vbird2 [root@www ~]# grep vbird2 /etc/passwd vbird2:x:700:100:VBird's test:/home/vbird2:/bin/bash
用户 vbird2 口令在 2009/12/31 失效。
[root@www ~]# usermod -e "2009-12-31" vbird2 [root@www ~]# grep vbird2 /etc/shadow vbird2:$1$50MnwNFq$oChX.0TPanCq7ecE4HYEi.:14301:0:60:7:10:14609:
我们创建 vbird3 这个系统账号时并没有给予家目录,请创建他的家目录
[root@www ~]# ll -d ~vbird3 ls: /home/vbird3: No such file or directory <==确认一下,确实没有家目录的存在! [root@www ~]# cp -a /etc/skel /home/vbird3 [root@www ~]# chown -R vbird3:vbird3 /home/vbird3 [root@www ~]# chmod 700 /home/vbird3 [root@www ~]# ll -a ~vbird3 drwx------ 4 vbird3 vbird3 4096 Sep 4 18:15 . <==用户家目录权限 drwxr-xr-x 11 root root 4096 Feb 26 11:45 .. -rw-r--r-- 1 vbird3 vbird3 33 May 25 2008 .bash_logout -rw-r--r-- 1 vbird3 vbird3 176 May 25 2008 .bash_profile -rw-r--r-- 1 vbird3 vbird3 124 May 25 2008 .bashrc drwxr-xr-x 3 vbird3 vbird3 4096 Sep 4 18:11 .kde drwxr-xr-x 4 vbird3 vbird3 4096 Sep 4 18:15 .mozilla # 使用 chown -R 是为了连同家目录底下的用户/群组属性都一起变更的意思; # 使用 chmod 没有 -R ,是因为我们仅要修改目录的权限而非内部文件的权限!
userdel
这个功能就太简单了,目的在删除用户的相关数据,而用户的数据有:
- 用户账号/口令相关参数:/etc/passwd, /etc/shadow
- 使用者群组相关参数:/etc/group, /etc/gshadow
- 用户个人文件数据: /home/username, /var/spool/mail/username..
整个命令的语法非常简单:
[root@www ~]# userdel [-r] username 选项与参数: -r :连同用户的家目录也一起删除 删除 vbird2 ,连同家目录一起删除 [root@www ~]# userdel -r vbird2
这个命令下达的时候要小心了!通常我们要移除一个账号的时候,你可以手动的将 /etc/passwd 与 /etc/shadow 里头的该账号取消即可!一般而言,如果该账号只是『暂时不激活』的话,那么将 /etc/shadow 里头账号失效日期 (第八字段) 配置为 0 就可以让该账号无法使用,但是所有跟该账号相关的数据都会留下来! 使用 userdel 的时机通常是『你真的确定不要让该用户在主机上面使用任何数据了!』
另外,其实用户如果在系统上面操作过一阵子了,那么该用户其实在系统内可能会含有其他文件的。 举例来说,他的邮件信箱 (mailbox) 或者是crontab 之类的文件。 所以,如果想要完整的将某个账号完整的移除,最好可以在下达 userdel -r username 之前, 先以『 find / -user username 』查出整个系统内属于 username 的文件,然后再加以删除吧!
finger
finger 可以查阅很多用户相关的信息喔! 大部分都是在 /etc/passwd 这个文件里面的信息啦!我们就先来检查检查用户信息吧!
观察 vbird1 的用户相关账号属性
[root@www ~]# finger vbird1 Login: vbird1 Name: (null) Directory: /home/vbird1 Shell: /bin/bash Never logged in. No mail. No Plan.
由于 finger 类似指纹的功能,他会将用户的相关属性列出来!如上表所示,其实他列出来的几乎都是 /etc/passwd 文件里面的东西。列出的信息说明如下:
- Login:为使用者账号,亦即 /etc/passwd 内的第一字段;
- Name:为全名,亦即 /etc/passwd 内的第五字段(或称为批注);
- Directory:就是家目录了;
- Shell:就是使用的 Shell 文件所在;
- Never logged in.:figner 还会调查用户登陆主机的情况喔!
- No mail.:调查 /var/spool/mail 当中的信箱数据;
- No Plan.:调查 ~vbird1/.plan 文件,并将该文件取出来说明!
不过是否能够查阅到 Mail 与 Plan 则与权限有关了!因为 Mail / Plan 都是与使用者自己的权限配置有关, root 当然可以查阅到用户的这些信息,但是 vbird1 就不见得能够查到 vbird3 的信息, 因为 /var/spool/mail/vbird3 与 /home/vbird3/ 的权限分别是 660, 700 ,那 vbird1 当然就无法查阅的到! 这样解释可以理解吧?此外,我们可以创建自己想要运行的预定计划,当然,最多是给自己看的!可以这样做:
利用 vbird1 创建自己的计划档
[vbird1@www ~]$ echo "I will study Linux during this year." > ~/.plan [vbird1@www ~]$ finger vbird1 Login: vbird1 Name: (null) Directory: /home/vbird1 Shell: /bin/bash Never logged in. No mail. Plan: I will study Linux during this year.
找出目前在系统上面登陆的用户与登陆时间
[vbird1@www ~]$ finger Login Name Tty Idle Login Time Office Office Phone root root tty1 Feb 26 09:53 vbird1 tty2 Feb 26 15:21
chfn
chfn 是: change finger 的意思!
[root@www ~]# chfn [-foph] [账号名] vbird1 自己更改一下自己的相关信息! [vbird1@www ~]$ chfn Changing finger information for vbird1. Password: <==确认身份,所以输入自己的口令 Name []: VBird Tsai test <==输入你想要呈现的全名 Office []: Dic in Ksu. Tainan <==办公室号码 Office Phone []: 06-2727175#356 <==办公室电话 Home Phone []: 06-1234567 <==家里电话号码 Finger information changed. [vbird1@www ~]$ grep vbird1 /etc/passwd vbird1:x:504:505:VBird Tsai test,Dic in Ksu. Tainan,06-2727175#356,06-1234567: /home/vbird1:/bin/bash # 其实就是改到第五个字段,该字段里面用多个『 , 』分隔就是了! [vbird1@www ~]$ finger vbird1 Login: vbird1 Name: VBird Tsai test Directory: /home/vbird1 Shell: /bin/bash Office: Dic in Ksu. Tainan Office Phone: 06-2727175#356 Home Phone: 06-1234567 On since Thu Feb 26 15:21 (CST) on tty2 No mail. Plan: I will study Linux during this year. # 就是上面特殊字体呈现的那些地方是由 chfn 所修改出来的!
这个命令说实在的,除非是你的主机有很多的用户,否则倒真是用不着这个程序!这就有点像是 bbs 里头更改你『个人属性』的那一个数据啦!不过还是可以自己玩一玩!尤其是用来提醒自己相关数据啦! ^_^
chsh
这就是 change shell 的简写!使用方法就更简单了!
用 vbird1 的身份列出系统上所有合法的 shell,并且指定 csh 为自己的 shell
[vbird1@www ~]$ chsh -l /bin/sh /bin/bash /sbin/nologin <==所谓:合法不可登陆的 Shell 就是这玩意! /bin/tcsh /bin/csh <==这就是 C shell 啦! /bin/ksh # 其实上面的信息就是我们在 bash 中谈到的 /etc/shells 啦! [vbird1@www ~]$ chsh -s /bin/csh; grep vbird1 /etc/passwd Changing shell for vbird1. Password: <==确认身份,请输入 vbird1 的口令 Shell changed. vbird1:x:504:505:VBird Tsai test,Dic in Ksu. Tainan,06-2727175#356,06-1234567: /home/vbird1:/bin/csh [vbird1@www ~]$ chsh -s /bin/bash # 测试完毕后,立刻改回来! [vbird1@www ~]$ ll $(which chsh) -rws--x--x 1 root root 19128 May 25 2008 /usr/bin/chsh
不论是 chfn 与 chsh ,都是能够让一般用户修改 /etc/passwd 这个系统文件的!所以你猜猜,这两个文件的权限是什么? 一定是 SUID 的功能啦!
id
id 这个命令则可以查询某人或自己的相关 UID/GID 等等的信息,他的参数也不少,不过, 都不需要记~反正使用 id 就全部都列出啰
查阅 root 自己的相关 ID 信息!
[root@www ~]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk), 10(wheel) context=root:system_r:unconfined_t:SystemLow-SystemHigh # 上面信息其实是同一行的数据!包括会显示 UID/GID 以及支持的所有群组! # 至于后面那个 context=... 则是 SELinux 的内容,先不要理会他!
查阅一下 vbird1 吧~
[root@www ~]# id vbird1 uid=504(vbird1) gid=505(vbird1) groups=505(vbird1) context=root:system_r: unconfined_t:SystemLow-SystemHigh [root@www ~]# id vbird100 id: vbird100: No such user <== id 这个命令也可以用来判断系统上面有无某账号!
groupadd
新建一个群组,名称为 group1
[root@www ~]# groupadd group1 [root@www ~]# grep group1 /etc/group /etc/gshadow /etc/group:group1:x:702: /etc/gshadow:group1:!:: # 群组的 GID 也是会由 500 以上最大 GID+1 来决定!
groupmod
跟 usermod 类似的,这个命令仅是在进行 group 相关参数的修改而已。
将刚刚上个命令创建的 group1 名称改为 mygroup , GID 为 201
[root@www ~]# groupmod -g 201 -n mygroup group1 [root@www ~]# grep mygroup /etc/group /etc/gshadow /etc/group:mygroup:x:201: /etc/gshadow:mygroup:!::
不过,还是那句老话,不要随意的更动 GID ,容易造成系统资源的错乱喔!
groupdel
将刚刚的 mygroup 删除!
[root@www ~]# groupdel mygroup
若要删除 vbird1 这个群组的话?
[root@www ~]# groupdel vbird1 groupdel: cannot remove user's primary group.
为什么 mygroup 可以删除,但是 vbird1 就不能删除呢?原因很简单,『有某个账号 (/etc/passwd) 的 initial group 使用该群组!』 如果查阅一下,你会发现在 /etc/passwd 内的 vbird1 第四栏的 GID 就是 /etc/group 内的 vbird1 那个群组的 GID ,所以啰,当然无法删除~否则 vbird1 这个用户登陆系统后, 就会找不到 GID ,那可是会造成很大的困扰的!那么如果硬要删除 vbird1 这个群组呢? 你『必须要确认 /etc/passwd 内的账号没有任何人使用该群组作为 initial group 』才行喔!所以,你可以:
- 修改 vbird1 的 GID ,或者是:
- 删除 vbird1 这个使用者。
gpasswd
如果系统管理员太忙碌了,导致某些账号想要加入某个项目时找不到人帮忙!这个时候可以创建『群组管理员』喔! 什么是群组管理员呢?就是让某个群组具有一个管理员,这个群组管理员可以管理哪些账号可以加入/移出该群组! 那要如何『创建一个群组管理员』呢?就得要透过 gpasswd 啰!
创建一个新群组,名称为 testgroup 且群组交由 vbird1 管理:
[root@www ~]# groupadd testgroup <==先创建群组 [root@www ~]# gpasswd testgroup <==给这个群组一个口令吧! Changing the password for group testgroup New Password: Re-enter new password: # 输入两次口令就对了! [root@www ~]# gpasswd -A vbird1 testgroup <==加入群组管理员为 vbird1 [root@www ~]# grep testgroup /etc/group /etc/gshadow /etc/group:testgroup:x:702: /etc/gshadow:testgroup:$1$I5ukIY1.$o5fmW.cOsc8.K.FHAFLWg0:vbird1: # 很有趣吧!此时 vbird1 则拥有 testgroup 的主控权喔!身份有点像板主啦!
以 vbird1 登陆系统,并且让他加入 vbird1, vbird3 成为 testgroup 成员
[vbird1@www ~]$ id uid=504(vbird1) gid=505(vbird1) groups=505(vbird1) .... # 看得出来,vbird1 尚未加入 testgroup 群组喔! [vbird1@www ~]$ gpasswd -a vbird1 testgroup [vbird1@www ~]$ gpasswd -a vbird3 testgroup [vbird1@www ~]$ grep testgroup /etc/group testgroup:x:702:vbird1,vbird3
我们可以让 testgroup 成为一个可以公开的群组,然后创建起群组管理员, 群组管理员可以有多个。在这个案例中,我将 vbird1 配置为 testgroup 的群组管理员,所以 vbird1 就可以自行添加群组成员啰~呼呼!然后,该群组成员就能够使用 newgrp 啰