linux用户管理

5.1.1 管理账号
登陆 linux主机,输入账号和密码后,liunx会:
1.查找/etc/passwd中是否有这个账号,如果没有就跳出,如果有,则将该账号对应的UID和GID读出来,另外,该账号的根目录与shell设定也一并读出来
2.然后核对密码表,这时linux会进入/etc/shadow中找出对应的账号和UID,然后核对刚刚输入的密码与其密码是否相符
3.一切妥当后,进入SHELL

认识UID,GID,SUID与SGID
UID(拥有者ID),GID(群组ID),SUID(set uid) ,SGID(set gid)
SUID仅可用在“二进制文件(binary file)”,SUID因为是程序在执行过程中拥有文件拥有者的权限,因此,它仅可用于二
进制文件,不能用在批处理文件(shell脚本)上
SGID因为是程序在执行过程中拥有文件群组的权限,
认识/etc/passwd和/etc/shadow文件
/etc/passwd:即帐号文件,系统的每一个合法用户账号对应于该文件中的一行记录。这行记录定义了每个用户账号的属性。

下面是一个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
......
desktop:x:80:80:desktop:/var/lib/menu/kde:/sbin/nologin
mengqc:x:500:500:mengqc:/home/mengqc:/bin/bash

在该文件中,每一行用户记录的各个数据段用“:”分隔,分别定义了用户的各方面属性。各个字段的顺序和含义如下:

注册名:口令:用户标识号:组标识号:用户名:用户主目录:命令解释程序

(1)注册名(login_name):用于区分不同的用户。在同一系统中注册名是惟一的。在很多系统上,该字段被限制在8个字符(字母或数字)的长度之内;并且要注意,通常在Linux系统中对字母大小写是敏感的。这与MSDOS/Windows是不一样的。

(2)口令(passwd):系统用口令来验证用户的合法性。超级用户root或某些高级用户可以使用系统命令passwd来更改系统中所有用户的口令,普通用户也可以在登录系统后使用passwd命令来更改自己的口令。

现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将/etc/shadow作为真正的口令文件,用于保存包括个人口令在内的数据。当然shadow文件是不能被普通用户读取的,只有超级用户才有权读取。

此外,需要注意的是,如果passwd字段中的第一个字符是“*”的话,那么,就表示该账号被查封了,系统不允许持有该账号的用户登录。

(3)用户标识号(UID):UID是一个数值,是Linux系统中惟一的用户标识,用于区别不同的用户。在系统内部管理进程和文件保护时使用UID字段。在Linux系统中,注册名和UID都可以用于标识用户,只不过对于系统来说UID更为重要;而对于用户来说注册名使用起来更方便。在某些特定目的下,系统中可以存在多个拥有不同注册名、但UID相同的用户,事实上,这些使用不同注册名的用户实际上是同一个用户。

(4)组标识号(GID):这是当前用户的缺省工作组标识。具有相似属性的多个用户可以被分配到同一个组内,每个组都有自己的组名,且以自己的组标识号相区分。像UID一样,用户的组标识号也存放在passwd文件中。在现代的Unix/Linux中,每个用户可以同时属于多个组。除了在passwd文件中指定其归属的基本组之外,还在/etc/group文件中指明一个组所包含用户。

(5)用户名(user_name):包含有关用户的一些信息,如用户的真实姓名、办公室地址、联系电话等。在Linux系统中,mail和finger等程序利用这些信息来标识系统的用户。

(6)用户主目录(home_directory):该字段定义了个人用户的主目录,当用户登录后,他的Shell将把该目录作为用户的工作目录。在Unix/Linux系统中,超级用户root的工作目录为/root;而其它个人用户在/home目录下均有自己独立的工作环境,系统在该目录下为每个用户配置了自己的主目录。个人用户的文件都放置在各自的主目录下。

(7)命令解释程序(Shell):Shell是当用户登录系统时运行的程序名称,通常是一个Shell程序的全路径名,如/bin/bash。

需要注意的是,系统管理员通常没有必要直接修改passwd文件,Linux提供一些账号管理工具帮助系统管理员来创建和维护用户账号。

/etc/shadow即 密码文件
root:$1$qnvzih07$LKCr9gldeq1ajos5tuLPH.:13670:0:99999:7:::
bin:*:13670:0:99999:7:::
daemon:*:13670:0:99999:7:::
adm:*:13670:0:99999:7:::
 
 共9栏“用户名:密码:最近更改密码日期:在多少天内不可以修改密码:在多少天内必须修改密
码:在必须修改密码的前多少天提醒用户:当过了必需修改密码的多少天后帐号仍有效:帐号失效日期:保留字段”

/etc/group文件与/etc/gshadow文件
/etc/group文件 /etc/group保存的是用户所在的组的信息,群组文件
/etc/gshadow文件 /etc/group保存的是群组密码.

注意:先增加群组,然后增加用户帐号

