首页 > 代码库 > 在Linux系统中文件(资源)和用户的管理

在Linux系统中文件(资源)和用户的管理

    一个可执行二进制程序,被加载到内存,被内核调度到CPU上运行,这时候,就表现了一个进程。也可以说进程是程序的一个实例,是程序的动态表现。

    在 Linux 系统中进程(process)是有属主的,也就是该进程以哪个用户的身份运行的。大家都知道,程序有输入和输出,也称这为程序IO。如果我们程序数据输入是磁盘。如,Web 服务器,接收用户的请求之后,把网页数据从磁盘中读入加工之后再把数据响应给用户。如果,发起Web 服务进程的用户没有读取该用户请求网页文件的权限。则无法响应用户的请求了。所以,文件(资源)的管理和用户的管理是我们与Linux 打交道经常遇到的。

wKiom1O9LhfhyxcsAAJJtYmCyVg884.jpg

一、资源(文件)的管理;

    Linux 是一个多任务多用户的操作系统。可以多个人使用同一台主机来进行工作,A用户在这台linux计算机编辑文档、B用户也在该台计算机编辑文档,

C用户也在该台计算机编辑文档。三个用户都把自己编辑好的文档保存在该台计算上。那么三个用户把编辑好的文档保存(不是保存在自己的家目录中)下来以后,

怎么知道一个文件是不是自己的呢?

    在 Linux 系统中,使用”文件属主“的概念来描述一个文件(资源)的主人是哪个用户。用户操作一个文件通常是:读、写、执行。“分享”是群体的精神,

那么一个文件的属主,把自己的文件(资源)分享(并不是复制一份给另外一个用户,而是共同使用该资源)给另处一个用户了,那么该用户如何使用该资源,进行哪些操作呢?可以读、还是可以写,这就涉及到授权了。

    【chmod】命令就是授与一个用户对资源有什么使用权限的,是:读(w)、写(r)、执行(x)中的哪些呢。如果,A用户把自己的文件分享给了100个用户,则要对每个用户分别进行授权,很麻烦。引用了”组“的概念,如:只要授与这个组(机构)有对该文件(资源)的读(r)权限,而该文件又是这个组拥有的资源。只要这100个用户加入这个组(机构),它们都拥有对该文件的读(r)权限了。所以说,组是快速分配资源的方法。-----> 所以一个资源通常是属于某个用户的,叫属主。资源是一个组的资源,叫属组。改变资源的属组使用的命令【chchgrp】

     因为,在 linux 中每一个用户都是至少属于一个组的。所以,它创建文件的时候就确定该资源属于哪个组的了。但是,我们也可以使用【chown】修改资源的属主和属组。

所以一个文件的拥有者有两个:属主、属组。

wKiom1O9LnPyDBsXAAI7dHSxSWI141.jpg

     Linux 的一个重要哲学思想“一切皆文件”。我们在Linux系统下,用户访问的资源都是文件,所以资源的管理就简化了对文件的管理了。

所以,我们对资源的管理,无非是,下面两点:

