博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在Linux系统中文件(资源)和用户的管理
阅读量:6412 次
发布时间:2019-06-23

本文共 8824 字,大约阅读时间需要 29 分钟。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
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
】参考时,仅修改属组。
1
2
3
4
5
6
7
8
9
[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】

1
2
3
4
5
6
7
8
9
10
11
12
   
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】授权资源是如何使用的,但是系统管理员可以对任何资源进行授权。

1
2
3
4
5
6
7
8
[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

  使用方法:

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

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

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

1
2
3
4
5
6
7
8
9
      
+
/-  
增加(授权)/减去(撤消)
      
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),只对属主有效。如下例子:

1
2
3
4
5
6
7
8
9
10
11
12
[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表示该位有效。

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

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

   如:chmod   754  FILE....

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

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

1
2
3
 
[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。基本组只能有一个,附加组可以有多个。

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

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

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

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

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

说明:

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

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

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

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

2、设置用户密码

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

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

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

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

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

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

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

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

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

3、修改用户的各项属性

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

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

 命令的使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
  
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 文件的各段的内容的。

1
2
[root@Node1 ~]
# head -1 /etc/shadow
 
root:$6$Ej0XQ5rP$5D50AwSMJNy01z3nc86WBeXjqFk
/xeB3x0wlh6HNfC2AwWjF9V2U3sUSa4iArVFL7Ijaz3HPZVpl5t7XuQvO7
.:16251:0:99999:7:::
1
2
3
Usage: chage [options] [LOGIN]
    
-l   userName     显示userName 用户的密码的各项属性。
                      
也就是密码的有效期、什么时候过期。。。等信息。
1
2
3
4
5
6
7
[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】把用户删除了,

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

1
2
3
4
5
6
7
8
[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、删除组

1
group  groupName

7、修改用户的说明信息

1
2
3
4
5
6
7
8
[root@Node1 ~]
# chfn admin
Changing finger information 
for 
admin.
Name []: RedHat
Office []: 801
Office Phone []: 86268
Home Phone []: 18600000000
 
Finger information changed.
     本文转自成长的小虫 51CTO博客,原文链接:http://blog.51cto.com/9528du/1436417
,如需转载请自行联系原作者
你可能感兴趣的文章
面试经典-设计包含min函数的栈
查看>>
linux下php添加cur/soapl扩展
查看>>
【百度地图API】多家地图API文件大小对比
查看>>
也可以使用如下命令更改您的默认 Shell
查看>>
Windows系统中IIS 6.0+Tomcat服务器环境的整合配置过程
查看>>
2015-03-15
查看>>
Node.js HTTP Server对象及GET、POST请求
查看>>
Android开发面试经——5.常见面试官提问Android题①
查看>>
linux下添加PATH环境变量
查看>>
echarts入门,5分钟上手写ECharts的第一个图表
查看>>
MySQL utf8mb4 字符集:支持 emoji 表情符号
查看>>
RabbitMQ集群、镜像部署配置
查看>>
Linux大神必备-文本编辑器
查看>>
"npm ERR! Error: EPERM: operation not permitted"问题解决
查看>>
EntityFramework(EF)贪婪加载和延迟加载的选择和使用
查看>>
Linux:Ubuntu 14.04 Server 离线安装Jjava8(及在线安装)
查看>>
linux tar包追加问题【转】
查看>>
【Debug 报异常】Debug打断点报错
查看>>
java中等待所有线程都执行结束(转)
查看>>
【Spark】DAGScheduler源代码浅析
查看>>