其实说真的,这些基础挺枯燥的,内容呢绝大多数都是些静态的。

上一篇文章我们学习了基本的指令和vim编辑器的操作方法。这篇文章我们主要来学习下Linux中用户的概念和权限相关的知识。

一、用户与用户组

其实在Windows中也有用户的概念,比如管理员和访客,只是在Windows这种操作界面系统中,用户的概念给人的感觉十分弱化,没有那么显眼。但是在Linux中却是十分重要的。试想一下,可能会有很多人操作同一台服务器。那么就需要区分使用者,以分配不同的权限。否则,所有用户都可以通过rm -rf命令删除所有文件。这肯定是一场灾难。

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。每个用户账号都拥有一个唯一的用户名和各自的口令。用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。使用操作系统的人,都算是用户,更具体的来说,登录操作系统的账号都是用户。而用户组,就是拥有相同系统权限的一组用户。

下面,我们先来看下与账号有关的系统文件。

1、配置文件

1.1 /etc/group,用户组的所有信息都存放在该文件里

  • root组编号是0
  • 1-499是系统预留的编号,预留给安装的软件和服务的
  • 用户手动创建的用户组从500开始
  • 组密码占位符都是x
  • 如果组内只有一个用户,而且用户名和组名相同的话,是可以省略用户名的

存储当前系统中,所有用户组的信息,看一下里面的内容是这样的:

上图只是文件中的部分数据,那该文件中的数据是什么意思呢。三个冒号,分割出四个部分。既:组名:口令:组标识号:组内用户列表

我们以上图中的mail:x:12:exim为例:

  含义
mail 组的名称
x 密码占位符
12 组编号
exim 组中用户名列表

1.2 /etc/gshadow

是/etc/group的加密资讯文件,比如用户组(Group)管理密码就是存放在这个文件。/etc/gshadow和/etc/group是互补的两个文件;对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。

用于存放当前系统中用户组的密码信息,和/etc/group中的记录一一对应。

跟/etc/group中的分割方式一样,介绍下都是什么意思,以上图中的mail:::exim为例:

mail 组的名称
  组密码,*为空
  组管理者,为空表示都可以管理这个组
exim 组中用户名列表

1.3 /etc/passwd

Linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行,它记录了这个用户的一些基本属性。这个文件对所有用户都是可读的。

这个信息就有点多了,既:用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell,还是以最后一个mail为例:

  含义
mail 用户名
x 密码占位符
8 用户编号
12 用户组编号
mail 用户注释信息
/var/spool/mail 用户主目录
/sbin/nologin shell类型

1.4 /etc/shadow

该文件中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生

它的文件格式与/etc/passwd类似,由若干个字段组成,字段之间用":"隔开,既:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志。这些字段是:

  含义
root 用户名
password 单向加密后的密码
17982 修改日期,这个是表明上一次修改密码的日期与1970-1-1相距的天数密码不可改的天数:假如这个数字是8,则8天内不可改密码,如果是0,则随时可以改
0 这个是表明上一次修改密码的日期与1970-1-1相距的天数密码不可改的天数:假如这个数字是8,则8天内不可改密码,如果是0,则随时可以改
99999 如果是99999则永远不用改。如果是其其他数字比如12345,那么必须在距离1970-1-1的12345天内修改密码,否则密码失效
7 修改期限前N天发出警告
  密码过期的宽限天数
  帐号失效日期
  保留:被保留项,暂时还没有被用上

2、用户命令

  1. whoami,显示登录的用户名
  2. id [student],比如id root,显示指定用户信息,包括用户编号,组编号等。
  3. groups [student],比如 groups root,显示root用户所在的所有组。

3、用户和用户组操作

  1. useradd [选项] [用户名],添加新的用户账号。
  2. userdel [选项] [用户名],删除已有的用户账号。
    • -r,把用户的主目录一起删除
  3. usermod [选项] [用户名],根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。
    • -d,指定个人文件夹
  4. groupadd [选项] [用户组],增加一个新的用户组。
    • -g,指定新建用户组的标识号
  5. groupdel [用户组名],删除一个已创建的用户组。
  6. groupmod [选项] [用户组名],修改用户组的属性。
    • -n,将用户组的名字改为新名字
    • -g,GID 为用户组指定新的组标识号

