已经开始接触Linux用户管理,用户组管理,以及权限管理这几个逼格满满的关键字。这几个关键字对于前端程序猿的我来说真的是很高大上有木有,以前尝试学 Linux 的时候看到这些名词总是下意识的跳过不敢看有木有,一提起这几个名词马上脑海中总是升腾起无限的崇拜有木有!今天就硬着头皮捯饬捯饬这几个概念,希望能有所收获。 1.从 /etc/passwd 说起前面的基本命令学习中,我们介绍了使用 passwd 命令可以修改用户密码。对于操作系统来说,用户名和密码是存放在哪里的呢?我们都知道一个站点的用户名和密码是存放在数据库中,数据库是用来保存记录数据的,我们常用的数据库有 MySQL,Oracle,MongoDB等。其实,我们把 MySQL 等叫做数据库是不严谨的,因为它们只是数据库的管理软件,从广义上来说,任何能保存数据的东东都可以叫做数据库。比如文本。 数据库是用来保存数据的,操作系统中的用户名和密码也理应存放在数据库中,这个数据库是啥呢?在 Linux 下,它是处于 /etc 下的一个叫 passwd 的文件。我们不妨看一下这个文件中的内容。
大多数人看到这种东东一般都会说:什么?你确定这不是天书?这里面能瞅到啥?说实话,除了行号,我一个都不认识! 好了,再仔细看看,找找规律。经过你的仔细观察,你可能会注意到以下几点讯息:
于是你大胆的猜测:对的!这就是我们的用户表,这些表也包含一个个字段,这些字段用来存放用户的某些信息!事实上也正是如此,/etc/passwd 保存了用户相关的信息,包括用户名,密码,所属组等等。或许你还会有疑问:明明我们只有两个用户,一个管理员账户 root,一个是普通用户 charley,那其他的东西是什么呢?为什么他们也出现在这个表里面?别急,先从分组形式讲起。 2.一些常见的分组形式下面,我们就对用户,用户组以及上面的一些疑问进行展开讨论。首先介绍一些对用户或者用户组分组的方式,站在不同的角度,可以进行不同的区分。
上面的分组方式是不是看的你眼花缭乱呢?没关系,其实对用户或者用户组分组,本身就是多解的,只是由于站的角度不同,产生了不同的结果而已。换个角度,我们还可以再来 N 种分组形式,以上只是常规的分法。由于这些分组的形式可以体现在我们创建用户或者用户分组命令选项中,在学习了创建用户和创建用户组的命令之后,自然可以轻松的理解这些概念。 3.理解用户我们知道 /etc/passwd 相当于操作系统保存用户信息的数据库,那么如此可以得出表中每行数据都是代表了一个特定的用户,但是除了系统的 root 用户和我们创建的一个普通用户 charley 之外,还有很多其他的东西,这些东西是什么呢?它们也是用户吗?是的,这些我们不认识的东东,也是用户,只不过不是有我们创建,而是由操作系统创建的,所以叫做系统用户。 某人如果想使用操作系统的某些功能,那么他必须是这个系统上的一个用户(客人用户也是用户)。用户登录操作系统之后,操作系统可以由用户的特征码进行权限的分配,以便使用操作系统的功能。 我们使用计算机,使用操作系统,是为了让他们帮我们完成某些任务,具体下来,是通过调用操作系统上的软件来完成,让软件帮我们做事。操作系统在启动的时候,有一些必要的应用、服务等需要启动,而遵循前面讲到的简单逻辑,启动软件的必须得是操作系统上的用户。按照这个逻辑,Linux 系统为我们创建了一些系统用户,通过它们来在操作系统启动时执行相应的文件。可见系统用户是不需要登录的,也叫非登录用户,请先记住这一点。 上面讲到了用户特征码,操作系统时通过用户特征码来识别用户的。对于淫类,我们识别用户是通过用户名,因为用户名(字符串)好记。而计算机觉得数字更好记一些,于是在创建用户时系统会为其分配一个唯一的特征码,用以识别该用户,这个特征码也叫UID。同样的,用户组也有特征码,叫做GID。 Linux 系统中,UID以如下的方式划分:
4. /etc/passwd 中的字段分析/etc/passwd 中的字段分别表示如下信息(字段名字是我自己取的):
密码占位符,其值是 x,显然这不是真正的密码。真正的密码保存在哪里呢?在 /etc/shadow 文件中,此文件中保存的也不是明文密码,而是经过加密处理之后的密码。我们来看一下 /etc/shadow 中的内容(root only):
可见,/etc/shadow 中保存的也是数据表,这个表也和用户相关。还记得第二天说到的 man 命令吗?man 手册的第五个章节是特殊文件,我们来 man 一波试试:
对于 /etc/shadow 中每个字段的含义,手册中都给出了说明,我们可以去参考(这里只给出了一部分截图)。同理,对于 /etc/passwd,我们也可以通过 man 5 passwd 查看每一个字段表示的含义。 好了,回到 PASSWORD 字段,我们看一下 root 用户和 charley 的此项字段值,可以看到此值中有一些规律可循:
我们可以通过此字段来获取如下信息:
既然谈到了加密和盐值,我们来复习一下关于加密的基础知识。我们通常用到的加密方式有一下几种:
5.useradd 命令:添加用户说了那么多,终于来点真格的了,Linux 中使用 useradd 命令添加一个用户。这个命令很简单,简单到只使用 useradd USERNAME 就可以添加一个用户。 我们新建一个用户 MIKE,然后查看 /etc/passwd 中的对应内容:
在 /etc/passwd 的最后一行,我们看到了刚刚添加的用户,并且系统自动设置了用户的一些属性,比如UID,GID,HOME DIR等。我们也可以手动指定新增用户的信息:
6.userdel 命令:删除用户
7.id 命令:显示账号属性信息
8.finger 命令:检索用户信息,比使用 id 命令更加友好9.usermod 命令:修改用户信息
10.快捷命令
11.passwd
12.pwch(password check):检查密码文件的完整性,可获取一些警告信息13.groupadd 命令:添加组
13.groupmod 命令:修改组
14.groupdel 命令:删除组
15.gpasswd 命令:给组加密码
16.newgrp :临时指定基本组,下文介绍。17.给组添加密码的作用为什么需要给组添加密码呢?不妨先说一下用户的基本组,好像到现在我们还没有讲基本组的情况吧,嘿嘿。基本组很简单,Linux 规定每个用户都需要在某一个组中,因此在创建用户的时候,我们可以指定用户的基本组(默认组):useradd -g GROUPNAME USERNAME。如果我们不手动指定用户的基本组,系统会默认创建一个和当前用户名一致的组,然后将这个组设置为用户的基本组。基本组的 GID 默认和用户 UID 一致(如果不被占用的话)。 为啥用户必须要有一个组呢?因为 Linux 规定,一个文件的需要具备三种权限:文件所属主的权限,文件所属主所在组的权限,以及其他用户的权限。因此文件的所属主要是没有基本组的话,那是不是非常尴尬呢。这个问题先说到这里。 回头看一下 gpasswd 的作用,一般情况下我们是不需要为组设置密码的。现在提一个需求:在执行某项操作的时候,要使用到其他组的权限,就需要临时切换到其他组,又不想改变现有组,那么就需要使用 newgrp 命令,newgrp 命令就是用来临时切换用户基本组,注意此操作只对当前登录有效。在使用 newgrp 的时候,可能需要我们输入组密码。为什么是可能呢?因为在将额外组临时设置为用户的基本组时,是不需要密码的。只有将此前和用户毫不相关的组临时设置为基本组才会需要密码。如需还原基本组:exit 或者 logout。 18.总结本文主要介绍了 Linux 的用户管理和用户组管理,并介绍了 /etc/passwd 和 /etc/shadow 这两个和用户有关的文件。和用户组有关的文件位于 /etc/group 和 /etc/gshadow 中。此外介绍了常见的加密形式:对称加密,公钥加密和散列加密。关于用户和用户组就介绍到这里,在此基础上我们将在下篇文章中介绍 Linux 的权限管理,和本文属于同一个系列。
更多详情见请继续阅读下一页的精彩内容: http://www./Linux/2016-10/136251p2.htm
到权限了。前面讲到了 Linux 中的用户和用户主管理,其实它们的本质(或者用户和用户组出现的初衷)都是方便权限管理。权限管理对于计算机的重要性不言而喻,权限让每个用户能够安安心心的使用计算机,而不用担心别的用户破坏到自己的资源。如果老王手里有一把你家的钥匙,你是不是很蛋疼呢,如果邻居除了老王,还有老赵,老李,老张...都有你家的钥匙,你是不是更加蛋疼呢。作为多用户的 Linux 而言,权限管理至关重要。 1.Linux 文件权限的规定前文提到,Linux 规定一个文件必须要有三种权限:文件所属主权限,文件所属组所在组的权限以及其他用户的权限。通过 ll 命令可以查看目录或者单个文件的权限信息:
上面红框标注的区域,除去第一位之外,都是该文件的权限信息。第一位表示文件的类型,如目录,普通文件,链接等。权限每三个进行分组,分别表示文件所属主权限,文件所属主所在组权限和其他用户权限(我再也不想打这几个字了真的)。 2.权限的表示方式每个文件具有三种权限:读(r),写(w)和执行(x),如果没有权限用 - 表示,每个用户对某个文件的权限都是上面四种标识的排列组合:
如果使用二进制 1 和 0 分别表示有对应权限和无对应权限,上面的权限可以表示为:
机智的你也许说:这都什么鬼啊,奏凯奏凯,我觉得十进制才是淫类的标准数字语言,你能不能把它改为十进制?OK:
这总可以了吧!可是机智的你又说:总共才八个数字啊,为啥要写成十进制,不如咱们写成八进制把!:)。fine,这里我就不写了,因为将上面的十进制改成八进制结果是一样的。 现在我们知道了,所有的权限都可以使用 0~7 之间的某个八进制数字来表示,是不是比使用 r、w、x 和 - 更加方便呢。 这时,机智的你又提出了一个问题:尼玛这么多数字,每个数字都代表了不同的含义,记起来太麻烦了!关键是还可能记错啊,要知道咱们程序猿可是懒淫啊!有没有更快乐一点的方法? 我老实告诉你吧:没有!那么现在来说一下比较快乐的记忆权限数字的方法:) 如果我们提取出只读、只写、只执行以及无权限的数字,可以得到:
发现没?不管是 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。
OK,介绍完了。什么?还有个 chgrp 没说?这货其实用法和 chown 一样啦,只是只能修改所有者组而已,使用 chown 可以同时改变所有者和所有者组,因此我个人使用 chown 多一些。 5.chmod:修改文件权限chmod 修改文件权限的方式很简单:chmod MOD file1,file2...,大体的用法和 chown 一致。
个人比较喜欢最后一种方式修改权限。 6.通过修改配置文件创建用户还记得 useradd -M USERNAME 吗?这行命令用于创建一个用户,但是不创建用户的家目录。如果我们想要手动创建用户的家目录,就需要拷贝 /etc/skel 中的文件到对应的目录中,然后将该目录的权限分配给该用户。来看一下 /etc/skel 中的内容:
框起来的部分就是我们在手动创建目录的时候需要复制的部分,直(shi)觉(jue)告诉我们这些文件和 bash 有关。稍后会详细解释。 另外我们知道,/etc/passwd 和 /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 和非登录式 Shell 最主要的区别在于登录时读取配置文件的方式不同。配置文件有两种,一种是全局配置文件,一种是个人配置文件。顾名思义,全局配置文件对所有用户生效,个人配置文件只对特定用户生效。全局配置文件存放在 /etc 中,个人配置文件存放在 ~ 中,当然 /etc/skel 中也存在一份,新建用户时都会默认从 /etc/skel 中复制配置文件到自身的家目录,因此所有用户默认的配置文件是相同的。 全局配置文件:
个人配置文件:
可见配置文件分为两大阵营:profile 阵营和 bashrc 阵营。来看看它们分别起到的作用: 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./Linux/2016-10/136251.htm |
|
来自: lkwenp2lm7anyq > 《Linux》