5.1.1.1 groupadd
groupadd - 建 立 新 群 组
语法
groupadd [-g gid]  groupname
描述
groupadd 可 指 定 群 组 名 称 来 建 立 新 的 群 组 帐 号 。 需 要 时 可 从 系 统 中 取 得 新 群 组 值 。 groupadd 有 下 列 选 项 可 用 。
-g gid
group的ID 值 。 除 非 使 用 -o 参 数 不 然 该 值 必 须 是 唯 一 , 不 可 相 同 。 数 值 不 可 为 负 。 预 设 为 最 小 不 得 小 于 500 而 逐 次 增 加 。 0~499 传 统 上 是 保 留 给 系 统 帐 号 使 用 。
作用到的文件只有/etc/group和/etc/gshadow文件.
5.1.1.2 groupdel
groupadd - 删 除 群 组
语法
groupdel groupname
注意:删除群组前,请先将该群组的Primary用户删除,primary就是/etc/passwd中其gid设定为这个群组的gid的用户.
5.1.1.3 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 :指定某个目录成为家目录,而不要使用预设值;
-s :后面接一个 shell ,预设是 /bin/bash
建立默认账号(即用useradd username建立的用户)
建立默认账号的基本设定就在/etc/login.defs和/etc/default/useradd中,预先设置的数据都在这两个文件中.
/etc/login.defs 包括电子邮件目录,口令寿命,用户id与组id号,生成主目录的设置,这个文件中的默认变量是一目了然的.不用说,可以通过其它配置文件进一步调整这些设置.
通常默认账号的UID将会取当前在/etc/passwd最大的那个UID+1
/etc/default/useradd内容:
GROUP=100 ---默认用户群组
HOME=/home---默认用户的根目录建立的目录
INACTIVE=-1---是否启动
EXPIRE=  ----是否设定到期时间
SHELL=/bin/bash-----默认shell
SKEL=/etc/skel-----用户根目录的内容
建立一个默认账号,默认的根目录就是/home/username,而这个目录的内容就是由/etc/skel拷贝过去的,所以想让用户的根目录内容变动时,可以直接写入数据到 /etc/skel中.
5.1.1.4 userdel
[root@linux ~]# userdel [-r] username  删除用户账号
    参数:
   -r:将该账号的[home directory]与[/var/spool/mail/username]一并删除
   注意:如果想让一个账号站暂时不启用,那么将/etc/shadow中倒数第一个字段设为0就可以让该账
号无法使用.
   5.1.1.5 chsh 
[root@linux ~]# chsh [-l] [-s shellname] 
参数:
-l:列出当前机器上能用的shell
-s:将当前的shell变为shellname
5.1.1.6 chfn
chfn - 改 变 您 的 finger 讯 息
即改变/etc/passwd中用户说明字段的信息
5.1.1.7 userconf 界面方式新增用户

5.1.2  密码管理与设定 passwd
用户自行修改密码:passwd
root协助用户修改密码:passwd username
5.1.3  用户身份切换
5.1.3.1 su
这个指令一般用来将一般用户转换成超级用户,输入su root后,直接输入密码.
    su [OPTION选项参数] [用户]
  -, -l, ――login 登录并改变到所切换的用户环境;
  -c, ――commmand=COMMAND 执行一个命令,然后退出所切换到的用户环境;
       注意1.su root和su - root指令的不同,如果没有-,那么用户环境还是不变,为初始用户的环境,否则,切               换到新的用户环境
           2.su - root 注:这个和su - 是一样的功能;

5.1.3.2 sudo
[root @test /root]#sudo [-u username] [command]
-u:将身份变成username的身份
通过sudo,我们能把某些超级权限有针对性的下放,并且不需要普通用户知道root密码,所以sudo 相对于权限无限制性的su
来说,还是比较安全的,所以sudo 也能被称为受限制的su ;另外sudo 是需要授权许可的,所以也被称为授权许可的su;
sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份
执行命令,执行完成后,直接退回到当前用户;而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权;
    sudo的配置文件是/etc/sudoers ,我们可以用他的专用编辑工具visodu ,此工具的好处是在添加规则不太准确时,保存出
错时会提示给我们错误信息;配置好后,可以用切换到您授权的用户下,通过sudo -l 来查看哪些命令是可以执行或禁止的;
/etc/sudoers 文件中每行算一个规则,前面带有#号可以当作是说明的内容,并不执行;如果规则很长,一行列不下时,可
以用\号来续行,这样看来一个规则也可以拥有多个行;
/etc/sudoers 的规则可分为两类;一类是别名定义,另一类是授权规则;别名定义并不是必须的,但授权规则是必须的;
别名规则定义格式如下:
  Alias_Type NAME = item1, item2, ……
  或
  Alias_Type NAME = item1, item2, item3 : NAME = item4, item5
  别名类型(Alias_Type):别名类型包括如下四种
  Host_Alias 定义主机别名;
  User_Alias 用户别名,别名成员可以是用户,用户组(前面要加%号)
  Runas_Alias 用来定义runas别名,这个别名指定的是“目的用户”,即sudo 允许切换至的用户;
  Cmnd_Alias 定义命令别名;
  NAME 就是别名,item 是指成员,如果一个别名下有多个成员,成员与成员之间,通过半角,号分隔;成员在必须是有效并事实存在的,item成员受别名类型 Host_Alias、User_Alias、Runas_Alias、Cmnd_Alias 制约,定义什么类型的别名,就要有什么类型的成员相配
授权规则定义格式如下:
   授权用户 主机=命令动作(意思是授权用户可以在主机里做相应的命令动作,在这里的授权用户,主机,命令动作都可采用上面已经定义好的别名)
这三个要素缺一不可,但在动作之前也可以指定切换到特定用户下,在这里指定切换的用户要用( )号括起来,如果不需要密码直接运行命令的,应该加NOPASSWD:参数

实例一:
  beinan ALL=/bin/chown,/bin/chmod
  如果我们在/etc/sudoers 中添加这一行,表示beinan 可以在任何可能出现的主机名的系统中,可以切换到root用户下执行 /bin/chown 和/bin/chmod 命令,通过sudo -l 来查看beinan 在这台主机上允许和禁止运行的命令;
  值得注意的是,在这里省略了指定切换到哪个用户下执行/bin/shown 和/bin/chmod命令;在省略的情况下默认为是切换到root用户下执行;同时也省略了是不是需要beinan用户输入验证密码,如果省略了,默认为是需要验证密码. 取消程序某类程序的执行,要在命令动作前面加上!号
复杂的定义格式:
授权用户 主机=[(切换到哪些用户或用户组)] [是否需要密码验证] 命令1,[(切换到哪些用户或用户组)] [是否需要密码验证] [命令2],[(切换到哪些用户或用户组)] [是否需要密码验证] [命令3]……
  注解:
  凡是[ ]中的内容,是可以省略;命令与命令之间用,号分隔;通过本文的例子,可以对照着看哪些是省略了,哪些地方需要有空格;
  在[(切换到哪些用户或用户组)] ,如果省略,则默认为root用户;如果是ALL ,则代表能切换到所有用户;注意要切换到的目的用户必须用()号括起来,比如(ALL)、(beinan),授权用户中如果是组,以%username表示.
         eg:/etc/sudoers文件内容如下:
#define alias
HOST_Alias CS=tigger,anchor,piper,moet,sigi
HOST_Alias PHYSICS=eprince,pprince,icarus
Cmnd_Alias Dump=/sbin/dump,/sbin/restore
Cmnd_Alias PRINTING=/usr/sbin/lpc,/usr/bin/lprm
Cmnd_ALias SHELLS=/bin/sh,/bin/tcsh,/bin/bash,/bin/ash,/bin/bsh
#permission
mark,ed  PHYCICS=ALL
herb     CS=/usr/sbin/tcpdump:PHYSICS=(operator)DUMP
lynda    ALL=(ALL)ALL,!SHELLS
%wheel   ALL,!PHYSICS=NOPASSWD:PRINTING
信息解释如下:
1.用户mark,ed在phycics组上的任何计算机上运行任何命令
2.用户herb在CS组上的计算机上只能运行/usr/sbin/tcpdump,在PHYSICS组能以operator运行DUMP组中的命令
3.用户lynda能在所有的机器上运行出SHELLS组以外的任何命令
4.用户组wheel能在除PHYSICS组外的任何计算机上不需要密码执行PRINTING组中的任何命令.
     sudo  [ -u username/#uid] -s command 
     sudo -l
    参数:   
     -l 显示出自己(执行 sudo 的使用者)的权限
     -u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)
   -s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shel
-H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )              command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令
eg:
sudo -l 列出目前的权限

5.1.4 用户查询
 id 查询用户的UID,GID及拥有的群组
 finger [-s  #完整列出] username  查询用户的一些相关信息
 groups  查询用户能够支持的群组

5.1.5 手动添加用户(数字账号)
现在支持数字账号的输入
手工添加账号的步骤:
1.建立群组          --------vi /etc/group
2.建立账号          --------vi /etc/passwd
3.将passwd和shadow同步  ----pwconv
4.建立该账号的密码      -----passwd account  
5.建立用户根目录        -----cp -r /etc/skel /home/account
6.更改根目录的属性       ------chown -R account.group /home/account
 
 5.2 磁盘配额
 5.2.1 什么是磁盘配额
  配额就是用来管理硬盘空间的.它是针对整个分区的.
 
  quota 这支程序的限制内容主要分为底下几个部分:
  soft :这是最低限制容量的意思,使用者在宽限期间之内,他的容量可以超过 soft ,但必需要宽限时间之内将磁盘容量降低到 soft 的容量限制之下!
  hard :这是『绝对不能超过』的容量,也就是说, soft 到 hard 之间的容量其实就是宽限的容量啦!可以达到针对使用者的『警示』作用!
  宽限时间:当使用者使用的空间超过了 soft limit ,却还没有到达 hard limit 时,那么在这个『宽限时间』之内,就必需要请使用者将使用的磁盘容量降低到 soft limit 之下!而当使用者将磁盘容量使用情况超过 soft limit 时,『宽限时间』就会自动被启动,而在使用者将容量降低到 soft limit 之下,那么宽限时间就会自动的取消.
 必须在/etc/fstab里给某个分区的挂载选项中加上usrquota参数,并且系统支持quota才能用磁盘配额.
  例子:
先列出几个主要的步骤来说明:
 
开启磁盘的 quota 功能:编辑 /etc/fstab ,使得准备要开放的 quota 磁盘可以支持 quota ��;
预扫瞄磁盘的使用情况:使用 quotacheck 来扫瞄一下我们要使用的磁盘��;
建立使用者的 quota :使用 edquota 来编辑每个使用者或群组的可使用空间��;
启动 quota :使用 quotaon 吧!
 
整个步骤大致上就只有这几步,我们来瞧一瞧如何使用吧!!底下我们以一个简单的范例来进行 quota 的说明��!整个范例的说明如下:
 
我们假设 test 这部主机里头有 test 与 test2 这两个使用者,且他们两个都挂在 test 这个群组下;
每个使用者总共有 50MB 的磁盘空间(不考虑 inode )限制!并且 soft limit 为 45 MB;
而宽限时间设定为 1 天,也就是说,这四个人可以突破 40MB 的限制,但是在一天之内必须要将多余的档案砍掉,否则将无法使用剩下的空间(也就是说,这个账号大概就不能使用了?);
test 这个群组考虑最大限额,所以设定为 90 MB 好了!
 
整个执行步骤可以照下面来执行看看:
建立 test2 这个使用者:
由于我们之前只有 test 这个使用者挂在 test 群组之中,所以必需要先设定一下 test2 这个使用者!因为他的群组必需是 test 这个,而我们去查了一下 /etc/group 发现 test 的 uid 为 501 ,因此,我们可以这样来设定 test2 呢!
  [root @test root]# useradd �Cm �Cg 501 test2
[root @test root]# passwd test2
Changing password for user test2.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
 
开启磁盘的 quota 功能:
由于 quota 需要在 ext 的 Linux 延伸格式档案才可以启动,所以你就必须要将准备开启 quota 的磁盘启动参数,写进入 quota 的磁盘设定才行 ( /etc/fstab )!以我的例子而言,我想要在 /home 底下进行 quota 的限制test, test2 这两个人!正巧 /home 是一个独立的扇区,这可以使用 df 来查询:此外,必需要特别留意的是,最好不要以根目录亦即是 / 进行 quota 啦!否则容易有些问题呢!另外,不要针对 root 做 quota 喔!
  [root @test root]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda1              1904920   1088136    720020  61% /
/dev/hdb1               976344     71504    854444   8% /backup
/dev/hdb2               101540      4252     92048   5% /home
 
嗯!我的 home 是独立的 partition ,并且他的装置名为 /dev/hdb2 ,好了!那么我就必须要启动 /home 这个 /dev/hdb2 的 quota 档案格式,好了!那么由于档案格式的设定是写在 /etc/fstab 里头,所以我们以 vi 来编辑他吧!只要在 /etc/fstab 里头增加了 usrquota, grpquota 就可以啦!『注:请特别留意,这两个项目请『务必』不要写错了!请再写入 /etc/fstab 之前好好的再次检查,因为写错之后,很有可能造成系统无法开机(虽然机率不高,但是有可能!?)』
  [root @test root]# vi /etc/fstab
# device        MountPoint      filesystem      parameters      dump    fsck
/dev/hda1       /               ext3            defaults        1       1
/dev/hda2       swap            swap            defaults        0       0
/dev/hdb1       /backup         ext3            defaults        1       1
/dev/hdb2       /home           ext3            defaults        1       1
none            /dev/pts        devpts          mode=0620       0       0
none            /proc           proc            defaults        0       0
上面的黄色字体改成底下的样子!
/dev/hdb2       /home           ext3            defaults,usrquota,grpquota 1 1
 
 
多了 usrquota,grpquota 注意,由 defaults,usrquota,grpquota 之间都没有空格!
 
这样就算加入了 quota 的磁盘格式了!不过,由于真正的 quota 在读取的时候是读取 /etc/mtab 这个档案的,偏偏这一个档案需要重新开机之后才能够以 /etc/fstab 的新数据进行改写!所以这个时候你可以选择:
 
(1)重新开机==>reboot;也可以选择
(2)重新 remount filesystem 来驱动设定值!
 
我是不太喜欢重新开机的人啦!所以我就这么做:
  [root@test /]# umount /dev/hdb2
[root@test /]# mount -a
[root@test /]# more /etc/mtab
/dev/hda1 / ext3 rw 0 0
none /proc proc rw 0 0
none /proc/bus/usb usbdevfs rw 0 0
none /dev devfs rw 0 0
none /dev/pts devpts rw,mode=0620 0 0
/dev/hdb1 /backup ext3 rw 0 0
/dev/hdb2 /home ext3 rw,usrquota,grpquota 0 0
或者以下列的方式重新 mount 所有的磁盘:
[root @test /root ]# mount -a -o remount  <==这个指令可以重新将 /etc/fstab 的咚咚 mount 下来!
 
 
嘿嘿嘿嘿!这样我们就已经成功的将 quota 的功能写入 partition 当中��!另外,我们这里是以 ext3 这个磁盘格式来 测试 quota 的呦!
 
扫瞄磁盘的使用者使用状况,并产生重要的 aquota.group 与 aquota.user:
接着下来就是要来扫瞄一下我们所需要的磁盘到底有没有多余的空间可以让我们来设定 quota 呢?并且将扫瞄的结果输出到这个磁盘的最顶层去(也就是 /home 底下)这个时候就需要 quotacheck 这个指令的帮忙了!使用 quotacheck 就可以轻易的将所需要的数据给他输出了!现在就 OK 啦!并且在 /home 底下会产生 aquota.group 与 aquota.user 这两个档案!
  [root@test /]# quotacheck -avug
quotacheck: Scanning /dev/hdb2 [/home] done
quotacheck: Checked 10 directories and 22 files
[root@test /]# ll /home
total 44
-rw-------    1 root     root         7168 Oct 28 14:05 aquota.group
-rw-------    1 root     root         7168 Oct 28 14:05 aquota.user
drwx------    2 root     root       16384 Oct 22 16:54 lost+found/
drwxr-xr-x    3 test     test         4096 Oct 28 01:45 test/
drwxr-xr-x    3 test2    test         4096 Oct 28 13:37 test2/
 
使用 quotacheck 就可以轻易的将所需要的数据给他输出了!现在就 OK 啦!并且在 /home 底下会产生 aquota.group 与 aquota.user 这两个档案!注:但是很奇怪的是,在某些 Linux 版本中,我不能够以 aquota.user(group) 来启动我的 quota ,真的是很奇怪呢!所以我就另外做了一个 link 档案来欺骗 quota ��:
  [root @test /root ]# cd /home 
[root @test /root ]# ls -l aquota* 
-rw-------    1 root     root         7168 May  6 22:16 aquota.group 
-rw-------    1 root     root         7168 May  6 22:16 aquota.user 
[root @test /root ]# ln -s aquota.group quota.group 
[root @test /root ]# ln -s aquota.user quota.user
 
启动 quota 的限额!
再来就是要启动 quota 啦!启动的方式也是很简单的!就是使用 quotaon -av 即可:
  [root@test /]# quotaon -av
/dev/hdb2 [/home]: group quotas turned on
/dev/hdb2 [/home]: user quotas turned on
 
注意:要看到上面有个 turned on 的出现,才是真的成功了!
 
编辑使用者的可使用空间:
由于我们有两个使用者要设定,先来设定 test 好了,使用 edquota 就对了
  [root @test /]# edquota �Cu test
Disk quotas for user test (uid 501):
  Filesystem         blocks       soft       hard     inodes     soft     hard
  /dev/hdb2              32          0          0          8        0        0
将上面的原本设定改为底下的模样:
Disk quotas for user test (uid 501):
  Filesystem         blocks       soft       hard     inodes     soft     hard
  /dev/hdb2              32     40000       50000          8        0        0
 
 
要特别留意的是,上面的黑体数值代表的是 KB 呦!转成 MB 是需要乘上 1024 倍,这里简单的计算一下就好了!这样就算编辑完毕了!接下来我们就需要将这个设定同时复制给 test2 这个家伙!
  [root@test /]# edquota -p test test2
 
接下来要来设定宽限时间,还是使用 edquota !
  [root@test /]# edquota -t
Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
  Filesystem             Block grace period     Inode grace period
  /dev/hdb2                     1days                  1days
 
将时间改为 1 天(原本是 7days 改成 1days ),好了!查询一下是否真的有设定进去呢?使用 quota -v 来查询
  [root@test /]# quota �Cvu test test2
Disk quotas for user test (uid 501):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/hdb2      32   40000   50000               8       0       0
Disk quotas for user test2 (uid 502):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/hdb2      28   40000   50000               7       0       0
 
特别注意到,由于我们的使用者尚未超过 40 MB,所以 grace ( 宽限时间 )就不会出现啦!这样很够清楚了吧?!
 
编辑群组使用空间:
其实也差不多,还是使用 edquota:
  [root@test /]# edquota -g test 
Disk quotas for group test (gid 501):
  Filesystem         blocks       soft       hard     inodes     soft     hard
  /dev/hdb2              60          0          0         15        0        0
修改成底下这样:
Disk quotas for group test (gid 501):
  Filesystem         blocks       soft       hard     inodes     soft     hard
  /dev/hdb2              60      80000      90000         15        0        0
[root@test /]# quota -vg test
Disk quotas for group test (gid 501):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/hdb2      60   80000   90000              15       0       0
 
 
设定开机时启动:
开机的时候自动启动的设定在哪里还记得吗?没错!就是在 /etc/rc.d/rc.local 底下:所以你可以使用 vi 在这个档案的最后面加上一行:
  [root @test /root ]# vi /etc/rc.d/rc.local 
/sbin/quotaon -aug 
 
如果要关闭 qutoa 就是用 quotaoff 吧!没错!这样就将 quota 设定完毕了!很简单吧!!

5.3 例行性命令at与crontab
5.3.1 什么例行性命令
   at:      这个工作仅执行一次就从Linux系统的流程中取消
  crontab:  这个工作将持续例行性地做下去
5.3.2 at
at   这个指令其实就是atd这个服务.仅执行一次.
启动这个服务:   #chkconfig --add atd输入at这个动作会将工作流程写入/var/spool/at目录下,然后等待系统执行它.
at指令默认是所有人都能执行,不过root用户可以使用/etc/at.allow与/etc/at.deny这两个文件进行限制:其限制原理:
1.先找寻/etc/at.allow文件,存在于这个文件中的用户才能使用at,不在这个文件中的用户则不能使用at(即使没有写在at.deny文件中)
2.如果没有/etc/at.allow就寻找/etc/at.deny文件,存在于at.deny的用户不能使用at,而不存在at.deny文件中的用户就可以使用at
3.如果两个文件都不存在,则只有root用户可以使用
at的语法
#at [-m] TIME     (输入工作指令)
#atq              (查看当前工作流程)
#atrm [jobnumber] (删除流程)
在输入at之后便进入命令行模式,在这里你可以重复输入命令,但是离开时按下Ctrl+D就可以退出.退出之后,系统显示这个工作流程的编排顺序与用户
5.3.3 crontab
循环执行:  crontab这个循环的例行性命令其实就是cron服务(crond).输入crontab指令之后,会将命令写入/var/spool/cron目录中.
crontab指令的语法:#crontab [-u user][-l | -e | -r]
说明:-u user:  这个指令只有root能输入,查看或编译其他用户的crontab内容
     -l:       列出crontab的内容
     -e:       编辑crontab的内容
     -r:       删除crontab的内容
  编辑crontab的语法格式:
* * * * * command说明(从左至右依次说明)
*:   表示分钟(0-59),*代表每分钟,*/5代表每5分钟,1,3,5,10代表第1,3,5,10分钟的时候
  .*:   表示小时(0-23)
   *:   表示日期(1-31)
   *:   表示月份(1-12)
   *:   表示周(0-6)
   command: 表示要执行的命令
系统的crontab设定:  /etc/crontab编辑系统的crontab只要直接编辑/etc/crontab文件就可以.
注:由于crontab是读取到内存中,所以在修改完/etc/crontab之后可能不会马上执行,这时需要重新启动crond服务. /etc/rc.d/init.d/crond restart
解析/etc/crontab文件的内容
[root@mail bin]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
[root@mail bin]#
MAILTO=root:  即当/etc/crontab文件中的例行性命令发生错误时,会将错误信息或屏幕显示的信息传给root用户,因为root无法在客户端收信,因此,这里通常被改成自己的账号,好及时了解到系统的状况.
01 * * * * root run-parts /etc/cron.hourly: 这一行说的就是在每个小时的第一分钟,系统会以root层级的用户到/etc/cron.hourly目录下执行所有可以执行的文件.root 代表执行的层级为root身份.run-parts表示后面接的/etc/hour.daily是一个目录内的所有可以执行的文件.

5.4 程序与资源管理
5.4.1 man的用法
[root@tsai root]man 5 passwd
查看的是passwd这个命令相关配置文件,设定档的相关信息,即配置文件的相关信息.
[root@tsai root]man  passwd
查看passwd这个命令本身的信息,即介绍怎么使用这个命令及相关的命令参数

5.4.2 linux多用户多任务环境
7个基本窗口,linux默认提供6个文字界面登入窗口,以及一个图形界面
ALT+F1~F7切换提供不同的终端界面.
5.4.3 背景工作管理
5.4.3.1 &与Ctrl+z
让屏幕中的工作(command)在背景下执行,可以使用&
[root @test /root ]# command &
参数说明:
范例:
[root @test /root]# find / -name testing & <==将该执行程序丢到背景执行
[root @test /root]# fg                      <==将该程序叫回屏幕前执行
由于是背景执行的,所以该程序的输出并不会显现在屏幕上,所以需要特别留意输出的信息的管线重导的问题!
另外,如何将该程序叫回来屏幕上面执行呢?就使用 fg 即可
   也可以使用 [Ctrl]+z 来将目前正在进行当中的工作丢到背景底下!
   5.4.3.2 jobs,fg与bg,kill
  知道目前你所进行的背景底下的工作有哪些呢?!很简单,就是使用 jobs 就可以观察到啦.
  [root @test /root ]# jobs
  参数说明:
  范例:
  [root @test /root]# vi .bashrc
   ^Z                              <==在 vi 当中的一般模式中键入[Ctrl]+z
  [1]+  Stopped                 vi .bashrc    <==这里会显示将数据丢到背景当中了!
  [root @test /root]# jobs
  [1]+  Stopped                 vi .bashrc    <==显示有一个工作在背景下,状态为停止。
  那个中括号([])里面的数字就是 jobs 的代号��
 [root @test /root ]# fg %number
[root @test /root ]# bg %number
参数说明:
%      :后面接数字,表示 jobs 的工作代号
number :就是工作代号
范例:
[root @test /root]# find / -name test
^Z
[1]+  Stopped                 find / -name testing
[root @test /root]# vi .bashrc
^Z
[2]+  Stopped                 vi .bashrc    <==这里会显示将数据丢到背景当中了!
[root @test /root]# jobs
[1]-  Stopped                 find / -name testing
[2]+  Stopped                 vi .bashrc
[root @test /root]# bg %1
[root @test /root]# jobs
[1]-  Running                 find / -name testing &
[2]+  Stopped                 vi .bashrc
[root @test /root]# fg %2
进入 vi 画面��!
 
 bg 是将『背景当中的程序由 stopped 变成 Running 』的一个手段,至于 fg 『则是将背景中的指令移到屏幕上
来动作』,那你怎么知道你的背景当中有多少的工作(jobs)在进行呢?!就是执行 jobs 来看看背景程序的代号��!
然后以 bg %number 来将资料在背景中执行,而 fg %number 则是将代号为 number 的程序移动到屏幕前面动作!
  kill
  [root @test /root ]# kill -sigal %number
参数说明:
%number :背景工作的代号,可使用 jobs 查询
signal
    -1  :重新读取一次参数设定档(类似 reload )
    -2  :使用者中断该工作,类似 [Ctrl]+c 来中断一个工作
    -9  :立刻杀掉一个工作,不论该工作是否为僵尸程序
    -15 :停止一个工作(这是默认值)
范例:
[root @test /root]# jobs
[1]+  Stopped                 vi .bashrc
[root @test /root]# kill -9 %1

  5.4.4 程序资源管理
  5.4.4.1 ps
  [root @test /root ]# ps -aux
参数说明:
a   :选择所有的程序列出
u   :所有使用者的程序均列出
x   :所有 tty 的程序列出
范例:
[root @test /root]# ps -aux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  1384  468 ?        S    Mar31   0:05 init [3]
root         2  0.0  0.0     0    0 ?        SW   Mar31   0:00 [keventd]
root         3  0.0  0.0     0    0 ?        SWN  Mar31   0:00 [ksoftirqd_CPU0]
root         4  0.0  0.0     0    0 ?        SW   Mar31   0:11 [kswapd]
USER:说明该程序是属于哪一个人的;
PID:该程序的代号;
%CPU:代表该程序使用了多少 CPU 资源;
%MEM:代表该程序使用了多少的 RAM ;
VSZ, RSS:占去的 ram 的大小( bytes );
TTY:是否为登入者执行的程序?若为 tty1-tty6 则为本机登入者,若为 pts/?? 则为远程登入者执行的程序
STAT:该程序的状态,( R )为可执行的,( S )为该程序正在睡眠中,就是没有执行了,( T )正在侦测或者是停止了,( Z )僵尸程序,就是 zombie 死掉的程序啦!需要以 kill 除去.
START:该程序开始的日期;
TIME:该程序跑了多久的时间
COMMAND:该程序的内容
  5.4.4.2 top
  [root @test /root ]# top
参数说明:
在执行 top 的程序中,可以输入下面的字符以进行排序
A  :以 age 亦即是执行的先后程序进行排序
T  :由启动的时间排序
M  :以所占的 memory 的大小排序
P  :以所耗用的 CPU 资源排序
范例:
[root @test /root]# top
 11:55pm  up 8 days,  7:40,  1 user,  load average: 0.22, 0.14, 0.10
71 processes: 69 sleeping, 2 running, 0 zombie, 0 stopped
CPU states: 24.6% user,  3.7% system,  0.0% nice, 71.5% idle
Mem:   255892K av,  222300K used,   33592K free,       0K shrd,   48084K buff
Swap:  289128K av,    8184K used,  280944K free                  110472K cached
  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
 9898 root       9   0  5976 5976  1364 S     5.5  2.3   0:00 mrtg
 4744 apache    14   0  5312 5052  3764 S     2.1  1.9   0:16 httpd
 9189 apache    14   0  4520 4256  3752 S     1.9  1.6   0:01 httpd
 9187 apache    10   0  4544 4276  3800 S     1.7  1.6   0:01 httpd
 9212 mysql      9   0  7280 4772  2716 S     0.7  1.8   0:00 mysqld
 9888 root      12   0  1064 1064   832 R     0.7  0.4   0:00 top
5.4.4.3 free
使用 free 来检查目前内存的使用情况.
[root @test /root ]# free
参数说明:
-k  :以 KBytes 来显示内存
-m  :以 MBytes 来显示内存
范例:
[root @test /root]# free
             total       used       free     shared    buffers     cached
Mem:        255892     222076      33816          0      49072     112272
-/+ buffers/cache:      60732     195160
Swap:       289128       7572     281556
5。4。4。4 sar
root @test /root ]# sar [-u] [-r] 秒数 次数
参数说明:
-u  :看 CPU 使用的情况
-r  :看 memory 使用的情况
秒数:几秒钟观测一次?
次数:共观测几次
范例:
[root @test /root]# sar -u 1 3
12:10:28 AM       CPU     %user     %nice   %system     %idle
12:10:29 AM       all      0.00      0.00      0.00    100.00
12:10:30 AM       all      0.00      0.00      0.00    100.00
12:10:31 AM       all     12.00      0.00      1.00     87.00
Average:          all      4.00      0.00      0.33     95.67
[root @test /root]# sar -r 1 3
12:11:11 AM kbmemfree kbmemused  %memused kbmemshrd kbbuffers  kbcached kbswpfree kbswpused  %swpused
12:11:12 AM     24416    231476     90.46         0     51068    112536    281556      7572      2.62
12:11:13 AM     24420    231472     90.46         0     51068    112536    281556      7572      2.62
12:11:14 AM     24392    231500     90.47         0     51068    112540    281556      7572      2.62
Average:        24409    231483     90.46         0     51068    112537    281556     

5。4。4。5 kill
root @test /root ]# kill -signal PID
参数说明:
那个 -signal 跟上面的 kill 一样:
-9  :杀掉该程序
-15 :停止该程序!
范例:
[root @test /root]# kill -9 2380
说明:
要杀掉一个程序的时后,自然需要知道该程序的 PID 才行!
5。4。4。6 uname
[root @test /root ]# uname [-apnr]
参数说明:
-a :所有的系统信息均列出
-p :列出 CPU 信息
-n :列出 host name
-r :列出 kernel 版本信息
范例:
[root @test /root]# uname -a
Linux tsai.adsldns.org 2.4.18 #2 Mon Mar 25 21:51:51 CST 2002 i586 unknown

5。4。5 程序的优先级
[root @test /root ]# ps -l
  F S   UID   PID  PPID  C PRI  NI ADDR    SZ WCHAN  TTY          TIME CMD
100 S     0  5624  5606  0  70   0    -   608 wait4  pts/0    00:00:00 bash
000 R     0  6944  5624  0  76   0    -   769 -      pts/0    00:00:00 ps
UID 代表执行者的身份;
PID 代表这个程序的代号;
PPID 代表这个程序是由那个程序发展出来的,亦即是父程序;
PRI 代表这个程序『可被执行的优先级』越小越早被执行!
NI 代表这个程序的 nice 值!
nice 值呢?就是『系统可被执行的修正数值!』
PRI(new) = PRI(old) + nice
如此一来,则当 nice 值为负值的时候,那么该程序将会提前被执行!就是变的优先处理��!
只有具有 root 权限的身份者,可以将程序的 nice 调为负值
一般使用者可用 nice 值 : 0 ~ 19
root 管理员可用 nice 值: -20 ~ 19
nice
语法: [root @test /root ]# nice [-n number] command
参数说明:
-n :就是后面那个 number 即为 nice 值!
范例:
[root @test /root]# nice -n -5 find / -name core > /tmp/core
 
renice
renice
语法: [root @test /root ]# renice [number] PID
参数说明:
范例:
[root @test /root]# ps -aux
[root @test /root]# renice 5 234
说明:
这个 renice 的功能就不太一样了!由于 renice 是『将一个正在进行当中的程序的优先级降低』,所以必须要:
先取得该程序的 PID 才行!

所以��,通常 renice 都与 ps 相互配合才对!先找处某个程序的 PID 之后,才来重新的设定其 nice 值!

5。4。6 信息管理
dmesg
语法: [root @test /root ]# dmesg
参数说明:
范例:
[root @test /root]# dmesg | more
说明:
在开机的时候你会发现有很多的讯息出现吧,例如 CPU 的形式、硬盘、光盘型号及硬盘分割表等等。但是讯息都是『刷』的一声就跑过去了!这些讯息有时候对于系统管理员是很重要的,因为他提供了系统的信息

uptime
语法: [root @test /root ]# uptime
参数说明:
范例:
[root @test /root]# uptime
 11:27pm  up 9 days,  7:12,  1 user,  load average: 0.07, 0.12, 0.14
说明:
知不知道你的 Linux 主机已经开机多久了?还有,过去 1, 5, 15 分钟的系统平均 loading 是多少呢?呵呵!使用 uptime 就对了!在上面的例子中,执行 uptime 之后,显示目前时间是 11:27pm, 而系统已经开机了 9 天又 7:12 之多,目前有一个使用者在在线,过去 1, 5, 15 分钟系统平均负荷为 0.07, 0.12, 0.14
语法: [root @test /root ]# who
[root @test /root ]# w
参数说明:
范例:
[root @test /root]# who
root     pts/0    Aug  2 20:43
[root @test /root]# w
  8:48pm  up 4 days,  5:08,  1 user,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
root     pts/0    192.168.1.2       8:43pm  0.00s  0.38s   ?     -
 
说明:
这是用来视察目前在系统上的使用者指令,你也可以使用 w 这个指令来下达动作。基本上,who 与 w 的功能是相同的,只是 who 仅列出使用者名称与登入时间,至于 w 则会列出使用者的
来源地址(IP):就是 FROM 那一项即是IP;
登入时间:即是 LOGIN@ 那一项;
工作项目:就是 WHAT 那一项!
此外,不知道你有没有发现,在使用 w 的时候,开头会有一个讯息,『 8:48m up 4days ....』那个是 uptime 的输出结果!
    不过,可能由于执行程序的关系,常常会忘了到底自己的真实身份,这个时候 whoami 就可以解救你啦!如上面所示,虽然我的身份是 root ,不过,实际上我是 test 的啦!使用 su 变换身份而已
    语法: [root @test /root ]# last
参数说明:
-number :number 为数字,如果您的登入讯息太多了,可以使用这个指令!
范例:
[test @test /root]# last -5
test    pts/0        192.168.1.2      Tue Apr  9 20:34 - 20:35  (00:01)
test    pts/0        192.168.1.2      Tue Apr  9 20:14 - 20:30  (00:15)
test    ftpd21546    192.168.1.2      Tue Apr  9 02:55 - 03:06  (00:10)
test    ftpd15813    192.168.1.2      Tue Apr  9 01:20 - 01:21  (00:00)
test    pts/0        192.168.1.2      Mon Apr  8 20:14 - 00:27  (04:13)
wtmp begins Tue Apr  2 01:12:26 2002
说明:
要知道有没有被入侵,常常使用的就是 last 这个指令��!包括 ftp, telnet, ssh 都会被纪录在这个讯息当中,不过目前是只有记录一个月的量!这个指令真的是不错用的!常常可以发现是否有不正常的人物登入信息呢

你可能感兴趣的:(linux,职场,休闲)