到权限了。前面讲到了 Linux 中的用户和用户主管理,其实它们的本质(或者用户和用户组出现的初衷)都是方便权限管理。权限管理对于计算机的重要性不言而喻,权限让每个用户能够安安心心的使用计算机,而不用担心别的用户破坏到自己的资源。如果老王手里有一把你家的钥匙,你是不是很蛋疼呢,如果邻居除了老王,还有老赵,老李,老张...都有你家的钥匙,你是不是更加蛋疼呢。作为多用户的 Linux 而言,权限管理至关重要。

  1.Linux 文件权限的规定 

  前文提到,Linux 规定一个文件必须要有三种权限:文件所属主权限,文件所属组所在组的权限以及其他用户的权限。通过 ll 命令可以查看目录或者单个文件的权限信息:

  

  上面红框标注的区域,除去第一位之外,都是该文件的权限信息。第一位表示文件的类型,如目录,普通文件,链接等。权限每三个进行分组,分别表示文件所属主权限,文件所属主所在组权限和其他用户权限(我再也不想打这几个字了真的)。

  2.权限的表示方式

  每个文件具有三种权限:读(r),写(w)和执行(x),如果没有权限用 - 表示,每个用户对某个文件的权限都是上面四种标识的排列组合:

    • ---:无任何权限

    • --x:只可执行

    • -w-:只可写

    • -wx:只可写和执行

    • r--:只读

    • r-x:只可读和执行

    • rw-:只可读写

    • rwx:可读、写、执行

  如果使用二进制 1 和 0 分别表示有对应权限和无对应权限,上面的权限可以表示为:

    • 000:无任何权限

    • 001:只可执行

    • 010:只可写

    • 011:只可写和执行

    • 100:只读

    • 101:只可读和执行

    • 110:只可读写

    • 111:可读、写、执行

  机智的你也许说:这都什么鬼啊,奏凯奏凯,我觉得十进制才是淫类的标准数字语言,你能不能把它改为十进制?OK:

    • 0:无任何权限

    • 1:只可执行

    • 2:只可写

    • 3:只可写和执行

    • 4:只读

    • 5:只可读和执行

    • 6:只可读写

    • 7:可读、写、执行

  这总可以了吧!可是机智的你又说:总共才八个数字啊,为啥要写成十进制,不如咱们写成八进制把!:)。fine,这里我就不写了,因为将上面的十进制改成八进制结果是一样的。

  现在我们知道了,所有的权限都可以使用 0~7 之间的某个八进制数字来表示,是不是比使用 r、w、x 和 - 更加方便呢。

  这时,机智的你又提出了一个问题:尼玛这么多数字,每个数字都代表了不同的含义,记起来太麻烦了!关键是还可能记错啊,要知道咱们程序猿可是懒淫啊!有没有更快乐一点的方法?

  我老实告诉你吧:没有!那么现在来说一下比较快乐的记忆权限数字的方法:)

  如果我们提取出只读、只写、只执行以及无权限的数字,可以得到:

    • 0:无权限
    • 1:只执行
    • 2:只写
    • 4:只读

  发现没?不管是 3,5,还是6等等这些权限数字,都是在0,1,2,4上面的几个进行加法运算得到,其中最小值为0,最大值为7。因此 3 = 1 + 2,表示只写和只执行;5 = 4 + 1,表示只读和只执行....

  终于记住权限了有木有,那么现在我们来愉快的 chmod 777 吧。嗯哼?chmod 是什么鬼?chmod 是我们修改权限的终极命令,在说这个命令之前还是先说一说文件的所属主和所属主所在的组吧(呸!)。

  3.文件的所属主

  回到上图,我们再来看一下 ll 所列出的目录中的文件详细信息:

  

  框起来的部分分别该文件的所属主和所属主所在组。为了避免这么拗口,我们把文件的所属主改为文件的所有者,把文件所属主的所在组该问文件所有者组,这样叫起来就方便一些了。默认情况下,文件的所有者就是创建该文件的用户,文件的所有者组则是文件所有者的基本组。由于在创建 charley 用户时没有制定基本组,它的基本组就是默认的 charley,如果 charley 的基本组改变为 Handsome,那么框起来的内容就应该是:charley Handsome。

  在 Linux 中,我们说一切都可以改改改,那么文件的所有者和文件的所有者组能否修改呢?接下来就请出我们改天改地改空气甚至还能 commit suiside 的 root 君。

  4.修改文件的所有者和所有者组(root only)

  root 用户改变文件的所有者和所有者组需要用到两个命令:chown 和 chgrp。

    • chown USERNAME file1,file2,file3... :改变文件的所有者,可以一次修改多个文件
    • chown -R USERNAME DIR:递归改变目录下的所有文件的所有者
    • chown --reference = PATH file1,file2...:将文件的所有者信息改成和 PATH 一致
    • 注意:--reference 会将所有者和所有者组一并修改
    • chown --reference = PATH -R DIR:递归 reference
    • chown USERNAME:GROUPNAME / chown USERNAME.GROUPNAME:同时改变所有者和所有者组
    • chown :GROUPNAME / chown .GROUPNAME:改变所有者组

  OK,介绍完了。什么?还有个 chgrp 没说?这货其实用法和 chown 一样啦,只是只能修改所有者组而已,使用 chown 可以同时改变所有者和所有者组,因此我个人使用 chown 多一些。

  5.chmod:修改文件权限

  chmod 修改文件权限的方式很简单:chmod MOD file1,file2...,大体的用法和 chown 一致。

    • chmod u=rx FILE:修改所有者的权限
    • chmod g=rwx FILE:修改所有者组的权限
    • chmod u=rx,g=x FILE:同事修改所有者和所有者组的权限
    • chmod o= FILE:修改其他用户的权限
    • chmod [u|g|o][+|-] MOD FILE:位某类用户添加或者删除权限
      • chmod u+x,g-w FILE
    • chmod MOD FILE:使用八进制权限值修改权限
      • chmod 775 FILE
      • chmod 000 FILE

  个人比较喜欢最后一种方式修改权限。

  6.通过修改配置文件创建用户

  还记得 useradd -M USERNAME 吗?这行命令用于创建一个用户,但是不创建用户的家目录。如果我们想要手动创建用户的家目录,就需要拷贝 /etc/skel 中的文件到对应的目录中,然后将该目录的权限分配给该用户。来看一下 /etc/skel 中的内容:

  

  框起来的部分就是我们在手动创建目录的时候需要复制的部分,直(shi)觉(jue)告诉我们这些文件和 bash 有关。稍后会详细解释。

  另外我们知道,/etc/passwd 和 /etc/shadow 中存放了和用户相关的讯息,因此在添加用户时还需手动向这两个文件中写入内容(创建组同理)。下面给出简要的步骤:

    • # nano /etc/passwd

    • # nano /etc/group

    • # nano /etc/shadow

    • # cp -r /etc/skel /home/fish

    • # chown -R fish:fish /home/fish

    • # chmod -R go= /home/fish

  创建用户基本完成了,接下来创建密码:

    • # passwd fish -> 这样做的密码不是散列值,我们应该使用加密后的密码
    • openssl passwd,然后输入密码。 -> 得到的结果是加密后的值,但是没有加盐,不可取
    • openssl passwd -1 -salt 'memeda'(1代表md5加密),-salt 表示加盐
    • 将上部生成的字串粘贴到 /etc/shadow 中

  大功告成!你看,root 用户是不是很帅很风骚呢。

  还有个问题。

  /etc/shadow 是保存用户密码信息的,那么这个文件的权限是多少呢?ll 后可以看到:400。即使 root 用户,也只有读权限,这到没什么,毕竟 root 改天该地改空气嘛。那么对于其他用户呢?如果其他用户没有写权限的话,是如何做到修改密码的呢?——普通用户使用 passwd,开启一个 passwd 进程,这个进程的所有者是普通用户,因此是无法修改 /etc/shadow 的。但是普通用户明明可以修改自身的密码呀,这就需要从 passwd 命令本身说起。

  ll `which passwd`,可见 passwd 命令的权限为:rwsr-xr-x 。s 的存在使得普通用户可以改密码。s 属于特殊权限,由此用户使用 passwd 可以修改自身密码。

  7.再看权限

  有个问题我们一直没有考虑:普通用户创建的文件和管理员创建的文件权限有什么区别呢?我们在命令行中看一下。首先是普通用户:

    

  接下来是 root 用户:

  

  可见,普通用户创建的文件默认权限为:664,而管理员创建的文件默认权限为:644。它俩是不同的。

  难道还有什么东东主导了文件创建的默认权限值吗?

  必须得有。这个值就是 umask 遮罩码(反向掩码),他是可以在 bash 中查看的,普通用户的默认 umask 为 0002,root 用户的默认 umask 为 0022。用户创建文件的默认权限等于:系统默许的最大权限 - umask。

  Linux 中创建的文件默认没有执行权限,因此其最大权限是 666,这下知道为啥管理员创建的文件权限是 644,普通用户创建的文件权限是 664了吧。

  再则,如果是目录呢?Linux 中目录的最大默认权限是 777。因此普通用户创建的目录默认权限为 775,管理员创建的目录默认权限为 755。

  8.修改 umask

  既然 umask 有一个默认值,我们能否修改呢?必须可以。只需 umask NEWVAL 就可以了。这种方式修改只在当前登录有效。看下修改之后的结果变化:

  

  恩,大功告成!

  机智的你再次叫住了转身的我:等等啊喂,好像有点问题。权限还是 644 啊,根本没有改成功啊!其实是改成功了的,只是系统又帮我们改了一次而已。

  理论上我们的权限应该这样:666 - 023 = 643,但是为什么还是 644 呢?因为 Linux 是死脑筋,它始终认为新创建的文件默认不能有执行权限,所以它看到我们修改 umask 后创建的文件拥有执行权限后,就默默的加上了 1,深藏功与名。

  到此,权限的部分我们已经说完了,还有最后的一丢丢内容。

  上面说到,修改 umask 只对当前登录有效,退出后重新登录,umask 就重置为默认值了。怎么让这种修改一直有效呢?

  9.Linux 的登录机制

  让我们拉出二营长的意大利炮,对这最后一块内容摩擦摩擦把。我们可以把 Shell 分为以下两种:

    • 登录式 Shell
    • 非登录式 Shell

  下面的情况属于登录式 Shell:

    • 普通用户通过终端登录
    • 管理员登录普通用户
      • su - USERNAME
      • su -l USERNAME

  下面的情况属于非登录式 Shell:

    • 图形终端下打开命令窗口
    • 自动执行的 Shell 脚本
    • su USERNAME(注意没有 - 或者 -l)

  登录式 Shell 和非登录式 Shell 最主要的区别在于登录时读取配置文件的方式不同。配置文件有两种,一种是全局配置文件,一种是个人配置文件。顾名思义,全局配置文件对所有用户生效,个人配置文件只对特定用户生效。全局配置文件存放在 /etc 中,个人配置文件存放在 ~ 中,当然 /etc/skel 中也存在一份,新建用户时都会默认从 /etc/skel 中复制配置文件到自身的家目录,因此所有用户默认的配置文件是相同的。

  全局配置文件:

    • /etc/profile
    • /etc/profile.d/*.sh
    • /etc/bashrc

  个人配置文件:

    • ~/.bash_profile
    • ~/.bashrc

  可见配置文件分为两大阵营:profile 阵营和 bashrc 阵营。来看看它们分别起到的作用:

  profile 配置文件:

    • 设置环境变量

      • 如果我们想建立所有用户的全局变量,就修改 /etc/profile 或者在 /etc/profile.d/ 下建立任意以 .sh 结尾的文件,其中写入环境变量。
      • 如果对单个用户配置环境变量:编辑 ~/.bash_profile
      • 如果两个都有,以 ~/.bash_profile 为准
    • 运行命令或者脚本(比如开机启动或者登陆问候语)

  bashrc 配置文件:

    • 设定本地变量
    • 定义命令别名

  登录式 Shell 读取配置的方式:/etc/profile -> /etc/profile.d/*.sh -> ~/.bash_profile -> ~/.bashrc -> /erc/bashrc

  非登录式 Shell 读取配置的方式:~/.bashrc -> /etc/bashrc -> /etc/profile,d/*.sh

  可见:非登录式 Shell 不读取 /etc/profile 和 ~/.bash_profile,因此 su 和 su -的用户读取到的配置是不一致的。su 也叫半切换,su - (su -l)叫全切换。

  现在我们了解:要想我们定义的命令别名,本地变量等一直有效,需要将定义写入配置文件(全局或者个人),如果还要要区分登录式 Shell 和非登录式 Shell,就需要将配置写入 /etc/profile 或者 ~/.bash_profile 中。

  10.总结

  本文主要介绍了 Linux 的权限管理,包括 Linux 的权限表示方式,修改权限,修改文件的所有者和所有者组,以及 umask 遮罩码。最后介绍了 Linux 的配置文件,包括全局配置和个人配置,以及登录式 Shell 和非登录式 Shell 的区别。

  谢谢观看。


作者:Charleylla  转载请注明出处:http://www.cnblogs.com/charleylla/p/5980300.html


[Linux 004]——用户和用户组以及 Linux 权限管理(二)的更多相关文章

  1. [Linux 003]——用户和用户组以及 Linux 权限管理(一)

    嗬!没想到吧!学习 Linux 的第三天,我们已经开始接触用户管理,用户组管理,以及权限管理这几个逼格满满的关键字.这几个关键字对于前端程序猿的我来说真的是很高大上有木有,以前尝试学 Linux 的时 ...

  2. Linux用户、用户组、文件权限学习笔记

    最近打算更仔细学习一下linux操作系统.先是恶补了一下用户.用户组.文件权限这三样比较重要的知识.学习这几样东西,得先掌握linux的权限系统相关知识.linux的权限系统主要是由用户.用户组和权限 ...

  3. 2.Linux的用户、用户组、权限、文件系统管理及其网络配置

    2.1 Linux的用户及用户组 2.1.1 Linux的用户管理 用户账号管理包含以下三个方面: 用户账号的添加.删除.与修改 用户口令(密码)的管理 用户组的添加.删除管理 Linux系统中用户信 ...

  4. linux创建用户和用户组

    Linux创建用户.用户组 及 删除 在创建用户时,需要为新建用户指定一用户组,如果不指定其用户所属的工作组,自动会生成一个与用户名同名的工作组.创建用户user1的时候指定其所属工作组users,例 ...

  5. Linux命令——用户和用户组管理

    Linux命令--用户和用户组管理 命令groupadd 作用:新增组 格式:groupadd [-g GID] groupname 参数:-g,指定GID,一般从500开始 说明:一般不必加-g参数 ...

  6. 13、linux中用户和用户组

    linux是多用户多进程的系统: 每个文件和进程都需要应对一个用户和用户组: linux系统通过uid和gid来识别用户和组的: 一个用户必须要有唯一的uid和一个主组来识别身份,不同的用户可以使用同 ...

  7. Linux基础——用户和用户组

    Linux基础--用户和用户组 一.用户和用户组 用户在/etc/passwd中 用户组在/etc/group/中注意:在创建用户时,系统默认生成一个用户组(组名和用户名一致) 1.用户 1.1查看用 ...

  8. Linux查看用户所属用户组

    1.查看当前用户所属用户组 [oracle@serverhl ~]$ groups oinstall dba 2.查看<user1>, <user2> 和 <user3& ...

  9. Day 5 Linux之用户、群组和权限

    Linux之用户.群组和权限 一.各文件及内容对应含义 1./etc/passwd文件 功能:存储所有用户的相关信息,该文件也被称为用户信息数据库(Database). 含义:如下图所示. 2./et ...

随机推荐

  1. maven仓库加载本地包依赖

    如果有个jar包是我们自己打的,怎么放到maven中呢? 首先在项目里面新建一个lib目录,如果有lib目录则不需要新建,然后放自己的jar包进去,maven的pom.xml配置是: <depe ...

  2. LeetCode 笔记系列七 Substring with Concatenation of All Words

    题目:You are given a string, S, and a list of words, L, that are all of the same length. Find all star ...

  3. win7卸载IE11

    好多人升级了IE11后发现各种不好用,比如经常卡死,无响应.调试工具不好用等缺点. 现在告诉你如何卸载IE11 查看已安装的更新 右键wie卸载,即可需要重启

  4. 用wamp实现前端和php的交互效果

    我们今天来用php来做一下前台与后台的交互效果,首先我们先打开这个软件. 看一下电脑右下角的小图标 当变成之后鼠标左键 打开这个之后点击第二个之后会打开一个网站 点击右面页面的数据库打开新建数据库,填 ...

  5. Logstash利用GeoIP库显示地图以及通过useragent显示浏览器(

    http://www.nibayuan.com/articles/2016/02/23/elk-logstash-geoip-kibana-tilemap.html 我们通过Logstash收集的Ng ...

  6. 第六周小组作业 软件测试与评估:百词斩VS扇贝单词

    被测产品说明: A:百词斩 B:扇贝单词 一.基本任务 1.测试进度表 | 项目 | 内容说明 | 预估耗时(分钟) | 实际耗时 (分钟) | | -------------- | -------- ...

  7. Yii框架2.0的安装过程

    Yii框架是个不错的php开发框架,大型项目上都可以使用.和大多框架一样他也是开源,而且采用了mvc结构的. Yii1.*,直接下载然后用脚步可以创建自己的项目了,最近看了下Yii2.0版本的,他推荐 ...

  8. windows中的进程和线程

    今天咱们就聊聊windows中的进程和线程 2016-09-30 在讨论windows下的进程和线程时,我们先回顾下通用操作系统的进程和线程.之所以称之为通用是因为一贯的本科或者其他教材都是这么说的: ...

  9. 新手怎么读懂一个中型的Django项目

    [前言]中型的项目是比较多的APP,肯会涉及多数据表的操作.如果有人带那就最好了,自己要先了解基本的django框架(MTV ,ORM等)师傅可以给讲解一下框架怎么组织url.py,model.py, ...

  10. 配置MDM的描述文件

    配置描述文件 首先需要一个 MDM 配置描述文件,此文件用于安装到设备上,使其向 MDM 服务器注册为受管理的设备. 1.凭证 用iphone配置使用工具,新建一个配置描述文件,在“凭证”栏,创建新凭 ...