我们了解了用户组的增删改的相关命令,实际上,这些命令就是操作了本篇文章开始时所介绍的那些文件。那么接下来,我们来实践一下:

首先我们先创建一个用户:

直接执行useradd zaking,然后我们再添加一遍已经添加过得用户名:

系统会告诉你,已经存在了,无法再创建。并且,在/home里,我们也可以看到,系统在新建用户的同时,也为我们在/home目录下创建了对应用户名的文件夹:

ok,那我们是不是可以用这个用户来登录了呢?就一个用户名,我他妈咋登录服务器?你他妈逗我?别急,咱们慢慢来……

我们来执行以下passwd [用户名]命令,开创建刚才用户的密码,密码的输入是隐藏模式,就像这样:

然后,我们就可以试着登录了,就跟我们登录root账号一样,输入刚才新创建的账号密码就可以进到服务器里面了:

ok,我们创建好了一个新账号。但是我们看到:

它自己的home/zaking目录有用户权限,但是没有用户组权限。所以我们新增一个用户组:

这样我们就新建了一个用户组,但是我们怎么确定这个用户组新建成功了呢?

我们看到,文件的最后,就有我们刚才新建的用户和用户组。

那我想把zaking用户分配给zakingroup用户组要怎么办呢?

通过这个命令就可以把用户添加到你想要添加的用户组,但是这里强调一点实际上,用户组添加用户的操作也因不同的选项会产生不同的结果,要注意更深入的学习。那么下面,我们就可以通过 groups [用户名],来查看用户所属的用户组:

既然用户和用户组都已经创建好了,那么我们看看怎么把它们都删除了。我们先来删除用户组:

诶?竟然不让删,为啥?上面报错的意思是:无法移除zaking用户的主组。其实这里不让删的原因跟我们之前使用的把用户添加到用户组的命令有关,但这里不多说,多说就太多了。我们需要先把zaking用户从zakingroup用户组移除。其实在我们创建zaking用户的时候,它默认有一个组就是它自己,还记得我们查看/etc/group最后面的那两条数据么?当我们通过命令把zaking移入zakingroup时,当时的命令实际上是切换了主组。所以我们现在这样是删不了的。


所以,我们可以尝试先把用户删除了。

看到没?它说zaking这个组没有删除,注意不是用户,而是组。那我们再来看下/etc/group这个文件:

我们看到这两个组还在这:

看到了吗,找不到这个用户了。我们再试下登录,发现登录不上了。但是我们看一下home目录:

zaking这个文件夹还在,之前的命令有说明怎么把这个目录也一起删了,这里我不试了,自己去试一下哦。

然后,接下来我们该删除zaking和zakingroup用户组了:

没了吧,很简单。简单的实践就到这里了,下面我们再来学习下linux权限相关的内容。

二、权限

1、文件权限

 1.1文件基本权限

之前第一篇有简单聊过文件权限问题,今天咱们再来简单地复习下文件权限相关的内容,并且学习如何修改权限。

看上图的红框部分,就是文件相应权限的说明:

- rw- r-- r--
文件类型 所有者 所属组 其他人

文件的类型基本上有三种:

  • -,指文件
  • d,只目录/文件夹
  • l,软链接

之前也说过了,英文字母的意思分别是r:read、读,w:write、写,x:excute、执行。这个都没啥好说的,静态知识,死记硬背就好了。额外的,之前的说过权限数字,在强调一遍吧。r:4,w:2,x:1。

1.2基本权限的修改

那现在我们来看下权限相关的命令。

  1. chmod [选项] [模式] 文件名,修改用户对文件的权限。

    • 选项:-R,递归
    • 模式:[ugoa][+-=][rwx],u代表当前用户,g代表所属组,o代表其他人,a代表所有人。
  2. chown [用户名] [文件名],设置文件所有者和文件关联组的命令,比如:如果想让一个用户拥有7权限,可以把这个文件的所有者改成这个用户名,chown zaking folder。
  3. chgrp [组名] [文件名],用于变更文件或目录的所属组。

1.3权限的作用

这部分是比较重要的。首先,对于文件来说,最高权限是x。对于目录来说,最高权限是w,只有读权限没有意义,对目录有了写权限,里面可以做任何事情。

我们来看个表格,说明文件和目录的一些细微的区别:

  r  w x
文件 读取文件内容 编辑、新增、修改文件内容,不能删除文件,除非对目录有写的权限 可执行
目录 可以查看目录下的文件名 具有修改目录结构的权限。如新建、删除和重命名此目录下的文件和目录。 进入目录

2、默认权限

1.umask

啥意思呢?首先,umask是查看默认权限的意思,其中第一位的0是文件特殊权限,后面的三位022就是文件默认权限。那022是啥意思呢?022是文件默认的权限掩码。首先,默认的完整权限是777对吧,777 - 022 = 755。就是文件的默认权限,755啥意思不用我多说了吧。

其次,文件默认不能建立可执行文件,必须手动赋予执行权限。文件默认的最大权限是666,也就是4+2,就是读和写的权限。建立文件后的默认权限,为666减去umask值。那么同理,目录默认最大权限是777,建立目录之后的初始权限就是777减去umask值。

最后,我们可以临时修改umask值,通过umask 0000,这样的命令来修改,如果想要永久修改需要修改/etc/profile文件内的值。

2.sudo权限

sudo可以把本身只有超级管理员可以使用的命令赋予普通用户来使用。sudo操作的对象是系统命令。

另外可以通过visudo可以赋权给用户,实际上修改的是/etc/sudoers文件。命令必须写绝对路径。

以下是/etc/sudoers文件的部分内容:

root    ALL=(ALL) ALL
用户名 被管理主机地址=(可使用的身份) 授权命令(绝对路径) stu2 ALL=(root) ALL //新增加用户行

那么下面,按照惯例,我们就来实践一下吧:

还记得之前创建用户及赋予密码的方式不?我们现在来创建一个用户。这里不多说,如果不知道怎么创建的回头去看一下哦。用户名叫做zakingwong。

ok,我们现在创建了一个叫做zakingwong的用户,并且我们给了它密码。然后我们先用这个账号密码登录进我们的服务器:

这是zakingwong的umask。

这是root的umask。

那还记得我们之前说过的,umask所代表的含义和umask的作用不?这里咱们再简单回顾一下:umask是用户默认权限的“补码”,对于文件来说,完整的默认权限是666,咋不是777?记得我们之前说过,文件默认是不会有执行权限的,执行的权限一定是后期赋予的,所以文件的默认权限就是666。那么目录完整的默认权限就是777。所以,根据上面我们查询出来的umask值,我们可以分别用root和zakingwong账户来分别创建一个文件和目录,看看是不是跟我们说的一样,哦对了,这里还得说一下,umask是默认权限的补码,至于怎么计算权限值,如果你不知道的话,请返回顶部,从头看找一下。

这是root创建文件和目录的结果,这里我不说,自己去算一下。我心算了一下是对的噢。我们再来看下刚才我们创建的zakingwong是不是这样:

诶?卧槽?这好像有点不对劲啊?恩,这里要解释的东西有点多,大家注意一下。首先,zakingwong没有操作其他属于root的权限,除非root赋予zakingwong权限。并且这里root是超级管理员,在第一篇文章我们解释基本的命令行含义的时候说过,提示符#是超级用户,$就是普通用户,普通用户只有操作家目录的权限。所以我们看到,在系统根目录/下,zakingwong是没有权限创建目录的,所以我们进入到属于zakingwong的家目录下,分别创建了demo目录和test.j文件。这里,我们也可以算一下,用户的默认权限也是没问题的。

那,现在,我想要更改zakingwong的home目录下,所创建的demo目录和test.js文件的权限,怎么办呢?其实只需要在zakingwong用户下,进行相应的权限赋予操作即可,注意,这时使用的用户是zakingwong,并不是root,现在的操作跟root还没关系呢。

看到没,这样就赋予了所有的权限,test.js也是同理:

至于chmod命令下的其他模式,大家自己去试一下哦,这里多说无益,只是重复操作。

现在,zakingwong只能在自己的home目录下随便玩,我希望zakingwong也可以操作根目录怎么办呢?第一,我们可以改变该文件的所有者,也就是上面说过的chown命令,但是这里你要知道的是,更改了所有者,之前的root就用不了,其他众多的用户也用不了。所以,在这种情况下,个人觉得,更合适的操作室给用户增加具有权限的组,这里要尤其注意一下。咱们之前给zaking增加组的时候,实际上不是增加,而是更改主组。也就是把zaking从A组移动到了B组,移动之后,zaking就只属于B组,跟A组就没关系了。但是,我们这里要做的,是给zakingwong,增加组,而不是修改组。

首先,我们得新建一个组:

然后,我们把用户zakingwong,添加进这个用户组,注意是添加,不是修改主组:

这样,我们就添加好了。那么接下来我们可以修改/demo目录的所属组:

这样就修改好了,然后我们试下,使用zakingwong账户,能不能操作/demo。

卧槽?还是不行?为啥,我不是更改组了么?咱们细心一点,没错,你更改/demo文件的所属组了,但是,但是!这个组没有修改该文件权限,具体如上图红框标识。对吧?所以,接下来,我们要赋予zakingwongroup这个组的w权限。

额……额?抱歉,zakingwong账户怎么会有权限,我们得用root账户。

好了......嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿,我们接下来做一件大事,大家一直想做却又没权限做的事情。删库!

我们看到,通过rm -rf命令,zakingwong账号对demo目录里的内容具有了完整的权限,但是却不能删除demo目录,因为它的所有者并不是zakingwong,那为了完成我们伟大的删库梦想,把所有者改成zakingwong不就可以了嘛?我们来试试:

注意上面两个图账号不一样哦,然后我们现在用zakingwong账号操作一下试试:

还是不行……哎。。。删库的梦想终究还是没有实现。

由于才疏学浅,我毕竟也是刚学嘛,个人猜测,这里我们虽然赋予/demo至高权限,但是这个权限的范围是该文件夹内部,并不包含该目录自身。所以,哪怕赋予普通用户再高的权限,也是无法删除root在根目录下创建的文件夹的。只有root可以。当然,这只是个人猜测,也可能是我的操作或者某一个环节出了问题,这里不再深究。如后续的学习中发现问题,会回来勘误。也竭诚欢迎各位大佬给予建议。

好了,在删库的动力支撑下,我们结束了本篇用户与权限的相关内容,接下来我们一起来学习下shell。

《前端运维》一、Linux基础--02用户与权限的更多相关文章

  1. 运维之Linux基础(二)

    运维之Linux基础(二) 1. file 命令基期用法 2. 文件系统 Linux的文件系统结构是树状结构,所有的文件都在/root跟目录下 /boot:系统启动相关的文件, 如:内核.initrd ...

  2. 运维之linux基础知识(一)

    运维之linux基础知识(一) 1.GUI:Graphic User Interface 图形用户界面 2.CLI:Command line Interface 命令行界面 3 dll:Dynamic ...

  3. 运维之Linux基础知识(三)

    运维之Linux基础知识(三) 1. 查看文本 cat tac more less head tail 1.1 cat 连接并显示文件 cat -n:在显示的时候,将每一行编号 -E:显示结束符$ - ...

  4. linux 基础二---用户群租权限

    用户&群组&权限 一.用户 1.用户及passwd文件 1) 掌握/etc/passwd文件的功能:存储所有用户的相关信息,该文件也被称为用户信息数据库(Database). 2) / ...

  5. IT运维的五大基础知识

    IT运维的五大基础知识 | 浏览:331 | 更新:2014-09-25 11:36 IT运维对于很多企业都很重要,接下来运维的一些基础知识天天客服IT运维总监龙少文,就给大家介绍下IT运维的基础知识 ...

  6. 自动化运维工具-Ansible基础

    目录 自动化运维工具-Ansible基础 什么是Ansible 同类型软件对比 Ansible的功能及优点 Ansible的架构 Ansible的执行流程 安装Ansible ansible配置文件 ...

  7. 【Linux 运维】Linux 目录

    目录 [Linux 运维]Centos7初始化网络配置 [Linux 运维]linux系统修改主机名 [Linux 运维]linux系统关机.重启.注销命令 [Linux 运维]linux系统查看版本 ...

  8. 《前端运维》一、Linux基础--07Shell函数

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.shell中函数的定义格式如下: [ function ] funname [()] { action; [return ...

  9. 运维 07 Linux系统基础优化及常用命令

    Linux系统基础优化及常用命令   Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令 ...

随机推荐

  1. Java中的面向切面编程(AOP)

    一.什么是AOP? Aspect Oriented Programming ,即面向切面编程. AOP是对面向对象编程的一个补充. 它的目的是将复杂的需求分解为不同的切面,将散布在系统中的公共功能集中 ...

  2. 【PHP】用了这么久的Laravel框架,你分析过核心架构了没

    Laravel最初的设计是为了面向MVC架构的,它可以满足如事件处理.用户身份验证等各种需求.另外它还有一个由管理数据库强力支持,用于管理模块化和可扩展性代码的软件包管理器. Laravel以其简洁. ...

  3. OO第三单元——基于JML的社交网络总结

    OO第三单元--基于JML的社交网络总结 一.JML知识梳理 1)JML的语言基础以及基本语法 JML是用于java程序进行规格化设计的一种表示语言,是一种行为接口规格语言.其为严格的程序设计提供了一 ...

  4. 2020-BUAA-OO-面向对象设计与构造-第四单元总结&课程总结

    咱的OO结束辣! Part1: Unit4 Summary 本单元作业,我主要使用了适配器模式和访问者模式.总体上看,代码量和文件数量有所上升,但配合分包等措施后,文件结构清晰,各部分耦合度均较低.缺 ...

  5. Java(133-151)【String类、static、Arrays类、Math类】

    1.字符串概述和特点 string在lang包里面,因此可以直接使用 字符串的内容不可变 2.字符串的构造方法和直接创建 三种构造方法 package cn.itcast.day08.demo01; ...

  6. Lucas(卢卡斯)定理

    Lucas(卢卡斯)定理 定义 若 \(p\) 为质数,且\(a\ge b\ge1\),则有: \[C_{a}^{b}\equiv C_{a/p}^{b/p}\cdot C_{a (mod\,p)}^ ...

  7. kubernetes 的负载均衡策略

    Kubernetes提供了两种负载分发策略: RoundRobin和SessionAffinity ◎ RoundRobin:轮询模式,即轮询将请求转发到后端的各个Pod上. ◎ SessionAff ...

  8. 前端DDD总结与思考

    软件开发架构演化与DDD起源 单体服务架构:大概10年前,我在武汉工作的时候,甲方客户购买我们的产品,一般都是连着设备一起购买,一套软件系统,一台惠普或者戴尔的企业级服务器,再加一个黑色的铁盒,销售部 ...

  9. java面试一日一题:讲下在什么情况下会发生类加载

    问题:请讲下在什么情况下会发生类加载? 分析:该问题主要考察对java中类加载的知识,什么是类加载,为什么会发生类加载,什么情况下发生类加载? 回答要点: 主要从以下几点去考虑 1.什么是类加载: 2 ...

  10. 一键打造vim ide 支持python golang shell等高级特性

    1.vim-for-devops github: https://github.com/yxxhero/vim_for_devops 利用vim插件打造支持python.shell.golang的id ...