手机版
你好,游客 登录 注册
背景:
阅读新闻

Linux基础知识之用户和用户组以及 Linux 权限管理

[日期:2016-10-23] 来源:cnblogs.com/charleylla  作者:charleylla [字体: ]

到权限了。前面讲到了 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 的区别。

  谢谢观看。

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-10/136251.htm

linux
本文评论   查看全部评论 (2)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
第 2 楼
* Mir-fu会员 发表于 2018/1/31 14:08:34
大神,求carry
第 1 楼
* 匿名 发表于 2017/7/21 20:35:36
写的真认真,对于我这样的小白来讲,真好!不过,楼主,passwd --stdin,不是--stdio吧。似乎写错一个字母……