1、改变资源的拥有者(用户、组)

   在 linux 系统中,资源的占用者为:属主、属组,所以对资源的拥有者的改变就是改变资源的属主和属组。

   使用【chown】,注意这是管理类命令,普通用户不可以执行。管理员,才有权限执行该命令。

   [system@Node1 tmp]$ chown :admin a.txt
   chown: changing group of `a.txt‘: Operation not permitted

 (A)、使用命令【chown】Change the owner,提供的选项可以改变文件的属主和属组。

Usage: chown [OPTION]... [OWNER][:[GROUP]] FILE...
   or: chown [OPTION]... --reference=RFILE FILE...

  chown -R  OWNER:        递归修改一个目录中的文件及其子目录中的文件属主
  chown -R  :GROUP        递归修改一个目录中的文件及其子目录中的文件属组
  chown -R  OWNER:GROUP   递归修改一个目录中的文件及其子目录中的文件属主和属组
  chown  --reference=file  FILE...    把文件(FILE)的属主属组修改与file的属主属组相同。
	                               注意:【chown】参考时,不仅修改属主,和属组。
				             【chgrp】参考时,仅修改属组。
[root@Node1 tmp]# ll
total 108
-rw-r--r--.  1 root  root     0 Sep  8  2012 abc.txt
-rw-rw-r-x.  1 admin admin    0 Jul  8 22:48 a.txt
[root@Node1 tmp]# chown --reference=/tmp/abc.txt  a.txt ---> 使用参考时,属主属组也改变了
[root@Node1 tmp]# ll
total 108
-rw-r--r--.  1 root root    0 Sep  8  2012 abc.txt
-rw-rw-r-x.  1 root root    0 Jul  8 22:48 a.txt

(B)、改变文件的属组的命令【chgrp】

   Usage: chgrp [OPTION]... GROUP FILE...
      or: chgrp [OPTION]... --reference=RFILE FILE...
      
[root@Node1 tmp]# ll
total 108
-rw-r--r--.  1 root  root     0 Sep  8  2012 abc.txt
-rw-rw-r-x.  1 admin admin    0 Jul  8 22:48 a.txt
[root@Node1 tmp]# chgrp --reference=/tmp/abc.txt  a.txt
[root@Node1 tmp]# ll
total 108
-rw-r--r--.  1 root  root    0 Sep  8  2012 abc.txt
-rw-rw-r-x.  1 admin root    0 Jul  8 22:48 a.txt    --------> 使用参考时,仅属组改变

2、既然我们把资源共享给别的用户了(该资源同时可以有多个用户可以使用),就要授与该资源的使用者权限。

   使用【chmod】change file mode bits 改变文件权限模型的权限位。实现资源的授权。

   注意:资源的属主,才可以使用【chmod】授权资源是如何使用的,但是系统管理员可以对任何资源进行授权。

[admin@Node1 tmp]$ ll a.txt
 -rw-rw-r-x. 1 system system 0 Jul  8 22:48 a.txt
 [admin@Node1 tmp]$ chmod o-x a.txt
 chmod: changing permissions of `a.txt‘: Operation not permitted
   
 [system@Node1 tmp]$ chmod o+x a.txt
 [system@Node1 tmp]$ ll a.txt
 -rw-rw-r-x. 1 system system 0 Jul  8 22:48 a.txt

  使用方法:

Usage:  chmod [OPTION]... MODE[,MODE]... FILE...
   or:  chmod [OPTION]... OCTAL-MODE FILE...
   or:  chmod [OPTION]... --reference=RFILE FILE...
         -R   递归修改(如果我们修改的是一个目录中的文件而且还有子目录中的文件时,这个选项是很方便的)
         --reference=FILE  参考 FILE 的权限

(1)、此种方法。修改指定类别的使用者的权限位,是很方便的。但是如果我们要对不同类别的使用者授与不同的权限。使用该种方法是很麻烦了,可以选择第二种方法。

操作指定类别的使用者(属主、属组、其它用户)的权限位:

      +/-  增加(授权)/减去(撤消)
      u    属主
      g    属组
      0    其它用户
      a    所有,包括:u,g,o
  chmod u+rwx     增加文件的属主的读(r)、写(w)、执行(x)权限。
  chmod u-rwx     减去文件的属主的读(r)、写(w)、执行(x)权限。
  chmod u+x       增加文件的属主的写(w)权限
  chmod a+rwx     增加文件的属主、属组、其它用户的读(r)、写(w)、执行(x)权限。

注意:

    没有指定对谁(属主、属组、其它用户)增加或减去权限,则是对文件的属主、属组、其它用户都进行“权限位”的改变操作。

    ”增加/减去“写(W),只对属主有效。如下例子:

[root@Node1 tmp]# ll a.txt
-rw-r--r--. 1 admin root 0 Jul  8 22:48 a.txt
[root@Node1 tmp]# chmod +x a.txt
[root@Node1 tmp]# ll a.txt
-rwxr-xr-x. 1 admin root 0 Jul  8 22:48 a.txt
[root@Node1 tmp]# chmod 777 a.txt
[root@Node1 tmp]# ll a.txt
-rwxrwxrwx. 1 admin root 0 Jul  8 22:48 a.txt
[root@Node1 tmp]# chmod -w a.txt  
chmod: a.txt: new permissions are r-xrwxrwx, not r-xr-xr-x  ---
[root@Node1 tmp]# ll a.txt
-r-xrwxrwx. 1 admin root 0 Jul  8 22:48 a.txt

(2)、一次性完成文件的“属主、属组和其它用户”的权限位的改变操作。

 使用三位二进制分别表示:"读写执行" 也就是 rwx. 0表示该位无效,1表示该位有效。

   r--:100   转成 8进制  4
   -w-:010               2
   --x:001               1
   r-x:101               5

   chmod  属主(8进制值)属组(8进制值)其它用户(8进行值)  FILE...

   如:chmod   754  FILE....

 说明:
     属主:     第一位数字:7    ------>转成二进制:111    也就是:rwx
     属组:     第二位数字:5    ------>转成二进制:101    也就是:r-x
   其它用户:   第三位数字:4    ------>转成二进制:100    也就是:r--

所以,就把 FILE 的权限属性修改为:  rwxr-xr-- 所就是使用【ll】列出文件的的时候显示的内容

 [root@Node1 ~]# chmod 754 /tmp/a.txt
 [root@Node1 ~]# ll /tmp/a.txt
 -rwxr-xr--. 1 admin root 0 Jul  8 22:48 /tmp/a.txt

   说明:此种修改文件的权限的方法,有局限性,不太适合只修改某类使用者(属主、属组、其它)的权限。

   如果想更灵活地修改权限,可以参考上述第一种方法。

二、用户的管理;

    使计算机主机工作的正是核心的任务,但操作核心来替用户工作的,却是 Shell 。

     通常用户都是以 shell 来与核心沟通,让核心达到我们所想要实现的目的,Shell 有两种:登陆 shell 和 非登陆 shell.系统有很多 Shell 可用,如:sh,bash,nologindash,tcsh,csh 我们新建用户的时候要指定使用什么shell 来作为该用户的登陆 shell. 当在登陆提示符 " Nodel login: " 输入用户时,login 会会检查用户使用的 shell是不是系统认为是安全的,CentOS 系统中存放在 /etc/shells 文件中的 shell 都是安全的。如果用户默认登陆系统的 shell 不是该文件的 shell ,就会被拒绝登陆系统的。   

1、创建组和用户

在 Linux 系统中组是实现对资源的快速授权的一种机制。用户是属于组的,且可以属于多个组,如果新建用户的时候,不指定该用户属于哪个组的,就以用户名作为组名。

Linux 中用户又分为系统用户和普通用户。

所以,我们新建用户的时候:

      A、如果,我们创建的系统用户,一般是不会有家目录的(home directory). 

      B、默认是创建普通用户的。我们需要指定新建用户的默认登陆 shell,该用户属于哪个组,

         组又分为:基本组和附加组。分别使用 -g 和 -G。基本组只能有一个,附加组可以有多个。

[root@Node1 ~]# id mandriva
uid=4004(mandriva) gid=3301(linux) groups=3301(linux),3300(distro),2201(fedora)
用户名             基本组          附加组(linux,distro,fefora)

(1)、添加用户的命令使用方法

 useradd [options] LOGIN
-s|--shell SHELL  指定用户的默认登陆 shell
-r               创建的新用户为系统用户  
-P		 选项指定密码,是明文的。
-g               用户属于哪个组的。使用该选项,一定要先创建组。
-G               用户的附加组。可以指定多个,但要使用逗号(,)隔开。
-u               可以创建指定 uid 的用户,但该 uid 没有用户占用。
-d               指定用户的家目录的位置,默认在 /home 目录下。
-M                创建用户的时候不创建家目录。
-m               创建家目录。创建普通用户是默认创建家目录的。
[root@Node1 ~]# useradd -r  -s /bin/bash -p user  user
[root@Node1 ~]# tail -1 /etc/shadow
user:user:16256::::::

使用命令【useradd】创建的用户如果没有密码是不可以登陆系统的。

[root@Node1 ~]# cat /etc/shadow | grep mysql
mysql:!!:16255::::::

说明:

    密码文件/etc/shadow 第二字段,只显示两个叹号(!!),表示:该用户是没有密码的。我们也可以使用这种方式,限制用户登陆系统。方法:在用户的密码前加两个叹号。

  另个一种方式使用【 usermod -L user_name】锁定用户,如果用户再次登陆就无法登陆了。 【usermod -U user_name】解锁用户就可以登陆系统了。

