在 Linux 系统下管理用户的身份与帐号!
本文数据主要针对 Fedora Core 4 的系统进行说明, Fedora Core 1 主要是由 Red Hat Linux 9 改版而来, 这个 Red Hat Linux 9 并不是当前大家听到的 RHEL 喔!那是在 RHEL 出现之前的产品,基本上是在 2003 年以前的作品了!Fedora Core 4 则是在 2005 年 6 月份发布,使用的内核是 2.6.11 版,当时是很红的一个作品!只是生命周期太短,所以用这个 Fedora 系列来介绍 Server, 当时的决定确实有点莫名其妙了...
建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。那为何还需要编辑 Fedora Core 4 的数据呢? 鸟哥只想要做个自己曾经撰写过的文档内容保存而已啰! ^_^!最新文章请前往鸟站首页查阅啰!
要登录 Linux 系统一定要有帐号与密码才行,否则怎么登录,您说是吧?!不过, 不同的用户应该要拥有不同的权限才行吧?我们还可以通过 user/group 的特殊权限设置, 来规范出不同的群组开发项目呢~在 Linux 的环境下,我们可以通过很多方式来限制用户能够使用的系统资源, 包括 bash shell 章节提到的 ulimit 限制、还有特殊权限限制,如 umask 等等。 通过这些举动,我们可以规范出不同用户的使用资源。另外,还记得系统管理员的帐号吗?对! 就是 root 。请问一下,除了 root 之外,是否可以有其他的系统管理员帐号? 为什么大家都要尽量避免使用数字型态的帐号?如何修改用户相关的信息呢?这些我们都得要了解了解的!
[root@linux ~]# vi /etc/passwd .....(前面省略)..... dmtsai:x:501:501::/home/dmtsai:/bin/bash <==将原本的 501:501 改成 3000:501 [root@linux ~]# ls -ld /home/ drwxr-xr-x 3 501 dmtsai 4096 Aug 30 10:37 dmtsai # 瞧!这里就能够知道,其实文件记录的是 UID 啦~你一定要了解的是,上面的例子仅是在说明 UID 与帐号的对应性, 在一部正常运作的 Linux 主机环境下,上面的动作不可随便进行, 这是因为系统上已经有很多的数据在运行了,随意修改系统上某些帐号的 UID 很可能会导致某些进程无法进行,这将导致系统无法顺利运作的结果。 因为权限的问题啊!所以,了解了之后,请赶快回到 /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我们先来看一下每个 Linux 系统都会有的第一行,就是 root 这个系统管理员那一行好了, 你可以明显的看出来,每一行使用『:』分隔开,共有七个咚咚,分别是:
id 范围 | 该 ID 用户特性 |
0 | 当 UID 是 0 时,代表这个帐号是『系统管理员』!所以当你要作另一个系统管理员帐号时, 你可以将该帐号的 UID 改成 0 即可;这也就是说,一部系统上面的系统管理员不见得只有 root 喔! 不过,不很建议有多个帐号的 UID 是 0 啦~ |
1~499 | 保留给系统使用的 ID,其实 1~65534 之间的帐号并没有不同,
也就是除了 0 之外,其他的 UID 并没有不一样,缺省 500
以下给系统作为保留帐号只是一个习惯。这样的好处是,以有名的 DNS 服务器的启动服务『 named
』为例,这个程序的缺省所有人 named 的帐号 UID 是 25 ,当有其他的帐号同样是 25
时,很可能会造成系统的一些小问题!为了杜绝这样的问题,建议保留 500 以前的 UID 给系统吧! 不过,一般来说, 1~99 会保留给系统缺省的帐号,另外 100~499 则保留给一些服务来使用。 |
500~65535 | 给一般用户用的。事实上,目前的 linux 内核 (2.6.x 版)已经可以支持到 4294967295 (2^32-1) 这么大的 UID 号码喔! |
root:$1$i9Ejldjfjio389u9sjl$jljsoi45QE/:12959:0:99999:7::: bin:*:12959:0:99999:7::: daemon:*:12959:0:99999:7::: adm:*:12959:0:99999:7:::基本上, shadow 同样以『:』作为分隔符号,如果数一数,会发现共有九个字段啊, 这九个字段的用途是这样的:
dmtsai:$1$8zdAKdfC$XDa8eSus2I7nQL7UjRsIy/:13025:5:60:7:2:13125:这表示什么呢?要注意的是, 13025 是 2005/08/30 ,所以, dmtsai 这个用户他的密码相关意义是:
You must wait longer to change your password passwd: Authentication token manipulation error
Warning: your password will expire in 5 days
root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon sys:x:3:root,bin,adm也是以冒号『:』作为字段的分隔符号,共分为四栏,每一字段的意义是:
[root@linux ~]# grep dmtsai /etc/passwd /etc/group /etc/gshadow
/etc/passwd:dmtsai:x:501:501::/home/dmtsai:/bin/bash
/etc/group:users:x:100:dmtsai
/etc/group:dmtsai:x:501:
/etc/gshadow:users:::dmtsai
/etc/gshadow:dmtsai:!::
仔细看到上面这个表格,在 /etc/passwd 里面,dmtsai 这个用户所属的群组为 GID=501 ,
也就是 /etc/group 里头 dmtsai 那个群组啦~因为这是 initial group ,所以,
用户一登录就会主动取得,不需要在 /etc/group 的第四个字段写入该帐号的!
[dmtsai@linux ~]$ groups
dmtsai users
在这个输出的消息中,我知道我同时属于 dmtsai 及 users 这个两个群组,而且,
第一个输出的群组即为有效群组 (effective group) 了。
也就是说,我的有效群组为 dmtsai 啦~此时,如果我以 touch 去创建一个新档,例如:
touch test ,那么这个文件的拥有者为 dmtsai ,而且群组也是 dmtsai 的啦。
这样是否可以了解什么是有效群组了?[dmtsai@linux ~]$ newgrp users [dmtsai@linux ~]$ groups users dmtsai此时,我的有效群组就成为 users 了。当然,要能够顺利切换有效群组的话,还需要 /etc/gshadow 的辅助才行~这个等一下我们会说明的。好了,那么如果你开始在 /home/dmtsai 这个家目录底下尝试创建一个文件,例如『 touch test2 』好了,会发生什么状态呢? 呵呵!那个文件的群组竟然变成 users 了!这样更清楚有效群组的意义了吧?!
root:::root bin:::root,bin,daemon daemon:::root,bin,daemon sys:::root,bin,adm同样还是使用冒号『:』来作为字段的分隔字符,而且你会发现,这个文件几乎与 /etc/group 一模一样啊!是这样没错~不过,要注意的大概就是第二个字段吧~第二个字段是密码栏, 如果密码栏上面是『!』时,表示该群组不能使用密码来登录呢! 至于第四个字段也就是支持的帐号名称啰~
[root@linux ~]# useradd [-u UID] [-g initial_group] [-G other_group] \ > -[Mm] [-c 说明栏] [-d home] [-s shell] username 参数: -u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个帐号; -g :后面接的那个群组名称就是我们上面提到的 initial group 啦~ 该 group ID (GID) 会被放置到 /etc/passwd 的第四个字段内。 -G :后面接的群组名称则是这个帐号还可以支持的群组。 这个参数会修改 /etc/group 内的相关数据喔! -M :强制!不要创建用户家目录 -m :强制!要创建用户家目录! -c :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设置的啦~ -d :指定某个目录成为家目录,而不要使用默认值; -r :创建一个系统的帐号,这个帐号的 UID 会有限制 (/etc/login.defs) -s :后面接一个 shell ,缺省是 /bin/bash 的啦~ 范例: 范例一:完全参考默认值创建一个用户,名称为 vbird1 [root@linux ~]# useradd vbird1 [root@linux ~]# ls -l /home drwxr-xr-x 3 vbird1 vbird1 4096 Aug 30 17:33 vbird1 [root@linux ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird1:x:502:502::/home/vbird1:/bin/bash /etc/shadow:vbird1:!!:13025:0:99999:7::: /etc/group:vbird1:x:502: # 做这个范例只是想要让您了解,其实系统已经规范好了一些添加用户时的参数了! # 因此,当我们使用 useradd 时,系统会主动的去修改 /etc/passwd 与 /etc/shadow, # 而这两个文件内的相关字段参考值,则会以一些设置档的内容来规范喔! # 同时也要注意到,使用 useradd 添加用户时,这个用户的 /etc/shadow # 密码栏会是不可登录的 (以 !! 为开头),因此还需要使用 passwd # 来给予 vbird1 密码后,才算添加完毕! 范例二:我知道我的系统当中有个群组名称为 users ,且 UID 700 并不存在, 请用这两个参数给予 vbird2 创建一个帐号! [root@linux ~]# useradd -u 700 -g users vbird2 [root@linux ~]# ls -l /home drwxr-xr-x 3 vbird2 users 4096 Aug 30 17:43 vbird2 [root@linux ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird2:x:700:100::/home/vbird2:/bin/bash /etc/shadow:vbird2:!!:13025:0:99999:7::: # 看一下,UID 与 initial group 确实改变成我们需要的了! 范例三:创建一个系统帐号,名称为 vbird3 [root@linux ~]# useradd -r vbird3 [root@linux ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group /etc/passwd:vbird3:x:101:102::/home/vbird3:/bin/bash /etc/shadow:vbird3:!!:13025:::::: /etc/group:vbird3:x:102: # 很重要喔!您会发现, UID 竟然是 101 ,而 GID 怎么会是 102, # 并且与 /etc/group 有对应的关系喔!有没有加 -r 差很多ㄟ!我的天呐!这个指令更动的文件怎么怎么多啊?对啊!你才知道啊~ 这也是为啥我们说帐号管理是很复杂的啦~而且他参考的设置档才更多哩! 这个指令至少可能会更动到的地方有:
GROUP=100 <==缺省的群组 HOME=/home <==缺省的家目录所在目录 INACTIVE=-1 <==在 /etc/shadow 内的第 7 栏 EXPIRE= <==在 /etc/shadow 内的第 8 栏 SHELL=/bin/bash <==缺省的 shell SKEL=/etc/skel <==用户家目录的内容数据参考目录
MAIL_DIR /var/spool/mail <==用户缺省邮件信箱放置目录 PASS_MAX_DAYS 99999 <==/etc/shadow 内的第 5 栏 PASS_MIN_DAYS 0 <==/etc/shadow 内的第 4 栏 PASS_MIN_LEN 5 <==密码最短的字符长度,建议可以改到 6 以上 PASS_WARN_AGE 7 <==/etc/shadow 内的第 6 栏 UID_MIN 500 <==用户最小的 UID,意即小于 500 的 UID 为系统保留 UID_MAX 60000 <==用户能够用的最大 UID GID_MIN 500 <==用户自订群组的最小 GID,小于 500 为系统保留 GID_MAX 60000 <==用户自订群组的最大 GID CREATE_HOME yes <==在不加 -M 及 -m 时,是否主动创建用户家目录?看到这个文件后,您应该晓得的是,为何新建的用户的 UID 都会大于 500 了吧? 而且某些版本的 distributions (例如 SuSE server 9) 则是将 UID_MIN 设置为 1000 , 所以,他的一般身份用户的 UID 就会从 1000 起跳啰~这样了解吗?!
[root@linux ~]# passwd [useraccount] 范例一:如果 root 要帮 dmtsai 修改密码时? [root@linux ~]# passwd dmtsai Changing password for user dmtsai. New UNIX password: <==这里直接输入新的密码,屏幕不会有任何反应 BAD PASSWORD: it is based on a dictionary word <==密码太简单时的错误! Retype new UNIX password: <==再输入一次同样的密码 passwd: all authentication tokens updated successfully. <==竟然还是成功修改了! 范例二: dmtsai 这个用户想要修改自己的密码时 [dmtsai@linux ~]$ passwd Changing password for user dmtsai. Changing password for dmtsai (current) UNIX password: <==这里输入『原有的旧密码』 New password: <==这里输入新密码 BAD PASSWORD: it is based on your username <==密码的规范是很严格的 New password: BAD PASSWORD: it is based on your username New password: BAD PASSWORD: it is based on a dictionary word passwd: Authentication token manipulation error先来谈一谈上面的两个范例。要注意的是, passwd 这个指令由于用户的身份而有两种用法, 如果是 root ,由于 root 具有至高无上的权力,所以 root 可以利用 passwd [username] 来帮用户修改他们的密码!因此,『如果用户的密码不见了, root 是可以帮他们进行密码的修改,而不需要知道旧密码。』另外,也只有 root 可以随便设置密码,即使该密码并不符合系统的密码验证要求~ @_@。例如上面的范例一, 我帮 dmtsai 创建的密码太简单,所以其实系统是『警告』过 root 的。 但在重复输入两次密码后,嘿嘿!您还是会看到 successfully 这个成功的字样呢!
[root@linux ~]# usermod [-cdegGlsuLU] username 参数: -c :后面接帐号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些帐号的说明。 -d :后面接帐号的家目录,即修改 /etc/passwd 的第六栏; -e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据啦! -g :后面接 group name,修改 /etc/passwd 的第四个字段,亦即是 GID 的字段! -G :后面接 group name,修改这个用户能够支持的群组,修改的是 /etc/group 啰~ -l :后面接帐号名称。亦即是修改帐号名称, /etc/passwd 的第一栏! -s :后面接 Shell 的实际文件,例如 /bin/bash 或 /bin/csh 等等。 -u :后面接 UID 数字啦!即 /etc/passwd 第三栏的数据; -L :暂时将用户的密码冻结,让他无法登录。其实仅改 /etc/shadow 的密码栏。 -U :将 /etc/shadow 密码栏的 ! 拿掉,解冻啦! 范例: 范例一:修改用户 dmtsai 的说明栏,加上『VBird's test』的说明。 [root@linux ~]# usermod -c "VBird's test" dmtsai [root@linux ~]# grep dmtsai /etc/passwd dmtsai:x:501:501:VBird's test:/home/dmtsai:/bin/bash 范例二:用户 dmtsai 密码在 2006/01/01 失效。 [root@linux ~]# usermod -e "2006-01-01" dmtsai [root@linux ~]# grep dmtsai /etc/shadow dmtsai:$1$24ISJM4K$bbdijdreoieaVaBMAHsm6.:13026:0:99999:7::13149: 范例三:暂时冻结 dmtsai 的密码! [root@linux ~]# usermod -L dmtsai [root@linux ~]# grep dmtsai /etc/shadow dmtsai:!$1$24ISJM4K$bbdijdreoieaVaBMAHsm6.:13026:0:99999:7::13149: # 注意到,密码栏(第二栏)多了一个 ! 号!那个惊叹号会让密码无效喔! [root@linux ~]# usermod -U dmtsai <==这样就解开了! 范例四:万一 dmtsai 这个家伙被创建时忘记创建家目录,该如何是好? [root@linux ~]# usermod -d /home/dmtsai2 -m dmtsai # 如果仅是 -d /home/dmtsai2 表示仅修改 /etc/passwd 第六栏的内容而已, # 如果加上 -m 这个参数,则表示新建一个家目录的意思! # 另外,如果原本的家目录是 /home/dmtsai ,那 -d /home/dmtsai2 -m # 会将原本的 /home/dmtsai 更名为 /home/dmtsai2 喔!usermod 是系统管理员 root 用来管理帐号身份的相关数据的,不过,这个 usermod 程序的功能其实也被很多其他的指令所取代喔!例如 chfn 与 chsh 等等的~ 不过,无论如何,您还是可以用 usermod 来微调用户帐号的相关数据啦!
[root@linux ~]# userdel [-r] username 参数: -r :连同用户的家目录也一起删除 范例: 范例一:删除 vbird2 ,连同家目录一起删除 [root@linux ~]# userdel -r vbird2这个指令下达的时候要小心了!通常我们要移除一个帐号的时候,你可以手动的将 /etc/passwd 与 /etc/shadow 里头的该帐号取消即可!一般而言,如果该帐号只是『 暂时不激活』的话,那么将 /etc/shadow 里头最后倒数一个字段设置为 0 就可以让该帐号无法使用,但是所有跟该帐号相关的数据都会留下来! 使用 userdel 的时机通常是『 你真的确定不要让该用户在主机上面使用任何数据了!』
[dmtsai@linux ~]$ chsh [-ls] 参数: -l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容! -s :设置修改自己的 Shell 啰 范例: 范例一:列出目前系统上面所以的 shell ,并且指定 csh 为自己的 shell [dmtsai@linux ~]$ chsh -l /bin/sh /bin/bash /sbin/nologin /bin/ksh /bin/tcsh /bin/csh /bin/zsh [dmtsai@linux ~]$ chsh -s /bin/csh; grep dmtsai /etc/passwd Password: <==为了防止帐号被乱搞~所以需要输入 dmtsai 的密码确认! Shell changed. dmtsai:x:501:501::/home/dmtsai:/bin/csh这个指令重点就是在更改用户的 shell 啰~如上所述,我就可以修订好 dmtsai 的 shell 啦!
[root@linux ~]# chfn [-foph] 参数: -f :后面接完整的大名; -o :您办公室的房间号码; -p :办公室的电话号码; -h :家里的电话号码! 范例: 范例一:我用 dmtsai 这个用户来更改一下自己的相关信息! [dmtsai@linux ~]$ chfn Changing finger information for dmtsai. Password: <==为了防止帐号被乱搞~所以需要输入 dmtsai 的密码确认! Name []: VBird' Test account Office []: Tainan office 1 Office Phone []: 06-1234567 Home Phone []: 06-7654321 Finger information changed. [dmtsai@linux ~]$ grep dmtsai /etc/passwd dmtsai:x:501:501:VBird' Test account,Tainan office 1,06-1234567,06-7654321: /home/dmtsai:/bin/bash这个指令说实在的,除非是你的主机有很多的用户,否则倒真是用不着这个程序!这就有点像是 bbs 里头更改你『个人属性』的那一个数据啦!这个程序主要都是搭配 finger 这支程序在运作的!不过,由于 finger 这支程序不是很安全,所以缺省是没有安装他的! 如果您想要玩一下 finger 的话,那么请先参考 RPM 套件安装内容后,在安装 finger 的 RPM 文件,然后再来玩吧!底下这里鸟哥还是先简单的介绍一下就好了!
[root@linux ~]# finger [-s] username 参数: -s :使用长串数据输出格式。 范例: 范例一:将刚刚 dmtsai 创建的一些用户信息调用出来视察! [root@linux ~]# finger dmtsai Login: dmtsai Name: VBird's Test account Directory: /home/dmtsai Shell: /bin/bash Office: Tainan office 1, 06-1234567 Home Phone: 06-7654321 Last login Tue Aug 30 15:01 (CST) on tty1 from localhost No mail. No Plan.有趣吧!这个 finger 还可以用来查找别部主机的帐号呢!不过,目前通常用在本机帐号的查找。 因为 finger 算是比较危险的指令,所以,有些 linux distributions 缺省是不安装他的, 不过,如果您按照鸟哥说明的方式来完整安装 FC4 的话,那就没有问题的啦!可以操作的。
[root@linux ~]# id [username] 范例一:查阅自己的相关信息! [root@linux ~]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),10(wheel) 范例二:查阅一下 dmtsai 吧~ [root@linux ~]# id dmtsai uid=501(dmtsai) gid=501(dmtsai) groups=501(dmtsai),100(users)再次强调一下,那个 groups 指的是目前该用户所属的所有群组,但是您必须要了解什么是『 初始群组与有效群组 』的差异喔!
[root@linux ~]# groupadd [-g gid] [-r] 参数: -g :后面接某个特定的 GID ,用来直接给予某个 GID ~ -r :创建系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。 范例: 范例一:新建一个群组,名称为 group1 [root@linux ~]# groupadd group1 [root@linux ~]# grep group1 /etc/group /etc/gshadow /etc/group:group1:x:502: /etc/gshadow:group1:!:: # 注意注意!在 /etc/gshadow 里面可以发现,密码是不许登录的喔! 范例二:新建一个系统群组,名称为 group2 [root@linux ~]# groupadd -r group2 [root@linux ~]# grep group2 /etc/group /etc/gshadow /etc/group:group2:x:101: /etc/gshadow:group2:!::了解 -r 有没有的差异了吗?!是的~结果会跟 /etc/login.defs 里面的设置有关喔! 而且以 groupadd 添加的帐号,缺省都不能使用密码的方式登录的~ 也就是说,缺省是私有群组,并无法使用 newgrp 来登录的呢!
[root@linux ~]# groupmod [-g gid] [-n group_name] 参数: -g :修改既有的 GID 数字; -n :修改既有的群组名称 范例: 范例一:将刚刚上个指令创建的 group2 名称改为 groupname , GID 为 103 [root@linux ~]# groupmod -g 103 -n groupname group2 [root@linux ~]# grep groupname /etc/group /etc/gshadow /etc/group:groupname:x:103: /etc/gshadow:groupname:!::不过,还是那句老话,不要随意的更动 GID ,容易造成系统资源的错乱喔!
[root@linux ~]# groupdel [groupname] 范例一:将刚刚的 groupname 删除! [root@linux ~]# groupdel groupname 范例二:若要删除 dmtsai 这个群组的话?? [root@linux ~]# groupdel dmtsai groupdel: cannot remove user's primary group.为什么 groupname 可以删除,但是 dmtsai 就不能删除呢?原因很简单, 『有某个帐号 (/etc/passwd) 的 initial group 使用该群组!』 如果查阅一下,你会发现在 /etc/passwd 内的 dmtsai 第四栏的 GID 就是 /etc/group 内的 dmtsai 那个群组的 GID ,所以啰,当然无法删除~否则 dmtsai 这个用户登录系统后, 就会找不到 GID ,那可是会造成很大的困扰的!那么如果要删除 dmtsai 这个群组呢? 你『必须要确认 /etc/passwd 内的帐号没有任何人使用该群组作为 initial group 』才行喔!所以,你可以:
关于系统管理员(root)做的动作: [root@linux ~]# gpasswd groupname [root@linux ~]# gpasswd [-A user1,...] [-M user3,user4...] groupname [root@linux ~]# gpasswd [-rR] groupname 参数: :若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow) -A :将 groupname 的主控权交由后面的用户管理(该群组的管理员) -M :将某些帐号加入这个群组当中! -r :将 groupname 的密码移除 -R :让 groupname 的密码栏失效,所以 newgrp 就不能使用了! 关于群组管理员(Group administrator)做的动作: [someone@linux ~]$ gpasswd [-ad] user groupname 参数: -a :将某位用户加入到 groupname 这个群组当中! -d :将某位用户移除出 groupname 这个群组当中。 范例一:创建一个新群组,名称为 testgroup 且群组交由 dmtsai 管理: [root@linux ~]# groupadd testgroup [root@linux ~]# gpasswd testgroup Changing the password for group testgroup New Password: Re-enter new password: # 输入两次密码就对了! [root@linux ~]# gpasswd -A dmtsai -M dmtsai,vbird testgroup [root@linux ~]# grep testgroup /etc/group /etc/gshadow /etc/group:testgroup:x:502:dmtsai,vbird /etc/gshadow:testgroup:1CEVbrcjxO6Ps:dmtsai:dmtsai,vbird # 很有趣吧!此时 dmtsai 则拥有 testgroup 的主控权喔!若以我们讨论区 ( # http://phorum.vbird.org 的概念来说,群组管理员有点像『版主』啦! 范例二:以 dmtsai 登录系统,并且让他加入 vbird1 成为 testgroup 成员之一: [dmtsai@linux ~]$ gpasswd -a vbird1 testgroup Adding user vbird1 to group testgroup很有趣的一个小实验吧!我们可以让 testgroup 成为一个可以公开的群组, 然后创建起群组管理员,群组管理员可以有多个。在这个案例中, 我将他设置为 dmtsai ,所以, dmtsai 就可以自行增加群组成员啰~ 呼呼!然后,该群组成员就能够使用 newgrp 啰~
[root@linux ~]# passwd [-lunxwS] username 参数: -l :将 username 这个帐号的密码锁住 (lock),在 /etc/shadow 内的密码栏修订~ -u :将 -l 的 lock 解开! -n :后面接天数 (数字) ,最短天数;亦即是 /etc/shadow 内的第四栏; -x :后面接天数 (数字) ,最长天数;亦即是 /etc/shadow 内的第五栏; -w :后面接天数 (数字) ,警告天数;亦即是 /etc/shadow 内的第六栏; -S :显示目前这个 username 的相关信息。 范例: 范例一:将 dmtsai 这个用户的密码冻结,并观察他! [root@linux ~]# passwd -l dmtsai Locking password for user dmtsai. passwd: Success [root@linux ~]# passwd -S dmtsai Password locked. [root@linux ~]# grep dmtsai /etc/shadow dmtsai:!!$1$TDy6D7eg$jVJV/FMaQn14v5Kl7sqw6/:13026:0:99999:7::13149: 范例二:将上述密码冻结解开 [root@linux ~]# passwd -u dmtsai其实这个 passwd 指令还挺多用的~尤其很多功能仅有 root 才能运行。 您可以使用 passwd -l 及 passwd -u 来强制让一个用户『暂时』无法使用该帐号, 很方便的啦! ^_^
[root@linux ~]# su [-lcm] [username] 参数: - :如果运行 su - 时,表示该用户想要变换身份成为 root ,且使用 root 的 环境设置参数档,如 /root/.bash_profile 等等。 -l :后面可以接用户,例如 su -l dmtsai ,这个 -l 好处是,可使用欲变换身份者 他的所有相关环境设置档。 -m :-m 与 -p 是一样的,表示『使用目前的环境设置,而不重新读取新用户的设置档。』 -c :仅进行一次指令,所以 -c 后面可以加上指令喔! 范例: 范例一:由原本的 dmtsai 这个用户,变换身份成为 root 。 [dmtsai@linux ~]$ su Password: <==这里输入 root 的密码喔! [root@linux ~]# env USER=dmtsai USERNAME=root MAIL=/var/spool/mail/dmtsai LOGNAME=dmtsai # 注意到了吗?如果使用 su 没有加上 - 的话,那么很多原本用户的相关设置会继续存在, # 这也会造成后来的 root 身份在运行时的困扰。最常见的就是 PATH 这个变量的问题! [root@linux ~]# exit <==这样可以离开 su 的环境! [dmtsai@linux ~]$ su - Password: <==这里输入 root 的密码喔! [root@linux ~]# env USER=root MAIL=/var/spool/mail/root LOGNAME=root # 了解差异了吧?!所以,下次在变换成为 root 时,记得最好使用 su - 喔! 范例二:使用 root 的身份,运行 head -n 3 /etc/shadow [dmtsai@linux ~]$ su - -c "head -n 3 /etc/shadow" Password: <==这里输入 root 的密码喔! root:$1$jaldj9843u29jlj9u839jljlcghjlE/:12959:0:99999:7::: bin:*:12959:0:99999:7::: daemon:*:12959:0:99999:7::: 范例三:原本是 dmtsai 这个用户,想要变换身份成为 vbird 时? [dmtsai@linux ~]$ su -l vbird Password: <==这里输入 vbird 的密码喔!这个 su 指令可以让你在不同的用户之间切换身份,当 su 后面没有加上用户帐号时, 那么缺省就是以 root 作为你切换的那个身份啦!其实,这个指令最大的用途也是在这里! 就是让一般用户变成 root 啦!而要特别留意的则是 su 的使用方式上, 由于『是否读入欲切换的身份者的环境参数文件』的不同, 所以您必须要留意喔!
[root@linux ~]# sudo [-u [username|#uid]] command 参数: -u :后面可以接用户帐号名称,或者是 UID。例如 UID 是 500 的身份,可以: -u #500 来作为切换到 UID 为 500 的那位用户。 范例: 范例一:一般身份用户使用 sudo 在 /root 底下创建目录: [dmtsai@linux ~]$ sudo mkdir /root/testing We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. Password: <==这里输入 dmtsai 自己的密码 dmtsai is not in the sudoers file. This incident will be reported. # 瞧!因为 dmtsai 不在 /etc/sudoers ,所以他就无法运行 sudo 喔! 范例二:假设 dmtsai 已经具有 sudo 的运行权限,如何在 /root 底下创建目录? [dmtsai@linux ~]$ sudo mkdir /root/testing Password: <==这里输入 dmtsai 自己的密码 范例三:如何将 sudo 与 su 搭配使用? [dmtsai@linux ~]$ sudo su - 范例四:dmtsai 想要切换身份成为 vbird 来进行 touch 时? [dmtsai@linux ~]$ sudo -u vbird touch /home/vbird/test上面我进行了四个范例,不过,要注意的是,若我是以 dmtsai 来进行的, 那么在接下来的五分钟内,如果你持续使用 sudo 来工作时,那就不需要再次的输入密码。 这是因为系统相信你在五分钟内不会离开而有第二个人跑来操作系统啊! 呼呼!真是很人性化的设计啊~ ^_^。不过如果两次 sudo 操作的间隔超过 5 分钟,那就得要重新输入一次你的密码了。 而且要注意的是,因为使用一般帐号时,理论上不会使用到 /sbin, /usr/sbin 等目录内的指令, 所以 $PATH 变量不会含有这些目录,因此很多管理指令需要使用绝对路径来下达比较妥当喔! 或者直接修改您自己的 PATH 变量吧!
[root@linux ~]# visudo # sudoers file. # This file MUST be edited with the 'visudo' command as root. # See the sudoers man page for the details on how to write a sudoers file. # # Host alias specification # User alias specification # Cmnd alias specification # Defaults specification # Runas alias specification # User privilege specification root ALL=(ALL) ALL dmtsai ALL=(ALL) ALL <==这里将 dmtsai 制作成完全可用! # Uncomment to allow people in group wheel to run all commands # %wheel ALL=(ALL) ALL # Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL # Samples # %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom # %users localhost=/sbin/shutdown -h now使用 visudo 之后,其实就会出现一个 vi 的画面啦!他就是以 vi 来打开 /etc/sudoers , 不过,当我们保存离开时, visudo 会额外去检查 /etc/sudoers 内部的语法, 以避免用户输入错误的信息了。我上面只有加入一行,就是让那个 dmtsai 成为可以随意使用 sudo 的身份而已。基本上, /etc/sudoers 的结构您可以使用 man sudoers 去查阅, 该说明内容说的很清楚,而且还有一些范例呢!鸟哥在这里仅作一些简单的说明就是了。 那一行『 dmtsai ALL=(ALL) ALL 』代表的意义是:
例题:我想要创建一个可以帮忙系统管理员变更用户密码的群组,名称为 ADMPW
( 注意,在 sudoers 内,这个别名的名称一定要是大写字符才行!)但是这个群组不能修改 root 的密码喔!
且他们运行 sudo 时,不需要密码验证。 答:
User_Alias ADMPW = vbird, dmtsai, vbird1, vbird3 ADMPW ALL = NOPASSWD: !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \ !/usr/bin/passwd root上面的意思是说,我的系统上面有四个帐号,分别是 vbird, vbird1, vbird3 与 dmtsai 这四个帐号加入 sudo 内的 ADMPW 群组中,这四个帐号可以使用 sudo 进行『 /usr/bin/passwd * 』 密码的更改动作,但是不能 (在指令前面加入 ! 代表不可) 使用 /usr/bin/passwd 或 /usr/bin/passwd root ,如此一来,就让该 ADMPW 可以更改用户的密码,但是不能变更 root 的密码啰! ^_^ |
例题:我的系统中有 DNS 服务,他的启动指令在 /etc/init.d/named ,如果我想要创建一个 DNSMASTER
的群组来管理他时?如何是好? 答:
User_Alias DNSMASTER = vbird, dmtsai Cmnd_Alias DNSCMD = /etc/init.d/named, /usr/bin/vim /var/named/* DNSMASTER ALL = DNSCMD看的懂吗?嘿嘿!因为 DNS 的设置档大多在 /var/named 里面,所以,我也允许相关帐号用 vi 去处理 DNS 的设置档啦!很简单对吧! ^_^ |
This account is currently not available.嘿嘿!它说的是『这个帐号并不能被允许登录啦!』不过,这个帐号却可以进行其他的工作喔! 举例来说,各个系统帐号,打印工作由 lp 这个帐号在管理, WWW 服务由 apache 这个帐号在管理, 他们都可以进行系统进程的工作,但是『就是无法登录主机』而已啦!^_^
[root@linux ~]# cat /etc/pam.d/passwd
#%PAM-1.0
auth required pam_stack.so service=system-auth
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
基本上,在这个文件内,每一行都是一个动作,而每个动作都分为四个字段,分别是:
[root@linux ~]# cat /etc/pam.d/login #%PAM-1.0 auth required pam_securetty.so auth required pam_stack.so service=system-auth auth required pam_nologin.so account required pam_stack.so service=system-auth password required pam_stack.so service=system-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_stack.so service=system-auth session optional pam_console.so # pam_selinux.so open should be the last session rule session required pam_selinux.so multiple open在我们登录 Linux 的时候,使用到的 login 这个程序时,他使用的 PAM 设置档大多是 required 的控制标准,所以必须要通过上述的几个 PAM 模块的验证后,才能够判定是否登录 Linux 。 需要留意的是,我们会看到 session 的模块类型,这表示我们在实际使用 Linux 的资源之前,以及注销 Linux 主机后,相关的数据都会被纪录到注册表当中。 嘿嘿!所以啰,如果您仔细的看过 /var/log/messages 与 /var/log/secure , 就能够发现你的一举一动其实是有被纪录下来的喔! ^_^
tty1 tty2 tty3 tty4 ...而没有 pts/0 这类的网络登录的终端接口。这也就是说, root 仅能经由 tty1 这种终端机登录的啦!支持 login 程序的软件有 telnet 服务与本机前面的 tty1~tty6 的 login, 这也是我们提到的,为何使用传统的 telnet 连接主机连接到 Linux 时,缺省无法使用 root 身份登录的主要原因啰。
[root@linux ~]# vi /etc/security/limits.conf # 添加这两行 dmtsai hard fsize 10240 @users hard fsize 10240 # 注意到,帐号前面加上 @ 表示为『群组!』那么下次 dmtsai 或者是属于 users 的群组的用户登录这个 Linux 主机时, 你可以利用 ulimit -a 去察看一下,嘿嘿!他们能用的资源就减小很多了! 更多的用法您可以自行参考一下该文件内的说明啊! ^_^ (记得测试完毕要将数据改回来~否则....以后就麻烦了!)
[root@linux ~]# lastlog Username Port From Latest root tty1 Tue Aug 16 18:06:20 +0800 2005 bin **Never logged in** daemon **Never logged in** ....以下省略.....这样就能够知道每个帐号的最近登录的时间啰~ ^_^
[vbird@linux ~]$ w
16:50:39 up 1:58, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
vbird pts/0 vbird 4:37pm 0.00s 0.06s 0.01s w
dmtsai pts/1 dmtsai 4:38pm 1:51 0.07s 0.01s man write
我以 vbird 发送一个消息给 dmtsai 时,可以这样做:[vbird@linux ~]$ write dmtsai Hi, How are you doing today.... Nothing.... just say hello to you! <==这里按下 [ctrl]+d此时,另一端的 dmtsai 在他的终端接口上就会出现如下所示:
[dmtsai@linux ~]$ Hi, How are you doing today.... Nothing.... just say hello to you! EOF怪怪~立刻会有消息回应给 dmtsai ㄟ!不过......当时 dmtsai 正在查数据,哇! 这些消息会立刻打断 dmtsai 原本的工作喔!所以,如果 dmtsai 这个人不想要接受任何消息, 直接下达这个动作:
[dmtsai@linux ~]$ mesg n
所以,当 vbird 再次下达 write 时,就会出现:
[vbird@linux ~]$ write dmtsai
write: dmtsai has messages disabled
呼呼!了解乎?而如果想要解开的话,再次下达『 mesg y 』就好啦!想要知道目前的 mesg
状态,直接下达『 mesg 』即可!瞭呼?
[root@linux ~]# wall "I will shutdown the linux server about 5m later.
> If you still have to login, please tell me.
> Or I will do it....."
那么除非您的 mesg 状态是 n ,否则,嘿嘿!就能够收到这个广播消息啰! ^_^[vbird@linux ~]$ mail dmtsai -s "nice to meet you" Hello, D.M. Tsai Nice to meet you in the network. You are so nice. byebye! . <==这里很重要喔,结束时,最后一行输入小数点 . 即可! Cc: <==这里是所谓的『副本』,不需要寄给其他人,所以直接 [Enter] [vbird@linux ~]$ <==出现提示字符,表示输入完毕了!呼呼!如此一来,你就已经寄出一封信给 dmtsai 这位用户啰,而且,该信件标题为: nice to meet you,信件内容就如同上面提到的。不过,你或许会觉得 mail 这个程序不好用~ 因为在信件编写的过程中,如果写错字而按下 Enter 进入次行,前一行的数据很难删除ㄟ! 那怎么办?没关系啦!我们使用数据流重导向啊!呵呵!利用那个小于的符号 ( < ) 就可以达到取代键盘输入的要求了。也就是说,你可以先用 vi 将信件内容编好, 然后再以 mail dmtsai -s "nice to meet you" < filename 来将文件内容传输即可。
例题:请将你的家目录下的环境变量档 (~/.bashrc) 寄给自己! 答:
|
[dmtsai@linux ~]$ mail Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/dmtsai": 1 message 1 new >N 1 vbird@linux.site Fri Sep 2 23:53 16/552 "nice to meet you" & <==这里可以输入很多的指令,如果要查阅,输入 ? 即可!在 mail 当中的提示字符是 & 符号喔,别搞错了~输入 mail 之后,我可以看到我有一封信件, 这封信件的前面那个 > 代表目前处理的信件,而在大于符号的左边那个 N 代表该封信件尚未读过, 如果我想要知道这个 mail 内部的指令有哪些,可以在 & 之后输入『 ? 』,就可以看到如下的画面:
& ?
Mail Commands
t <message list> type messages
n goto and type next message
e <message list> edit messages
f <message list> give head lines of messages
d <message list> delete messages
s <message list> file append messages to file
u <message list> undelete messages
R <message list> reply to message senders
r <message list> reply to message senders and all recipients
pre <message list> make messages go back to /usr/spool/mail
m <user list> mail to specific users
q quit, saving unresolved messages in mbox
x quit, do not remove system mailbox
h print out active message headers
! shell escape
cd [directory] chdir to directory or home if none given
<message list> 指的是每封邮件的左边那个数字啦!而几个比较常见的指令是:指令 | 意义 |
h | 将信件的标题列出来。如果想要查阅 40 封信件左右处的所有信件标头,可以输入『 h 40 』 |
d | 删除啦~假设我要删除第10封信,可以『 d10 』,假如我想要删除 20-40 封信,可以『 d20-40 』, 不过,这个动作要生效的话,必须要配合 q 这个指令才行(参考底下说明)! |
s | 将信件保存成为文件。举例来说,我要将第 5 封信件的内容存成 ~/mail.file 的话,可以: 『 s 5 ~/mail.file 』喔! |
x | 或者输入 exit 都可以。这个是『不作任何动作离开 mail 程序』的意思。 不论你刚刚删除了什么信件,或者读过什么,使用 exit 都会直接离开 mail,所以刚刚进行的删除与阅读工作都会无效。 如果您只是查阅一下邮件而已的话,一般来说,建议使用这个离开啦!除非你真的要删除某些信件。 |
q | 相对于 exit 是不动作离开, q 则会进行两项动作: 1. 将刚刚删除的信件移出 mailbox 之外; 2. 将刚刚有阅读过的信件存入 ~/mbox ,且移出 mailbox 之外。鸟哥通常不很喜欢使用 q 离开, 因为,很容易忘记读过什么咚咚~导致信件给他移出 mailbox 说~ |
[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 这个指令的啦!
[root@linux ~]# echo "dmtsai:abcdefg" | chpasswd
神奇吧!这样就可以更新了呢!在缺省的情况中, chpasswd 使用的是 DES 加密方法来加密,
我们可以使用 chpasswd -m 来使用 FC4 缺省的 MD5 加密方法,不过,
FC4 似乎怪怪的,我老是无法使用 -m 来达成这个指令。无论如何,
还是可以直接使用 chpasswd 来应用 DES 加密喔!
使用 DES 方法加密后,在 /etc/shadow 的密码栏内,他的密码位数为 13 位,
瞭乎??
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别怀疑!这样就搞定了一个帐号的设置了! 从此以后,你可以创建任何名称的帐号啰~不过,还是不建议您设置一些很怪很怪的帐号名称啦!
1. 修改帐号属性 [root@linux ~]# vi /etc/passwd popuser:x:720:12::/home/popuser:/sbin/nologin 2. 密码同步,并且给予密码! [root@linux ~]# pwconv [root@linux ~]# passwd popuser这样就又 OK 了~哇!真是太简单了杰克~....
#!/bin/bash # # 这支程序主要在帮您创建大量的帐号之用, # 更多的使用方法请参考: # http://vbird.org.cn/linux_basic/0410accountmanager.php#manual_amount # # 本程序为鸟哥自行开发,在 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!创建完成!"这支程序可以在底下链接下载: