> Linux教程 > linux基础 >

Linux用户和文件管理

用户和文件权限管理

 

一、用户管理

 

Linux是一个多用户多任务的分时操作系统,要想进入系统,必须有一个账号。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。每个用户账号都拥有一个惟一的用户名和各自的口令。用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。

 

实现用户账号的管理,要完成的工作主要有如下几个方面:

 · 用户账号的添加、删除与修改。

 · 用户口令的管理。

 · 用户组的管理。

 

1、Linux系统用户账号的管理

 

    用户账号的管理工作主要涉及到用户账号的添加、修改和删除。 添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。刚添加的账号是被锁定的,无法使用,必须用passwd命令设置密码后方可激活。

 

   (1)、添加用户帐户:

    useradd 选项 用户名

    -c comment 指定一段注释性描述。

  -d 目录指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。

  -g 用户组指定用户所属的用户组。

  -G 用户组,用户组指定用户所属的附加组。

  -s Shell文件指定用户的登录Shell。

  -u 用户号指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。

    增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。

    例:# useradd –s /bin/sh –g op –G adm,root –c “new user” –d /home/public –m –u 100 Jack

    添加用户Jack,创建用户主目录/home/public,用户ID为100,用户所属组为op,用户所属的附加组为adm和root,用户登陆shell为/bin/sh。

 

   (2)、删除用户

    如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。删除一个已有的用户账号使用userdel命令,其格式如下:

    userdel 选项 用户名

    常用的选项是-r,它的作用是把用户的主目录一起删除。

    userdel –r Jack

 

    此命令删除用户Jack在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。

 

   (3)、修改账号

    修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。

    usermod 选项 用户名

    常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。

    -l 新用户名  这个选项指定一个新的账号,即将原来的用户名改为新的用户名。

 

2、用户口令管理

 

    用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。

  指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:

    passwd 选项 用户名

    可使用的选项:

    -l 锁定口令,即禁用账号。

  -u 口令解锁。

  -d 使账号无口令。

  -f 强迫用户下次登录时修改口令。

  如果默认用户名,则修改当前用户的口令。

 

3、Linux用户组管理

 

    每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。

  用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

 

    (1)、添加一个用户组

    groupadd 选项 用户组

    可以使用的选项有:

    -g GID 指定新用户组的组标识号(GID)。

  -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

 

    (2)、删除用户组

    groupdel 用户组

 

    (3)、修改用户组属性

    groupmod 选项 用户组

    可以使用的选项有:

    -g GID 为用户组指定新的组标识号。

  -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。

  -n新用户组将用户组的名字改为新名字

    如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。

 

4、与用户管理有关的系统文件

 

    完成用户管理的工作有许多种方法,但是每一种方法实际上都是对有关的系统文件进行修改。与用户和用户组相关的信息都存放在一些系统文件中,这些文件包括/etc/passwd, /etc/shadow,/etc/group等。下面分别介绍这些文件的内容。

 

    (1)、/etc/passwd文件是用户管理工作涉及的最重要的一个文件。Linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行,它记录了这个用户的一些基本属性。这个文件对所有用户都是可读的。它的内容类似下面的例子:

# cat /etc/passwd

  root:x:0:0:Superuser:/:

  daemon:x:1:1:System daemons:/etc:

  bin:x:2:2:Owner of system commands:/bin:

  sys:x:3:3:Owner of system files:/usr/sys:

  adm:x:4:4:System accounting:/usr/adm:

  uucp:x:5:5:UUCP administrator:/usr/lib/uucp:

  auth:x:7:21:Authentication administrator:/tcb/files/auth:

  cron:x:9:16:Cron daemon:/usr/spool/cron:

  listen:x:37:4:Network daemon:/usr/net/nls:

  lp:x:71:18:Printer administrator:/usr/spool/lp:

  sam:x:200:50:Sam san:/usr/sam:/bin/sh

 

    用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

 

    1)“用户名”是代表用户账号的字符串。通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号,冒号在这里是分隔符。为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。

 

  2)“口令”一些系统中,存放着加密后的用户口令字。。虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于 /etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到/etc/shadow文件中,而在/etc/passwd文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。

 

  3)“用户标识号”是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。

  通常用户标识号的取值范围是0~65 535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500。

 

  4)“组标识号”字段记录的是用户所属的用户组。它对应着/etc/group文件中的一条记录。

 

  5)“注释性描述”字段记录着用户的一些个人情况,例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

 

  6)“主目录”,也就是用户的起始工作目录,它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。

 

  7)用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。Shell 是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell),ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。

  用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。

  系统中有一类用户称为伪用户(psuedo users),这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。常见的伪用户如下所示。

 

伪  用  户                  含     义

bin                      拥有可执行的用户命令文件

sys                       拥有系统文件

adm                     拥有帐户文件

uucp                    UUCP使用

lp                         lp或lpd子系统使用

nobody                 NFS使用

 

    除了上面列出的伪用户外,还有许多标准的伪用户,例如:audit, cron, mail, usenet等,它们也都各自为相关的进程和文件所需要。

    由于/etc/passwd文件是所有用户都可读的,如果用户的密码太简单或规律比较明显的话,一台普通的计算机就能够很容易地将它破解,因此对安全性要求较高的Linux系统都把加密后的口令字分离出来,单独存放在一个文件中,这个文件是/etc/shadow文件。只有超级用户才拥有该文件读权限,这就保证了用户密码的安全性。

 

   (2)、/etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生。它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用“:”隔开。这些字段是:

 

    登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

 

    1)“登录名”是与/etc/passwd文件中的登录名相一致的用户账号

  2)“口令”字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合 { ./0-9A-Za-z }中的字符,则对应的用户不能登录。

  3)“最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在SCO Linux 中,这个时间起点是1970年1月1日。

  4)“最小时间间隔”指的是两次修改口令之间所需的最小天数。

  5)“最大时间间隔”指的是口令保持有效的最大天数。

  6)“警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。

  7)“不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。

  8)“失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。

    # cat /etc/shadow

  root:Dnakfw28zf38w:8764:0:168:7:::

  daemon:*::0:0::::

  bin:*::0:0::::

  sys:*::0:0::::

  adm:*::0:0::::

  uucp:*::0:0::::

  nuucp:*::0:0::::

  auth:*::0:0::::

  cron:*::0:0::::

  listen:*::0:0::::

  lp:*::0:0::::

  sam:EkdiSECLWPdSa:9740:0:0::::

 

   (3)、用户组的所有信息都存放在/etc/group文件中。

 

    将用户分组是Linux 系统中对用户进行管理及控制访问权限的一种手段。每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不同的组。当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。用户要访问属于附加组的文件时,必须首先使用newgrp命令使自己成为所要访问的组中的成员。用户组的所有信息都存放在/etc/group文件中。此文件的格式也类似于/etc /passwd文件,由冒号隔开若干个字段,这些字段有:

 

   组名:口令:组标识号:组内用户列表

 

    1)“组名”是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。

  2)“口令”字段存放的是用户组加密后的口令字。一般Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。

  3)“组标识号”与用户标识号类似,也是一个整数,被系统内部用来标识组。

  4)“组内用户列表”是属于这个组的所有用户的列表/b],不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。

 

    # cat /etc/group

    root::0:root

  bin::2:root,bin

  sys::3:root,uucp

  adm::4:root,adm

  daemon::5:root,daemon

  lp::7:root,lp

  users::20:root,sam

 

   (4)、添加量用户批

    1)、一个文本用户文件,每一列按照/etc/passwd密码文件的格式书写,要注意每个用户的用户名、UID、宿主目录都不可以相同,其中密码栏可以留做空白或输入x号。一个范例文件user.txt内容如下:

 

   user001::600:100:user:/home/user001:/bin/bash

  user002::601:100:user:/home/user002:/bin/bash

  user003::602:100:user:/home/user003:/bin/bash

  user004::603:100:user:/home/user004:/bin/bash

  user005::604:100:user:/home/user005:/bin/bash

  user006::605:100:user:/home/user006:/bin/bash

 

    2)、以root身份执行命令/usr/sbin/newusers,从刚创建的用户文件user.txt中导入数据,创建用户:

    # newusers < user.txt

 

    3)、执行命令/usr/sbin/pwunconv,将/etc/shadow产生的shadow密码解码,然后回写到/etc/passwd中,并将/etc/shadow的shadow密码栏删掉。

         # pwunconv

 

    4)、编辑每个用户的密码对照文件,范例文件passwd.txt内容如下:

 

    user001:密码

  user002:密码

   user003:密码

  user004:密码

  user005:密码

  user006:密码

 

    5)、以root身份执行命令/usr/sbin/chpasswd,创建用户密码,chpasswd会将经过/usr/bin/passwd命令编码过的密码写入/etc/passwd的密码栏。

    # chpasswd < passwd.txt

 

    6)、确定密码经编码写入/etc/passwd的密码栏后,执行命令/usr/sbin/pwconv将密码编码为shadow password,并将结果写入/etc/shadow。

    # pwconv

    这样就完成了大量用户的创建了,之后您可以到/home下检查这些用户宿主目录的权限设置是否都正确,并登录验证用户密码是否正确。

 

   (5)、赋予普通用户特殊权限

  在Linux系统中,管理员往往不止一人,若每位管理员都用root身份进行管理工作,根本无法弄清楚谁该做什么。所以最好的方式是:管理员创建一些普通用户,分配一部分系统管理工作给他们。

  我们不可以使用su让他们直接变成root,因为这些用户都必须知道root的密码,这种方法很不安全,而且也不符合我们的分工需求。一般的做法是利用权限的设置,依工作性质分类,让特殊身份的用户成为同一个工作组,并设置工作组权限。例如:要wwwadm这位用户负责管理网站数据,一般Apache Web Server的进程httpd的所有者是www,您可以设置用户wwwadm与www为同一工作组,并设置Apache默认存放网页目录/usr /local/httpd/htdocs的工作组权限为可读、可写、可执行,这样属于此工作组的每位用户就可以进行网页的管理了。

  但这并不是最好的解决办法,例如管理员想授予一个普通用户关机的权限,这时使用上述的办法就不是很理想。这时您也许会想,我只让这个用户可以以root身份执行shutdown命令就行了。完全没错,可惜在通常的Linux系统中无法实现这一功能,不过已经有了工具可以实现这样的功能——sudo。

  sudo通过维护一个特权到用户名映射的数据库将特权分配给不同的用户,这些特权可由数据库中所列的一些不同的命令来识别。为了获得某一特权项,有资格的用户只需简单地在命令行输入sudo与命令名之后,按照提示再次输入口令(用户自己的口令,不是root用户口令)。例如,sudo允许普通用户格式化磁盘,但是却没有赋予其他的root用户特权。

    1)、sudo工具由文件/etc/sudoers进行配置,该文件包含所有可以访问sudo工具的用户列表并定义了他们的特权。一个典型的/etc/sudoers条目如下:

         #visudo -f /etc/sudoers

 

         liming ALL=(ALL) ALL

 

    这个条目使得用户liming作为超级用户访问所有应用程序,如用户liming需要作为超级用户运行命令,他只需简单地在命令前加上前缀sudo。因此,要以root用户的身份执行命令ueradd可以输入如下命令:

 

         # sudo /usr/sbin/useradd sam

 

    注意:命令要写绝对路径,/usr/sbin默认不在普通用户的搜索路径中,或者加入此路径:PATH=$PATH:/usr/sbin;export PATH。另外,不同系统命令的路径不尽相同,可以使用命令“whereis 命令名”来查找其路径。

 

    2)、允许gem用户在主机sun上执行reboot和shutdown命令,在/etc/sudoers中加入:

         gem sun=/usr/sbin/reboot,/usr/sbin/shutdown –h now

 

    注意:命令一定要使用绝对路径,以避免其他目录的同名命令被执行,从而造成安全隐患。

  然后保存退出,gem用户想执行reboot命令时,只要在提示符下运行下列命令:

 

    $ sudo /usr/sbin/reboot

 

    输入正确的密码,就可以重启服务器了。

 

    如果您想对一组用户进行定义,可以在组名前加上%,对其进行设置,如:

 

    %cuug ALL=(ALL) ALL

 

    3)、另外,还可以利用别名来简化配置文件。别名类似组的概念,有用户别名、主机别名和命令别名。多个用户可以首先用一个别名来定义,然后在规定他们可以执行什么命令的时候使用别名就可以了,这个配置对所有用户都生效。主机别名和命令别名也是如此。注意使用前先要在/etc/sudoers中定义:User_Alias, Host_Alias, Cmnd_Alias项,在其后面加入相应的名称,也以逗号分隔开就可以了,举例如下:

    Host_Alias SERVER=no1

  User_Alias ADMINS=liming,gem

  Cmnd_Alias SHUTDOWN=/usr/sbin/halt,/usr/sbin/shutdown,/usr/sbin/reboot

  ADMINS SERVER=SHUTDOWN

 

    4)、ADMINS ALL=(ALL) NOPASSWD: ALL

 

    表示允许ADMINS不用口令执行一切操作,其中“NOPASSWD:”项定义了用户执行操作时不需要输入口令。

 

     5)、$ sudo –l这个参数可以使用户查看自己目前可以在sudo中执行哪些命令。

 

     6)、在命令提示符下键入sudo命令会列出所有参数,其他一些参数如下:

    -V 显示版本编号。

  -h 显示sudo命令的使用参数。

  -v 因为sudo在第一次执行时或是在N分钟内没有执行(N预设为5)会询问密码。这个参数是重新做一次确认,如果超过N分钟,也会问密码。

  -k 将会强迫使用者在下一次执行sudo时询问密码(不论有没有超过N分钟)。

  -b 将要执行的命令放在背景执行。

  -p prompt 可以更改问密码的提示语,其中%u会替换为使用者的账号名称,%h会显示主机名称。

  -u username/#uid 不加此参数,代表要以root的身份执行命令,而加了此参数,可以以username的身份执行命令(#uid为该username的UID)。

  -s 执行环境变量中的 SHELL 所指定的 Shell ,或是 /etc/passwd 里所指定的 Shell。

  -H 将环境变量中的HOME(宿主目录)指定为要变更身份的使用者的宿主目录。(如不加-u参数就是系统管理者root。)

 

二、文件管理

 

1、当创建一个文件的时候,系统保存了有关该文件的全部信息,包括:

     " 文件的位置。

     " 文件类型。

     " 文件长度。

     " 哪位用户拥有该文件,哪些用户可以访问该文件。

     " i节点。

     " 文件的修改时间。

     " 文件的权限位。

 

2、现在用ls -l命令查看该目录下文件的属性

[root@Linux_chenwytemp]# ls -l

总用量 36

-rw-r--r--    1 root    root            0 10月 19 20:16 temp

总用量 36:是ls所列出的入口占用空间的字节数(以K为单位)。

1该文件硬链接的数目。

root:文件属主。

root:文件属组(一般是文件属主所在的缺省组。)

34890:字节来表示的文件长度,记住,不是K字节!

10月 19 20:17:件的更新时间。

temp:件名。

 

-rw-r--r--:这是该文件的权限位。

 

第一个横杠:指定文件类型,表示该文件是一个普通文件。(所创建的文件绝大多数都是普通文件或符号链接文件)。

 

除去最前面的横杠,一共是9个字符,他们分别对应9个权限位。通过这些权限位,可以设定用户对文件的访问权限。对这两个文件的精确解释是:

rw-:前三位,文件属主可读、写

r--:中间三位,组用户可读

r--:最后三位,其他用户只可读

在创建的时候并未给属主赋予执行权限,在用户创建文件时,系统不会自动地设置执行权限位。这是出于加强系统安全的考虑。

 

3、文件类型

前面提到的第一条横杠,表示该文件是普通文件型

文件类型有七种,它可以从ls -l命令所列出的结果的第一位看出.

 

七种类型:

d 目录。

l 符号链接(指向另一个文件)。

s 套接字文件。

b 块设备文件。

c 字符设备文件。

p 命名管道文件。

- 普通文件,或者更准确地说,不属于以上几种类型的文件。

 

4、文件的权限位中中每一组字符中含有三个权限位:

r 读权限

 

w 写/更改权限

 

x 执行该脚本或程序的权限

 

5、使用chmod来改变权限位

(1)、符号模式

chmod命令的一般格式为:

chmod[who] operator [permission] filename

w h o的含义是:

u 文件属主权限。

g 属组用户权限。

o 其他用户权限。

a 所有用户(文件属主、属组用户及其他用户)。

o p e r at o r的含义:

+ 增加权限。

- 取消权限。

= 设定权限。

p e r m is s i o n的含义

r 读权限。

w 写权限。

x 执行权限。

s 文件属主和组set-ID。

t 粘性位*。

l 给文件加锁,使其他用户无法访问。

 

*在列文件或目录时,有时会遇到“ t”位。“t”代表了粘性位。如果在一个目录上出现“t”位,这就意味着该目录中的文件只有其属主才可以删除,即使某个属组用户具有和属主同等的权限。不过有的系统在这一规则上并不十分严格。

 

特殊权限:

    a、t权限是粘着位,例:TMP目录下,任何人都有读写执行权限,但是不是任何人对里边的可写权限的文件就可以删除呢,当然不是了,这个就是粘着位的做用,只有所有者才有权删除自已的文件,当然,ROOT除外

    b、关文件安全的另一种权限,

      i权限 也就是不可修改权限  例:chattr u+i aaa 则aaa文件就不可修改,无论任何人,如果删除就用u-i就好了

      a权限 也就是只追加权限,对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。方法和i权限一样加。

      如果想要看某个文件是不是有这个权限,用lsattr filename就行了

例如:

    chmod a+x temp 在temp上给所有用户执行权限。

 

(2)、绝对模式

文件属主:r w x:4 + 2 + 1

属组用户:r w x:4 + 2 + 1

其他用户:r w x:4 + 2 + 1

temp文件具有这样的权限:

r wx     r - - r - -

4+2+1  4     4

7     4  4

把相应权限位所对应的值加在一起,就是7 4 4。

通过使用- R选项连同子目录下的文件一起设置:

chmod -R 664/temp/*

 

6、目录权限

目录的权限位和文件有所不同。目录的读权限位意味着可以列出其中的内容。写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。执行权限位则意味着搜索和访问该目录。

 

7、suid/guid

 

(1)、为什么要使用这种类型的脚本?

例如有几个着几个大型的数据库系统,对它们进行备份需要有系统管理权限。可以写几个脚本,并设置了它们的g u i d,这样就可以指定的一些用户来执行这些脚本就能够完成相应的工作,而无须以数据库管理员的身份登录,以免不小心破坏了数据库服务器。通过执行这些脚本,他们可以完成数据库备份及其他管理任务,但是在这些脚本运行结束之后,他们就又回复到他们作为普通用户的权限

 

(2)、设置suid/guid

设置s u i d:将相应的权限位之前的那一位设置为4;

设置g u i d:将相应的权限位之前的那一位设置为2;

两者都置位:将相应的权限位之前的那一位设置为4+2=6。

设置了这一位后x的位置将由s代替。

记住:在设置s u i d或g u i d的同时,相应的执行权限位必须要被设置。

例如,如果希望设置g u i d,那么必须要让该用户组具有执行权限。

如果想要对文件l o g i n[它当前所具有的权限为rwx rw- r-- (741)]设置s u i d,,可在使用c h m o d命令时在该权限数字的前面加上一个4,即chmod 4741,这将使该文件的权限变为r w s rw- r - -。

#chmod4741 login

 

(3)、还可以使用符号方式来设置s u i d / g u i d。如果某个文件具有这样的权限: rwx r-x r- x,那么可以这样设置其s u i d:

chmod u+s<filename>;

于是该文件的权限将变为: rws r-x r-x

在查找设置了s u i d的文件时,没准会看到具有这样权限的文件:rwS r-x r- x,其中S为大写。

它表示相应的执行权限位并未被设置,这是一种没有什么用处的s u i d设置,可以忽略它的存在。

注意,c h m o d命令不进行必要的完整性检查,可以给某一个没用的文件赋予任何权限,但chmod 命令并不会对所设置的权限组合做什么检查。因此,不要看到一个文件具有执行权限,就认为它一定是一个程序或脚本。

 

8、chown和chgrp

 

当你创建一个文件时,你就是该文件的属主。一旦你拥有某个文件,就可以改变它的所有权,把它的所有权交给另外一个/ e t c / p a s s w d文件中存在的合法用户。可以使用用户名或用户I D号来完成这一操作。

在改变一个文件的所有权时,相应的s u i d也将被清除,这是出于安全性的考虑。只有文件的属主和系统管理员可以改变文件的所有权。一旦将文件的所有权交给另外一个用户,就无法再重新收回它的所有权。如果真的需要这样做,那么就只有求助于系统管理员了。

 

(1)、chown 选项文件名

- R选项意味着对所有子目录下的文件也都进行同样的操作。

- h选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。

如:

# ls -l

drwxrwxr-x    2 sam     sam          4096 10月 26 19:48 sam

# chowngem sam

# ls -l

drwxrwxr-x    2 gem     sam          4096 10月 26 19:48 sam

c h g r p命令和c h o w n命令的格式差不多,下面给出一个例子。

# ls -l

drwxrwxr-x    2 gem     sam          4096 10月 26 19:48 sam

# chgrpgroup sam

# ls -l

drwxrwxr-x    2 gem     group        4096 10月 26 19:48 sam

 

(2)、找出你所属于的用户组

如果你希望知道自己属于哪些用户组,可以用ID这个命令:

# id

uid=0(root)gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

查看当前用户所属组

# id gem

uid=507(gem)gid=507(group) groups=507(group),0(root),4(adm)

查看其它用户所用组:#id 用户名

 

9、umask

 

当最初登录到系统中时, u m a s k命令确定了你创建文件的缺省模式。这一命令实际上和c h m o d命令正好相反。你的系统管理员必须要为你设置一个合理的u m a s k值,以确保你创建的文件具有所希望的缺省权限,防止其他非同组用户对你的文件具有写权限。

在已经登录之后,可以按照个人的偏好使用u m a s k命令来改变文件创建的缺省权限。相应的改变直到退出该s h e l l或使用另外的u m a s k命令之前一直有效。

一般来说,u m a s k命令是在/ e t c / p r o f i l e文件中设置的,每个用户在登录时都会引用这个文件,所以如果希望改变所有用户的u m a s k,可以在该文件中加入相应的条目。如果希望永久性地设置自己的u m a s k值,那么就把它放在自己$ H O M E目录下的. p r o f i l e或. b a s h _ p r o f i l e文件中。

 

(1)、如何计算umask值

u m a s k命令允许你设定文件创建时的缺省模式,对应每一类用户(文件属主、属组、其他用户)存在一个相应的u m a s k值中的数字。对于文件来说,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用c h m o d命令增加这一权限。目录则允许设置执行权限,这样针对目录来说, u m a s k中各个数字最大可以到7。

该命令的一般形式为:

umask nnn

u m a s k是从权限中“拿走”相应的位即可。文件的全部权限是666,目录的全部权限是777,然后减去响应的umask值就默认的文件和目录权限。

例如,对于u m a s k值0 0 2,相应的文件和目录缺省创建权限是什么呢?

1)、文件的最大权限rwx rwx rwx (777)

2)、umask值为0 0 2 - - - - - - -w-

3)、目录权限rwx rwx r-x (775) 这就是目录创建缺省权限

4)、文件权限rw- rw- r-- (664) 这就是文件创建缺省权限

 

(2)、如果想知道当前的umask 值,可以使用u m a s k命令:

 #su sam   /*切换到sam用户玩境下

 #umask   /*查看sam的umask

 0022

 前面多了个0,是suid/guid的,但在unask中此位只能为0或是省略。

 

(3)、当新增文件或目录时,预设的使用权限,由 umask 这个内设值所规定的。

    一般情况下,umask 会被设定在 shell 的启始档案中。

    对 bash 的使用者来说,个人的启始档案是 $HOME/.bashrc,使用者可以将 umask 设定在其中。像 RedHat 9 是放 /etc 之下,档名为 bashrc。

    当使用者没有自行设定,umask 设定值便来自于此系统的默认设定。

 

10、符号链接

 

存在两种不同类型的链接,软链接和硬链接。修改其中一个,硬连接指向的是节点(inode),而软连接指向的是路径(path)

 

(1)、软链接文件

  软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。和win下的快捷方式差不多。链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题,链接文件甚至可以循环链接自己。类似于编程语言中的递归。

命令格式:ln -s source_path target_path

 

(2)、硬链接文件

  info ln 命令告诉您,硬链接是已存在文件的另一个名字。

命令格式:ln -d existfile newfile

 

硬链接文件有两个限制

  1、不允许给目录创建硬链接;

  2、只有在同一文件系统中的文件之间才能创建链接。

对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了原有的内容。这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。修改其中一个,与其连接的文件同时被修改。

例如:

第一条为硬链接,第二条为软链接

$ lnhttpd.conf httpd1.conf

$ ln -shttpd.conf httpd2.conf

    $ ls –li

总用量 80

1077669   -rw-r--r--   2 sam      adm         34890 10月 31 00:57 httpd1.conf

1077668  lrwxrwxrwx   1 sam      adm            10 10月 31 00:58 httpd2.conf ->; httpd.conf

1077669  -rw-r--r--   2 sam      adm         34890 10月 31 00:57 httpd.conf

可以看到,使用ls -li,软连接只产生了10字节的快捷而已,硬连接却实实在在的的拷贝。最前面的inode硬链接和源文件是一样的,而软链接不一样。

    $ rm httpd.conf

在删除链接的源文件,来比较不同之处

$ ls –l

 

总用量 44

-rw-r--r--    1 sam     adm         34890 10月 31 00:57 httpd1.conf

lrwxrwxrwx    1 sam     adm            10 10月 31 00:58 httpd2.conf ->;httpd.conf

发现,httpd2.conf实际已经不存在了,是断链,而httpd1.conf变也了普通文件。

 

(3)、索引节点、硬连接和连接计数

1)、索引节点inode:

Linux为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。

 

例如:

假设我们在硬盘当前目录下建立了一个名为mytext文本文件,其内容只有一行:

This ismy file.

1、当然这行文字一定是存储在磁盘数据区某个具体位置里(物理上要通过磁头号、柱面号和扇区号来描述,在本例中假设分别是1、20、30)。

2、假设其inode是262457,那么系统通过一段标准程序,就能将这个inode转换成存放此文件的具体物理地址(1磁头、20柱面、30扇区),最终读出文件的内容:“This is my file.”

3、所以inode是指向一个文件数据区的指针号码,一个inode对应着系统中唯一的一片物理数据区,而位于两个不同物理数据区的文件必定分别对应着两个不同的inode号码。

 

2)、文件拷贝命令与硬链接的区别:

# cp/home/zyd/mytext newfile

在当前工作目录建立了一个新文件newfile,其实际操作主要包括如下三步:

a、在当前目录中增加一个目录项,其文件名域填入newfile,并分配了一个新的inode,假设是262456。

b、将原文件(在1磁头、20柱面、30扇区)的内容复制了一份到新的空闲物理块(假设是1磁头、20柱面、31扇区)。

c、填写一些其他关键信息,使系统通过这些信息及inode号码可以完成物理地址的转换。

所以文件复制要分配新的inode和新的数据区,虽然两个文件的内容是一样的。

 

3)、硬连接hardlink:

我们实际使用文件时一般是通过文件名来引用的。通过上面的讨论,我们知道:

1个inode号码肯定和一片完全属于一个文件的数据区一一对应。那么一个文件系统中两个或更多个不同的文件名能否对应同一个文件呢?答案是肯定的。

我们知道inode号码是记录在文件名对应的目录项中的,我们可以使两个或多个文件的目录项具有相同的inode值,实际上就使它们对应着同一个文件。

有几个目录项具有相同的inode号,我们就说这个文件有几个硬连接(hardlink),

对于普通文件,ls -l命令的连接计数count域的数值就是本文件拥有的硬连接数。硬连接可以通过ln命令建立。

# ln/home/zyd/mytext hardlink_mytext

就建立了一个新的文件hardlink_mytext,这个文件的inode同样是262457。建立硬连接实际上只是增加了一个目录项,但并复制文件数据区,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保证两个文件能同步更新。

'ls -il'可以显示文件的inode(在下面最左边):

262456-rw-rw-r-- 1 zyd zyd 17 Nov 3 14:52 newfile

262457-rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext

262457-rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext

 

4)、连接计数count:

前面我们介绍了,文件的连接计数域表明本系统中共有几个文件目录项的inode和本文件相同,也就是本文件共有几个硬连接。如上面的例子中hardlink_mytext和mytext文件的count值都是2。

那么对于目录,其count域的含义是什么呢?目录的count同样表示共有多少个目录项指向此目录,不过要详细说明必须进一步解释VFS文件系统的结构,为简单起见,只要这样理解就行了:(count-2)等于本目录包含的直接子目录数(就是只包括儿子,不包括孙子啦!)。

例如:如果一个目录/abc的count域为5,那么/abc目录一定包含3个子目录。

 

进一步说明:

硬连接文件实际上并不是一种新的文件类型,两个文件互为对方的硬连接。它们应该都是普通文件(谁能告诉我:其它类型的文件可以硬连接吗?。两个文件除了名称或/和文件目录不同外,其它部分完全相同,更改了一个文件,另一个的文件长度、内容、更改时间等都将相应发生变化,更改了一个文件的权限位mode,另一个也会发生同样的变化。

注意连接计数字段count,互为硬连接的两个文件的count值都是2,表明有两个inode指向同一文件的inode。

当我们删除其中一个文件时,系统首先将(count-1)->;count,如果结果是零,就将其目录项和数据区都删除,否则只将本目录项删除,数据区仍然保留,仍然可以通过另外的文件名访问。根据这个特性,可以通过为重要的文件建立硬连接的方法来防止其被误删除。

一个文件系统允许的inode节点数是有限的,如果文件数量太多,即使每个文件都是0字节的空文件,系统最终也会因为节点空间耗尽而不能再创建文件。所以当发现不能建立文件时首先要考虑硬盘数据区是否还有空间(可通过du命令),其次还得检查节点空间。

互为硬连接的多个文件必须位于同一个文件系统上。根设备及任何一个需要mount才能挂接进来的分区、软盘、NFS、光驱等都是一个独立的文件系统,每个文件系统有一个相应的设备号,不同文件系统中具有相同inode节点的文件间没有任何联系。系统则通过设备号和inode号的组合唯一确定一个文件。

Linux之所以能支持多种文件系统,其实是由于Linux提供了一个虚拟文件系统VFS,VFS作为实际文件系统的上层软件,掩盖了实际文件系统底层的具体结构差异,为系统访问位于不同文件系统的文件提供了一个统一的接口。

实际上许多文件系统并不具备inode结构,其目录结构也和以上的讨论不同,但通过VFS,系统均为其提供了虚拟一致的inode和目录项结构。

所以,'ls -il'命令实际显示的inode应该是VFS inode,也就是说,inode是存在于内存中的数据结构,而不一定是实际的硬盘结构。

但为Linux量身定做的ext2文件系统具备实际的inode和连接型目录项结构,所以,对于ext2文件系统,可以认为我们上面讨论的关于硬连接的概念是完全正确的。



(责任编辑:IT)