|
最近更新日期:2005年09月05日
本文已不再维护,更新文章请参考此处
1. Linux 的账号与群组
1.1 使用者识别: UID 与 GID 1.2 使用者账号:/etc/passwd, /etc/shadow 1.3 关于群组: 有效与初始群组、 groups, newgrp 2. 账号管理: 2.1 新增与移除使用者: useradd, 相关配置文件, passwd, usermod, userdel 2.2 用户功能:chsh, chfn, finger, id 2.3 新增与移除群组:groupadd, groupmod, groupdel, gpasswd, newgrp 2.4 密码管理: passwd 3. 使用者身份切换: 3.1 su 3.2 sudo, visudo (/etc/sudoers) 4. 使用者的特殊 shell 与 PAM 模块 4.1 特殊的 shell , /sbin/nologin 4.2 PAM 模块: /etc/nologin, /etc/securetty, /etc/security/* 5. Linux 系统上用户的对谈与 mail 的使用: 4.1 查询使用者: w, who, last, lastlog 4.2 使用者对谈: talk, mesg, wall 4.3 使用者邮件信箱: mail 6. 手动新增使用者: 5.1 一些检查工具:pwck, pwconv, pwunconv, chpasswd 5.2 特殊账号,如纯数字账号的建立: 5.3 不开放终端机登入的账号 (ex>mail acccount) 5.4 一个大量建置账号的范例: 7. 本章习题练习 8. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23887 大标题的图示Linux 的账号与群组
管理员的工作中,相当重要的一环就是『管理账号』啦!因为整个系统都是你在管理的,
并且所有的一般用户的申请,都必须要透过你的协助才行!所以你就必须要了解一下如何管理好一个网站的账号管理啦!
在管理 Linux 主机的账号时,我们必须先来了解一下 Linux 到底是如何辨别每一个使用者的!
小标题的图示使用者识别: UID 与 GID
虽然我们登入 Linux 主机的时候,输入的是我们的账号,但是,其实 Linux
主机并不会直接认识你的『账号名称』的,他仅认识 ID 啊〜ID 就是一组号码啦〜
主机对于数字比较有概念的,账号只是为了让人们容易记忆而已。
而您的 ID 与账号的对应就在 /etc/passwd 当中哩。
Tips: 如果你曾经以 tarball 安装过软件的话,那么应该不难发现,在解压缩之后的档案, 档案拥有者竟然是『不明的数字』?奇怪吧?这没什么好奇怪的,因为 Linux 说实在话,他真的只认识代表你身份的号码而已! 鸟哥的图示 那么档案如何判别他的拥有者与群组呢?其实就是利用 UID 与 GID 啦! 每一个档案都会有所谓的拥有者 ID 与拥有群组 ID ,亦即是 UID 与 GID ,然后系统会依据 /etc/passwd 的内容,去将该档案的拥有者与组名, 使用账号的形式来秀出来!我们可以作个小实验,你可以以 root 的身份 vi /etc/passwd ,然后将你的一般身份的使用者的 ID 随便改一个号码, 然后再到你的一般身份的目录下看看原先该账号拥有的档案,你会发现该档案的拥有人变成了 『数字了』呵呵!这样可以理解了吗? [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 啦〜
好了,那么我们再来谈一谈,到底我们是怎样登入 Linux 主机的呢?其实也不难啦!当我们在主机前面或者是以
telnet 或者 ssh 登入主机时,系统会出现一个 login 的画面让你输入账号,这个时候当你输入账号与密码之后,
Linux 会:
小标题的图示使用者账号:/etc/passwd, /etc/shadow
由上面的说明您大概已经知道,嘿嘿!账号管理最重要的两个档案就是『 /etc/passwd
与 /etc/shadow 』了!这两个档案可以说是 Linux 里头最重要的档案之一了!
如果没有这两个档案的话,呵呵!您可是无法登入 Linux 的呦!所以,底下我们先针对这两个档案来进行说明。
当然啰,更详细的数据您可以自行 man 5 passwd 及 man 5 shadow 的啦〜
这个档案的构造是这样的:每一行都代表一个账号,
有几行就代表有几个账号在你的系统中!不过需要特别留意的是,
里头很多账号本来就是系统中必须要的,我们可以简称他为系统账号,
例如 bin, daemon, adm, nobody 等等,这些账号是系统正常运作时所需要的,请不要随意的杀掉他呢!
这个档案的内容有点像这样:
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
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 号码喔!
上面这样说明可以了解了吗?是的, UID 为 0 的时候,就是 root 呦!所以请特别留意一下你的 /etc/passwd 档案!
上面约略提到,由于每个程序都需要取得 uid 与 gid 来判断权限的问题,所以,
/etc/passwd 的权限必须要设定成为 -rw-r--r-- 这样的权限,在这样的情况下,
用户的密码不就任何人都可以看到吗?即使这个档案内的密码栏是加密的,
坏心肠的朋友也可能利用暴力破解法去 try and error 找出您的密码数据......
因为这样的关系,所以后来发展出将密码移动到 /etc/shadow 这个档案分隔开来的技术, 而且还加入很多的密码限制参数在 /etc/shadow 里头呢!我们先来了解一下这个档案的构造吧! 我的 /etc/shadow 档案有点像这样: root:1ドル$i9Ejldjfjio389u9sjl$jljsoi45QE/:12959:0:99999:7::: bin:*:12959:0:99999:7::: daemon:*:12959:0:99999:7::: adm:*:12959:0:99999:7:::
dmtsai:1ドル8ドルzdAKdfC$XDa8eSus2I7nQL7UjRsIy/:13025:5:60:7:2:13125:
Tips: 常常听到:我的密码忘记或者被更动了?怎么办? 有的时候会发生这样的情况,就是说,你的 root 密码忘记了!要怎么办?重新安装吗?另外, 有的时候是被入侵了, root 的密码被更动过,该如何是好? 这个时候就必须要使用到 /etc/shadow 这个数据了!我们刚刚知道密码是存在这个档案中的, 所以只要你能够以各种可行的方法开机进入 Linux ,例如单人维护模式,或者是以 live CD (KNOPPIX) 来进入 Linux 系统。之后,将硬盘顺利挂载,然后进入 /etc/shadow 这个档案中,将 root 的密码这一栏全部清空!然后再登入 Linux 一次,这个时候 root 将不需要密码 (有的时候需要输入空格符) 就可以登入了!这个时候请赶快以 passwd 设定 root 密码即可。 鸟哥的图示 小标题的图示关于群组: 有效与初始群组、groups, newgrp
认识了账号相关的两个档案 /etc/passwd 与 /etc/shadow 之后,您或许还是会觉得奇怪,
那么群组的配置文件在哪里?还有,在 /etc/passwd 的第四栏不是所谓的 GID 吗?那又是啥?
呵呵〜此时就需要了解 /etc/group 与 /etc/gshadow 啰〜
这个档案就是在记录 GID 与组名的对应了〜我的 /etc/group 内容有点像这样:
root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon sys:x:3:root,bin,adm
还记得每个使用者在他的 /etc/passwd 里面的第四栏有所谓的 GID 吧?那个 GID 就是所谓的『初始群组 (
initial group ) 』了!也就是说,当用户一登入系统,立刻就拥有这个群组的相关权限的意思。
举例来说,我们上面提到 dmtsai 这个使用者的 /etc/passwd 与 /etc/group 还有 /etc/gshadow
相关的内容如下:
[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:!::
但是非 initial group 的其他群组可就不同了。举上面这个例子来说,我将 dmtsai 加入 users 这个群组当中,由于 users 这个群组并非是 dmtsai 的初始群组,因此, 我必须要在 /etc/group 这个档案中,找到 users 那一行,并且将 dmtsai 这个账号加入第四栏, 这样 dmtsai 才能够支持 users 这个群组啊。 那么在这个例子当中,因为我的 dmtsai 这个账号同时支持 dmtsai 与 users 这两个群组, 因此,在读取/写入/执行档案时,针对群组部分,只要是 users 与 dmtsai 这两个群组拥有的功能, 我 dmtsai 这个使用者都能够拥有喔!这样瞭呼?不过,这是针对已经存在的档案而言, 如果今天我要建立一个新的档案或者是新的目录,请问一下,新档案的群组是 dmtsai 还是 users ? 呵呵!这就得要检查一下当时的有效群组了 (effective group)。 如果我以 dmtsai 这个使用者的身份登入后,该如何知道我所有支持的群组呢? 很简单啊,直接输入 groups 就可以了!注意喔,是 groups 有加 s 呢!结果像这样: [dmtsai@linux ~]$ groups
dmtsai users
那么如何变更有效群组呢?这个有两个方法,不论是那个方法,都是以 newgrp 达成的! 以上面这个例子来说,因为我的 dmtsai 使用者同时拥有 dmtsai 与 users 两个群组,因此, dmtsai 当然可以随时切换 dmtsai/users 成为有效群组啰。所以,我可以下达: [dmtsai@linux ~]$ newgrp users [dmtsai@linux ~]$ groups users dmtsai 我们额外的来讨论一下 newgrp 这个指令,这个指令可以变更目前用户的有效群组, 而且是另外以一个 shell 来提供登入的喔,所以,以上面的例子来说, dmtsai 这个使用者目前是以另一个 shell 登入的,而且新的 shell 给予 dmtsai 有效 GID 为 users 就是了。当直接执行『 newgrp groupname 』时,使用者的有效群组会成为 groupname , 此时虽然使用者的环境设定(例如环境变量等等其他数据)不会有影响,但是使用者的『权限』将会重新被计算。 举例来说, dmtsai 此时建立的新档案群组是 users 了〜 鸟哥的这个例子当中,要注意的是, dmtsai 这个使用者本来就属于 users 与 dmtsai 这两个群组, 所以他可以直接使用 newgrp 来切换有效群组,而要离开新的有效群组时,输入『 exit 』即可。 假设我的 Linux 系统当中还有另一个群组,名称为 vbird,那么 dmtsai 是否可以登入 vbird 这个群组? 在某些前提下是可以的:
刚刚讲了很多关于『有效群组』的概念,另外,也提到 newgrp 这个指令的用法,
但是,如果 /etc/gshadow 这个设定没有搞懂得话,那么 newgrp 是无法动作的呢!
我的 /etc/gshadow 的内容有点像这样:
root:::root bin:::root,bin,daemon daemon:::root,bin,daemon sys:::root,bin,adm
大标题的图示账号管理
好啦!既然要管理账号,当然是由新增与移除使用者开始的啰〜底下我们就分别来谈一谈如何新增、
移除与更改用户的相关信息吧〜
小标题的图示新增与移除使用者: useradd, 相关配置文件, passwd, usermod, userdel
要如何在 Linux 的系统新增一个用户啊?呵呵〜真是太简单了〜直接利用 useradd 这个指令即可!
他的指令下达方法如下:
[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 差很多ㄟ!
我们使用 useradd 去新增使用者时,一些在 /etc/passwd 当中的值会去参考『
/etc/default/useradd 』
,这个档案的内容有点像这样:
GROUP=100 <==预设的群组 HOME=/home <==默认的家目录所在目录 INACTIVE=-1 <==在 /etc/shadow 内的第 7 栏 EXPIRE= <==在 /etc/shadow 内的第 8 栏 SHELL=/bin/bash <==预设的 shell SKEL=/etc/skel <==用户家目录的内容数据参考目录 关于群组的建立机制: 当我们直接使用 useradd 来新增账号时,在预设的情况下,相关的信息都是参考 /etc/default/useradd 这个档案内容的设定的。不过,对于使用者群组的建立机制中, 则有两种不一样的机制存在的:
关于用户家目录的参考:/etc/skel/* 在这个档案当中,比较奇怪的是 SKEL 这个玩意儿了,他是啥? 其实,这个咚咚就是用户家目录的参考目录啰〜举我们的范例一为例,我利用 useradd vbird1 时,他在 /home/vbird1 这个用户家目录内的各项数据,都是由 /etc/skel 所复制过去的〜所以呢,未来如果我想要让新增使用者时,该用户的环境变量 ~/.bashrc 就设定妥当的话,您可以到 /etc/skel/.bashrc 去编辑一下,也可以建立 /etc/skel/public_html 这个目录,那么未来新增使用者后,在他的家目录下就会有 public_html 那个目录了!这样瞭呼? 关于使用者 UID/GID 的设定: 另外,与密码还有 UID/GID 有关的配置文件则是在 /etc/login.defs 里面, 这个档案有点像这样: 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 会是多少?答案是:『 如果 /etc/passwd 里面的账号所属的 UID 没有大于 /etc/login.defs 里头的 UID_MIN (在本例中是 500)时,则以 UID 500 来作为一个新账号的 UID。 如果 /etc/passwd 已有大于 500 以上的 UID 时,则取 /etc/passwd 内最大的那个 UID + 1 作为新设帐号的 UID。』而如果我是想要建立系统用的账号,所以使用 useradd -r sysaccount 这个 -r 的参数时,就会找『比 500 小的最大的那个 UID + 1 』就是了。 ^_^ 关于家目录默认是否建立: 另外也要注意那个 CREATE_HOME 的设定值,这个设定值也很重要。一般来说,在 FC4 的环境下, 我们使用 useradd useraccount 时,预设是会主动的建立家目录的,除非使用 -M 这个参数〜 至于 SuSE server 9 这个版本来说,嘿嘿!他默认是不建立家目录的,除非使用 -m 这个参数呢! 因此,在这里鸟哥也要建议您,如果肯定要建立家目录的话,不论在那个版本, 你最好还是加上 -m 这个参数来强制建立家目录吧! ^_^ 那么您就能知道啰, useradd 这支程序在建立 Linux 上的账号时,至少会参考:
刚刚我们讲到了,使用 useradd 建立了账号之后,在预设的情况下,该账号是暂时被封锁的,
也就是说,该账号是无法登入的,你可以去瞧一瞧 /etc/shadow 内的第二个字段就晓得啰〜
那该如何是好?怕什么?直接给他设定新密码就好了嘛!对吧〜设定密码就使用 passwd 啰!
[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 那么如果是一般身份使用者,或者是 root 想要修改自己的密码时,直接输入『 passwd 』, 就能够修改自己的密码了。一般身份用户输入的密码会经过系统的验证, 验证的机制除了 /etc/login.defs 里头规定的最小密码字符数之外,还会受到 /etc/pam.d/passwd 这个 PAM 模块的检验呢!一般来说,您输入的密码最好要符合底下的要求:
所谓这『人有失手,马有乱蹄』,您说是吧?所以啰,当然有的时候会『不小心』在 useradd
的时候加入了错误的设定数据。或者是,在使用 useradd 后,发现某些地方还可以进行细部修改。
此时,当然我们可以直接到 /etc/passwd 或 /etc/shadow 去修改相对应字段的数据,
不过,Linux 也有提供相关的指令让大家来进行账号相关数据的微调呢〜那就是 usermod 啰〜
[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ドル24ドルISJM4K$bbdijdreoieaVaBMAHsm6.:13026:0:99999:7::13149: 范例三:暂时冻结 dmtsai 的密码! [root@linux ~]# usermod -L dmtsai [root@linux ~]# grep dmtsai /etc/shadow dmtsai:!1ドル24ドルISJM4K$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 喔!
这个功能就太简单了〜目的在删除使用者啦〜与他相关的档案有:
[root@linux ~]# userdel [-r] username 参数: -r :连同用户的家目录也一起删除 范例: 范例一:删除 vbird2 ,连同家目录一起删除 [root@linux ~]# userdel -r vbird2 另外,其实用户如果在系统上面操作过一阵子了,那么该用户其实在系统内可能会含有其他档案的。 举例来说,他的邮件信箱 (mail box) 或者是例行性命令 (crontab) 之类的档案。 所以,如果想要完整的将某个账号完整的移除,最好可以在下达 userdel -r username 之前, 先以『 find / -user username 』查出整个系统内属于 username 的档案, 然后再加以删除吧! 小标题的图示用户功能:chfn, chsh
不论是 useradd/usermod/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 [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 使用 chfn 这个指令之后,程序会要求您输入许多的信息,包含了:
finger 的中文字面意义是:『手指』,嘿嘿!这个 finger 可以查阅的数据可就多了!
刚刚我们不是使用 chfn 来修改 dmtsai 这个用户的相关信息吗?那些个相关信息就可以利用
finger 来查阅出来的!他的查询方法如下:
[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 的结果最底下显示『No mail. No Plan.』呢? 呵呵! finger 会主动去 /var/spool/mail 查询看看有没有该账号的邮件信箱 (mailbox), 而且还会去查询 ~/.plan 那个档案,那就是计划档啦〜比如说,我在 dmtsai 家目录底下建立 .plan 这个档案,他的内容是『DmTsai will write something....』,结果使用 finger 时, 嘿嘿!您可以自行看看结果会怎样啊! ^_^
id 这个指令则可以查询某人或自己的相关 UID/GID 等等的信息,他的参数也不少,不过,
都不需要记〜反正使用 id 就全部都列出啰〜 ^_^
[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) 小标题的图示新增与移除群组
OK!了解了账号的新增、删除、更动与查询后,再来我们可以聊一聊群组的相关内容了。
基本上,群组的内容都与这两个档案有关:
[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:!::
跟 usermod 类似的,这个指令仅是在进行 group 相关参数的修改而已。
[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:!::
呼呼! groupdel 自然就是在删除群组的啰〜用法很简单:
[root@linux ~]# groupdel [groupname] 范例一:将刚刚的 groupname 删除! [root@linux ~]# groupdel groupname 范例二:若要删除 dmtsai 这个群组的话?? [root@linux ~]# groupdel dmtsai groupdel: cannot remove user's primary 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
还有印象吗?我们前面谈到 /etc/gshadow 时就提过这个指令了!
『newgrp 会额外以另一个 login 来提供使用者登入到另一个 shell 中,
并且将有效群组改为 newgrp 后面接的那个群组,若没有接群组,则预设群组为 initial group 』
小标题的图示密码管理: passwd
再来跟大家提一提那个重要的密码概念!您得要特别留意的是,今天,您的主机若是遭到入侵,
对方的第一个入侵点自然就是您主机上面账号的『密码』了,所以,
如果您的密码定义的比较严格的话,那么自然对方就不容易猜到你的密码,自然就会比较有保障啦!
目前一些 Cracker 较常使用的密码破解软件,大抵是『字典攻击法』 及所谓的『暴力破解法』,就字面上的意义来说, 『字典攻击法』是将字典里面所查的到的任何单字或词组都输入的程序中, 然后使用该程序一个一个的去尝试破解你的密码,不要觉得这样的速度似乎很慢,实际上, 现今的计算机指令周期太高了,字典攻击法的操作效率基本上是很高的!另一个『 暴力破解法』就是直接使用键盘上面任何可以使用的按键,然后依照组合,以 1 个, 2 个, 3 个.... 密码组合的方式去破解你的密码!这个方式就真的比较慢一点,如果你的密码组合是 6~8 个字符以上,那么暴力攻击法还是需要好长一段时间才能够破解的了的! 由上面的『字典攻击法』与『暴力破解法』猜测你的密码的方式来说,您知道如何设定一个好的密码了吗? 是的,您的密码最好需要底下几个特性:
好了!知道了密码的重要性,与基本的设定之后,接着下来我们谈一谈如何手动设定密码吧!基本上, root 可以设定『任何样式的密码』,而且, root 也可以帮助 user 订定他们的密码!至于 user 仅能修改自己的密码!那么修改密码使用什么命令?就是 passwd 这个命令啦!咦!这里突然给他想到几个重要信息,大家赶紧复习一下:
[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 大标题的图示使用者身份切换:
什么?在 Linux 系统当中还要作身份的变换?这是为啥?
小标题的图示su [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 的密码喔!
小标题的图示sudo
使用 su 切换身份真的是很简单啦〜不过, su 却有一个很严重的问题,
那就是.....我们必须要知道想要变成的那个人的登入密码〜
举例来说,如果我想要变成 root ,那么就必须要知道 root 的密码才行,
如果我想要变成 dmtsai 来工作,那么除非我是 root ,否则就必须要知道 dmtsai
这个用户的密码才行〜而众所皆知的,如果多人管理一部主机的话,
大家都知道 root 的密码,那......挺危险的,不是吗?!
这个时候, sudo 就派的上用场啰〜那么 sudo 是怎样工作的呢?
不过,由上面的说明当中,您也会了解,是否具有 sudo 的执行权限是很重要的, 而 sudo 的执行权限与 /etc/sudoers 这的档案有关。在预设的情况下,只有 root 才能够使用 sudo 呢!至于编辑 /etc/sudoers 则需要 visudo 这个指令。好了, 底下我们就来看一看 sudo 的语法先。 [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 的〜这是因为我们上面提到的啊,还没有去设定 /etc/sudoers 嘛! 所以啰,如果您要测试上面的范例之前,是需要将 /etc/sudoers 动动手脚的。 不过,因为 /etc/sudoers 需要一些比较特别的语法,因此,如果你直接以 vi 去编辑他时, 如果输入的字句错误,可能会造成无法启用 sudo 的困扰,因此,建议您一定要使用 visudo 去编辑 /etc/sudoers 喔!(注: visudo 必须要使用 root 的身份来执行!) [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
例题:我想要建立一个可以帮忙系统管理员变更用户密码的群组,名称为 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 的密码啰! ^_^ 在 /etc/sudoers 里头加入别名有很多的好处,举例来说,以上面的例子来讲, 假设未来我有其他的用户要加入该密码管理的群组时,直接将账号加入 ADMPW 那个群组中就好了,很简单的使用吧! ^_^。再看看下一题:
例题:我的系统中有 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 的配置文件啦!很简单对吧! ^_^ 好了,我们知道 sudo 可以搭配 su 来进行一堆系统的工作对吧! 因为 sudo 仅能进行一次指令,很麻烦,如果我能够将 sudo 与 su 搭配在一起,不就很棒了吗? 这个时候,我可以利用上面已经建立好的 ADMPW 群组来新增这一行:
大标题的图示使用者的特殊 shell 与 PAM 模块
我们前面一直谈到的大多是一般身份用户与系统管理员 (root) 的相关操作,
而且大多是讨论关于可登入系统的账号来说。那么换个角度想,如果我今天想要建立的,
是一个『仅能使用 mail server 相关邮件服务的账号,而该账号并不能登入 Linux 主机』呢?
如果不能给予该账号一个密码,那么该账号就无法使用系统的各项资源,当然也包括 mail 的资源,
而如果给予一个密码,那么该账号就可能可以登入 Linux 主机啊!呵呵〜伤脑筋吧〜
所以,底下让我们来谈一谈这些有趣的话题啰!
小标题的图示特殊的 shell, /sbin/nologin
如果你曾经仔细的看过 /etc/shells 这个系统可用的 shell 档案,以及
/etc/passwd 这个档案的内容时,你应该会发现,嘿嘿!怎么有个怪怪的 /sbin/nologin 啊!
这是什么 shell 呢?呵呵!赶紧利用 man nologin 就可以知道啦〜
其实,这个 shell 通常是给系统账号使用的,因为这个 /sbin/nologin 事实上并无法给予账号实际登入, 如果你利用 usermod 修改了 dmtsai 这个使用者的 shell 成为 /sbin/nologin 之后, 再次想要以 dmtsai 重新登入系统时,他在屏幕上会出现这样的讯息: This account is currently not available. 换个角度来想,如果我的 Linux 主机提供的是邮件服务,所以说,在这部 Linux 主机上面的账号, 其实大部分都是用来收受主机的信件而已,并不需要登入主机的呢! 这个时候,我们就可以考虑让单纯使用 mail 的账号以 /sbin/nologin 做为他们的 shell , 这样,最起码当我的主机被尝试想要登入系统时,可以拒绝该账号呢! 另外,如果我想要让某个具有 /sbin/nologin 的使用者知道,他们不能登入主机时, 其实我可以建立『 /etc/nologin.txt 』这个档案, 并且在这个档案内说明不能登入的原因,那么下次当这个用户想要登入系统时, 屏幕上出现的就会是 /etc/nologin.txt 这个档案的内容,而不是预设的内容了! 小标题的图示PAM 模块:/etc/nologin, /etc/securetty
当一个用户想要登入 Linux 主机时,他受到什么限制呢?我们说,
他除了必须要通过 /etc/passwd 及 /etc/shadow 的验证并取得相关的权限资料,
最后获得一个 shell 之外,事实上,他在登入系统之前,就得要通过 PAM (Pluggable Authentication
Modules, 嵌入式模块) 的验证才行。
PAM 模块的用途非常的多,除了可以在使用者登入时进行身份的验证之外, 也可以辅助一些应用程序的验证之用喔!举例来说,我们前面提到的密码修改程序『 passwd 』 ,当我们执行密码修订的时候,这个程序不是会告诉我们您输入的密码是否合于规范吗? 如果是记录在字典当中的密码,或者是与账号相同的密码,那么就会被 PAM 模块打回票, 也就无法通过验证了! 那么 PAM 怎么运作呢?我们同样以 /usr/bin/passwd 这支程序来作为简单的说明好了:
反正 PAM 模块就是让程序呼叫用的,而当程序呼叫时,
PAM 就会利用相对应的配置文件来进行一些验证就是了。我们还是举 passwd 为例好了,
如果你去观察一下 /etc/pam.d/passwd 的内容时,他是这样的:
[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 另外,在上面表格当中的模块中,比较有趣的是被鸟哥注明特殊字体的部分, 这两个模块: pam_securetty.so 及 pam_nologin 是挺有趣的喔! 我们就额外来谈一谈这两个关于登入环境的验证模块吧!
这个 pam_securetty 模块是干嘛用的?其实他最主要的功能就是在预防不安全的登入环境啦!
而且主要是针对 root 这个使用者的身份喔!
这个模块在被启用时,会去读取 /etc/securetty 这个档案,
我们『可以将被认定是安全的终端机 (terminal) 环境写入这个档案中,
则 root 仅可以在那几个终端机环境下登入』的啦!
一般来说,我们会认定在主机前面的环境是安全的,而使用网络登录的环境则比较危险。 因此,一般 /etc/securetty 的内容大多是这样: tty1 tty2 tty3 tty4 ... 那么如何克服呢?其实也很简单啦,就将这个模块的验证移除即可! 主要有两种方式:
那么 pam_nologin 又是在搞什么咚咚啊?其实,这个模块也是在控制用户登入用的。
不过,这个模块只针对一般身份用户有效,对
root 是没有效果的。这个模块必须要与 /etc/nologin
搭配使用,注意喔,是 /etc/nologin ,而不是 /etc/nologin.txt ,
这两个档案的用途是不相同的喔! ^_^。
当 /etc/nologin 档案存在时,则任何一个一般身份账号在尝试登入时, 都仅会获得 /etc/nologin 内容的信息,而无法登入主机。举例来说,当我建立 /etc/nologin ,并且内容设定为『This Linux server is maintaining....』, 那么任何人尝试登入时,都仅会看到上面提到的这段讯息,而且无法登入喔! 一直要到 /etc/nologin 被移除后,一般身份使用者才能够再次的登入啊!
事实上,更多的 PAM 模块设定信息您可以参考 /etc/security/* 里面的档案设定,
尤其是针对用户利用 Linux 系统资源的 limits.conf 以及时间的 time.conf 。
我们知道用户利用系统资源的指令是 ulimit ,那么假如我想要让 dmtsai
仅能存取 10MBytes (10240KBytes) 的档案大小,那么我可以这样做:
[root@linux ~]# vi /etc/security/limits.conf # 新增这两行 dmtsai hard fsize 10240 @users hard fsize 10240 # 注意到,账号前面加上 @ 表示为『群组!』 大标题的图示Linux 系统上用户的对谈与 mail 的使用:
谈了这么多的系统账号问题,总是该要谈一谈,那么如何针对系统上面的用户进行查询吧?!
想几个状态,如果你在 Linux 上面操作时,刚好有其他的用户也登入主机,你想要跟他对谈,该如何是好?
你想要知道某个账号的相关信息,该如何查阅?呼呼!底下我们就来聊一聊〜
小标题的图示查询使用者: w, who, last, lastlog
如何查询一个用户的相关数据呢?这还不简单,我们之前就提过了 w, who, finger 等指令了,
都可以让您了解到一个用户的相关信息啦!那么想要知道使用者到底啥时候登入呢?
最简单可以使用 last 检查啊!这个玩意儿我们也在 bash shell 那个章节提过了,
您可以自行前往参考啊!简单的很。不过, last 仅有列出这个月份的资料而已喔。
另外,如果您想要知道每个账号的最近登入的时间,则可以使用 lastlog 这个指令喔! lastlog 会去读取 /var/log/lastlog 档案,结果将数据输出,如下表: [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** ....以下省略..... 小标题的图示使用者对谈: talk, mesg, wall
那么我是否可以跟系统上面的用户谈天说地呢?当然可以啦!
利用 talk 这个指令即可!不过, talk 需要额外的启动一些网络服务,
对于目前的 Linux distribution 以及网络环境,嘿嘿!咱们还是不要玩这个东西啦〜
如果您确定想要玩这个玩意儿,那么请自行 man talk ,
同时考虑启动 ntalk 这个服务看看啰〜
除了直接在线对谈 (talk) 之外,有没有其他讯息传送的功能啊? 有啊!利用 write 是不错的方式啦!他可以直接将讯息传给接收者啰! 举例来说,我们的 Linux 目前有 vbird 与 dmtsai 两个人在在线: [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@linux ~]$ write dmtsai Hi, How are you doing today.... Nothing.... just say hello to you! <==这里按下 [ctrl]+d [dmtsai@linux ~]$ Hi, How are you doing today.... Nothing.... just say hello to you! EOF [dmtsai@linux ~]$ mesg n
[vbird@linux ~]$ write dmtsai
write: dmtsai has messages disabled
相对于 write 是仅针对一个使用者来传『简讯』,我们还可以『对所有系统上面的用户传送简讯』哩〜 如何下达?呼呼!用 wall 即可啊!他的语法也是很简单的喔! [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....."
小标题的图示使用者邮件信箱: mail
使用 wall, write 毕竟要等到使用者在在线才能够进行,有没有其他方式来联络啊?
不是说每个 Linux 主机上面的用户都具有一个 mailbox 吗?
我们可否寄信给使用者啊!呵呵!当然可以啊!我们可以寄、收 mailbox 内的信件呢!
一般来说, mailbox 都会放置在 /var/spool/mail 里面,一个账号一个 mailbox (档案)。
举例来说,我的 dmtsai 就具有 /var/spool/mail/dmtsai 这个 mailbox 喔!
那么我该如何寄出信件呢?嗯!就直接使用 mail 这个指令即可! 这个指令的用法很简单的,直接这样下达:『 mail username@localhost -s "邮件标题" 』即可! 一般来说,如果是寄给本机上的使用者,基本上,连『 @localhost 』都不用写啦! 举例来说,我以 vbird 寄信给 dmtsai ,信件标题是『 nice to meet you 』,则: [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 ~]$ <==出现提示字符,表示输入完毕了!
例题:请将你的家目录下的环境变量文件 (~/.bashrc) 寄给自己! 答:
刚刚上面提到的是关于『寄信』的问题,那么如果是要收信呢?呵呵!同样的使用 mail 啊! 假设我以 dmtsai 的身份登入主机,然后输入 mail 后,会得到什么? [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 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
指令 意义
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 说〜
mail 这个指令内容还有很多可以玩的,不过,我们这里仅是介绍给您如何让一般身份使用者来使用 mail 而已,所以就介绍到此啰〜 ^_^ 大标题的图示手动增加使用者:
一般来说,我们不很建议大家使用手动的方式来新增使用者,为什么呢?
因为使用者的建立涉及到 GID/UID 等权限的关系,而且,与档案/目录的权限也有关系,
使用 useradd 可以帮我们自动设定好 UID/GID 家目录以及家目录相关的权限设定,
但是,手动来增加的时候,有可能会忘东忘西,结果导致一些困扰的发生。
不过,要了解整个系统,最好还是手动来修改过比较好,至少我们的账号问题可以完全依照自己的意思去修订, 而不必迁就于系统的默认值啊!但是,还是要告诫一下朋友们,要手动设定账号时, 您必须要真的很了解自己在作什么,尤其是与权限有关的设定方面喔! 好吧!底下就让我们来玩一玩啰〜 ^_^ 小标题的图示一些检查工具
既然要手动修改账号的相关配置文件,那么一些检查群组、账号相关的指令就不可不知道啊〜
尤其是那个密码转换的 pwconv 及 pwuconv 这两个玩意〜可重要的很呢!
底下我们稍微介绍一下这些指令吧!
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
这个指令主要的目的是在『将 /etc/passwd 内的账号与密码,移动到 /etc/shadow 当中!』
早期的 Unix 系统当中并没有 /etc/shadow 呢,所以,用户的登入密码早期是在 /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@linux ~]# echo "dmtsai:abcdefg" | chpasswd
小标题的图示特殊账号,如纯数字账号的建立
在我们了解了 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. 建立群组 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)
刚刚我们上面建立的这个账号是『可以登入系统的账号』,如果想要建立一个不能登入系统的账号,
例如单纯使用邮件收发信件而已的账号,那么又该如何设定呢?很简单啦〜
你可以这样想:
1. 修改账号属性 [root@linux ~]# vi /etc/passwd popuser:x:720:12::/home/popuser:/sbin/nologin 2. 密码同步,并且给予密码! [root@linux ~]# pwconv [root@linux ~]# passwd popuser 那么又该如何删除这些账号呢?啊!还是建议利用 userdel 啦〜简单〜干脆又利落〜 如果想要暂时移除而已的话,那么利用 passwd -l 及 passwd -u 吧! ^_^。 如果真的那么想要手动来移除这个账号的话,就这样做:
小标题的图示一个大量建置账号的范例
不要怀疑,很多时候,我们都可能需要大量的建置账号的,
举例来说,学校要帮同学建立他们的账号,那就很可能需要啦〜
一般来说,建立账号要进行的前制工作很多,包括要建立账号名称与该账号的密码对应表〜
这个是最讨厌的啦〜而且还要决定需要使用哪一个群组〜呼呼〜好讨厌的感觉那〜
目前很多网站都有提供大量建立账号的工具,例如台南县网中心的卧龙大师: 提供的好用的 cmpwd 程序, 不过,其实我们也可以利用简单的 script 来帮我们达成喔!例如底下这支程序, 他的执行结果与卧龙大师提供的程序差不多啦〜 但是因为我是直接以 useradd 来新增的, 所以,即使不了解 UID ,也是可以适用的啦〜 整支程序的特色是:
#!/bin/bash # # 这支程序主要在帮您建立大量的账号之用, # 更多的使用方法请参考: # http://linux.vbird.org/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!建立完成!" 大标题的图示本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
root 的 UID 与 GID 均为 0 ,所以要让 test 变成 root 的权限,那么就将 /etc/passwd 里面,
test 的 UID 与 GID 字段变成 0 即可!
由于这个账号是暂时失效的,所以不能使用 userdel
来删除,否则很麻烦!那么应该如何设定呢?再回去瞧一瞧 /etc/shadow
的架构,可以知道有这几个可使用的方法:
最好不要随便设定密码!最好可以仔细的参考一下本章内容提到的部分!
在 /etc/login.defs 还有 /etc/default/useradd 里面规定好的!
由于使用 useradd 的时候,会自动以 /etc/skel 做为默认的家目录,所以,我可以在
/etc/skel 里面新增加一个名称为 www 的目录即可!
pwconf 可以让 passwd 里面的账号,设定一份密码到 /etc/shadow 当中!
一般而言,为了让系统能够顺利以较小的权限运作,系统会有很多账号,
例如 mail, bin, adm 等等。而为了确保这些账号能够在系统上面具有独一无二的权限,
一般来说 Linux 都会保留一些 UID 给系统使用。在 FC4 上面,小于 500
以下的账号 (UID) 即是所谓的 System account。
不同的 linux distributions 对于使用者 group 的建立机制并不相同。主要的机制分为:
groupadd alexgroup
useradd -c "Alex Tsai" -g alexgroup -G users -m alex 务必先建立群组,才能够建立使用者喔!
最简单的方法,编辑 /etc/default/useradd ,将里头的 HOME=/home 改成 HOME=/account 即可。
usermod -G vbird1,vbird2,vbird3 dmtsai
2002年05月15日:第一次完成 2003年02月10日:重新编排与加入 FAQ 2005年08月25日:加入一个大量建置账号的实例,简单说明一下而已! 2005年08月29日:将原本的旧文放置到 此处 2005年08月31日:因为 userconf 已经不再这么好用了,使用指令模式比较简单,所以,将他拿掉了〜 2005年09月05日:终于将大量建置账号的那支程序写完了〜真是高兴啊! 2006年03月02日:更新用户 UID 号码,由 65535 升级到 2^32-1 这么大! 2007年04月15日:原本写的 /etc/pam.d/limits.conf 错了!应该是 /etc/security/limits.conf 才对! 2008年04月28日:sudo 关于密码重新输入的部分写错了!已经更新,在这里查阅看看。感谢网友 superpmo 的告知! hint:请加入 ACL ,并将篇名改为『Linux 账号管理与进阶权限设定』含 SELinux 与 ACL 的处理吧! |
|
本网页主要以Firefox配合解析度 1024x768 作为设计依据 鸟哥自由软件整合应用研究室