(2)、添加组使用【group,add】

    Usage: groupadd [options] GROUP
     -g       指定新建的组的UID号
     -f       如果创建的组已经存在,就成功退出。即出状态码为“0”
     -r       创建系统组

2、设置用户密码

管理员可以修改任意用户的密码。普通用户只可以修改自己的密码。

(A)、自己修改自己的密码

   例,普通用户修改自己的密码

   [system@Node1 ~]$ passwd
   Changing password for user system.
   Changing password for system.
   (current) UNIX password:

   说明:普通用户修改自己的密码,必需符合 PAM(插入式验证模块)的要求,否则修改不成功。

         管理员用户修改则不受该PAM限制,但是会警告。

 (B)、管理员修改用户密码使用下述方法

  Usage: passwd [OPTION...] <accountName>
   --stdin           使用标准输入,避免交互式,可以使用管道

   查看一个用户的密码信息,如密码的加密方式、什么时候设置的密码、密码的有效时间等,其实这是显示 /etc/shadow 文件中内容。

3、修改用户的各项属性

其实就是修改 /etc/passwd 文件的各段的内容的,不过它还可以管理用户如:锁定用户。

   [root@Node1 ~]# tail -1 /etc/passwd
   user1:x:4028:4028::/home/user1:/bin/bash

 命令的使用方法

  Usage: usermod [options] LOGIN
      -l   New_Login           修改用户名
      -L                       锁住帐户(用户),用户就不可以登陆系统了。需要解锁才可以。 
      -U                       解锁。
      -u    Uid                修改uid
      -g    groupName|gid      修改gid
      -G    groupName1,groupName2,...|gid1,gid2,...      修改附加组,附加组可以有多个。
                                                       有多个时需要使用逗号(,)分隔。
      -a                       以追加文件修改一个用户的附加组。如果没有该选项,
                               只使用 -G 会把原来的附加组删除的。所以它们一起使用
     -aG   groupName1,groupName2,...|gid1,gid2,...   以追加方式给追加附加组
      -c    "string..."        修改用户的注释信息
      -s    SHELL              修改用户的登陆shell

4、修改用户密码的各项属性change user password expiry information

   其实就是修改 /etc/shadow 文件的各段的内容的。

[root@Node1 ~]# head -1 /etc/shadow
 root:$6$Ej0XQ5rP$5D50AwSMJNy01z3nc86WBeXjqFk/xeB3x0wlh6HNfC2AwWjF9V2U3sUSa4iArVFL7Ijaz3HPZVpl5t7XuQvO7.:16251:0:99999:7:::
Usage: chage [options] [LOGIN]
    -l   userName     显示userName 用户的密码的各项属性。
                      也就是密码的有效期、什么时候过期。。。等信息。
[root@Node1 ~]# chage -l admin
Last password change         : Jul 06, 2014    ----> chage -d DATE userName
Password expires             : never        ------>  chage -E DATE userName  最后失效时间
Password inactive            : never         ------> chage -I INACTIVE  密码非活动时间。
Account expires                                   : never         ------> 帐号是否失效
Minimum number of days between password change    : 0     ------> chage -m DATE  userNameMaximum number of days between password change    : 99999 --> chage -M DATE  userName  
Number of days of warning before password expires : 7     ----> chage -W DATA  userName

5、删除用户


 Usage: userdel [options] LOGIN

  -r    删除用户的家目录和邮箱目录。

        这两上目录是创建用户的时候默认创建的。

        使用【userdel】默认是不会删除用户的家目录和邮件目录的。

所以,有时候我们明明使用【userdel】把用户删除了,

        下一次又创建用户与删除的用户同名的时候,就不会显示一些信息.

[root@Node1 ~]# useradd user1
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
[root@Node1 ~]# echo $?
0
[root@Node1 ~]# id user1
uid=4028(user1) gid=4028(user1) groups=4028(user1)

6、删除组

group  groupName


7、修改用户的说明信息

[root@Node1 ~]# chfn admin
Changing finger information for admin.
Name []: RedHat
Office []: 801
Office Phone []: 86268
Home Phone []: 18600000000

Finger information changed.


本文出自 “Linux” 博客,请务必保留此出处http://9528du.blog.51cto.com/8979089/1436417