用户类型UID权限作用root超等管理员用户0最高权限虚拟用户(傀儡用户)1-999在运行程序的时间必须利用一个用户在实行,而且用户不需要登录操纵系统普通用户1000-65535登录操纵系统利用的用户 1. 设置文件先容
在Linux系统中创建、添加、删除用户和用户组,现实上都是修改系统上对应的文件。和用户用户组直接相关的文件主要有:/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow这四个文件。
1.1 用户相关的设置文件
- /etc/passwd #<==存储用户信息的文件。
- /etc/shadow #<==存储用户密码信息的文件。
- # 命令行执行命令
- useradd newuser # 添加用户实际上就是修改上述两个文件,/etc/passwd、/etc/shadow
- passwd newuser # 设置修改密码实际上就是修改密码所在的文件,/etc/shadow
复制代码 存储用户信息文件
/etc/passwd 文件是Linux系统中的重要系统文件之一,主要作用是存储系统用户的信息。文件中的每一行表示一个用户信息,有多少行就表示有多少个用户信息。
仔细观察其中的一行,可以看出各行内容之间通过引号“:”划分为多个字段,共7部门,分别界说了用户的不同属性,这里利用head下令查看/etc/passwd 文件的前5行表现:
- [root@localhost ~]# head -5 /etc/passwd # <==通过head命令查看/etc/passwd的前5行。
- root:x:0:0:root:/root:/bin/bash
- bin:x:1:1:bin:/bin:/sbin/nologin
- daemon:x:2:2:daemon:/sbin:/sbin/nologin
- adm:x:3:4:adm:/var/adm:/sbin/nologin
- lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
- ...省略其他...
复制代码 提示:在passwd文件中有许多虚拟用户,比如bin、daemon等,一般来说,这些用户都是系统正常运行所需要的,在不确定的环境下,请不要随意编削此类用户。
在passwd文件中,第一行的内容就是超等用户root所在的行,我们可以看到它的UID和GID都为0,为了让读者可以或许清晰地了解passwd文件中内容的寄义,列举了下表,以供参考。
- 以passwd文件中root一行为例先容各个字段的作用
root:x:0:0:root:/root:/bin/bash用户名:用户密码:用户UID:用户组GID:用户说明:用户家目录:shell表明器
字段名称注释说明用户名与用户UID相对应,这是用户登录时利用的用户名称,在系统中是唯一的,不能重名用户密码早期的Unix系统中,该字段是用于存放用户密码的,基于安全原因,后来将这个密码字段的内容移到/etc/shadow文件中了。从这个位置可以看到一个字母x,表示该用户的密码是保护在/etc/shadow文件中的用户UID用户UID一般是由一个整数来表示的,默认范围是0~60000,最大可以到65535。用户组GID用户GID一般也是由一个整数来表示的,范围、最大值与用户UID相同,添加用户时,默认环境下会同时创建一个与用户同名且ID相同的组用户说明对用户的描述说明,可以为空用户家目录用户登录后默认进入的目录,一般为“/home/用户名”这样的目录shell表明器当前用户登录后所利用的表明器。在 CentOS/Red Hat等主流Linux系统中,默认的表明器为bash。
假如不希望用户登录系统,那么可以通过usermod或者手工修改passwd设置,将表明器类型改为/sbin/nologin即可。假如你仔细查看passwd文件,会发现大部门内置系统的虚拟用户的这个字段都是/sbin/nologin,表示禁止登录系统,这是出于安全考虑进行的设置
- [root@localhost ~]# ls -l /etc/passwd
- -rw-r--r--. 1 root root 1214 Apr 30 20:41 /etc/passwd # 所有用户都有读的权限。
复制代码 由于每个用户登录时都需要取得UID与GID来判定权限,以是/etc/passwd文件的权限为644,但这样一来就会带来安全问题,即所有的用户都可以读/etc/passwd文件。即使文件内的密码是加密的,也照旧存在肯定的被攻击破解的安全隐患。因此,后来就将密码的信息移动到/etc/shadow文件了。
存储用户密码信息的文件
由于passwd文件必须要被所有的用户读取,以是会带来安全隐患。而shadow文件就是为了解决这个安全隐患而增加的。下面我们来看一下/etc/shadow文件的权限:
- [root@localhost ~]# ls -l /etc/shadow
- ---------- 1 root root 681 Mar 30 08:59 /etc/shadow # 理论上所有用户都没有权限。
复制代码 查看/etc/shadow文件权限,发现所有用户均不可读(root用户除外),其文件具体内容是:
- [root@localhost ~]# head -5 /etc/shadow # 通过head命令查看/etc/shadow的前5行。
- root:$6$xTyEY0ruiSVt6yVU$DDkAYnnhWdX3Ks0zH4ENQHmN35/2SB7Hrt9MdDYi7W9zoyvFLxgRT73tdRptiKvZedoVdRD9CBzCKWYYnhdxQ/:17598:0:99999:7::: # 一长串特殊字符是设置了密码以后加密的数据信息。
- bin:*:17246:0:99999:7:::
- daemon:*:17246:0:99999:7:::
- adm:*:17246:0:99999:7:::
- lp:*:17246:0:99999:7:::
复制代码 和/etc/passwd文件雷同,/etc/shadow文件中的每一行内容也是以冒号(:)作为分隔符的,共九个字段,内容如下:
字段名称注释说明用户名用户名称用户密码密码加密后的字符串最近修改密码的时间从1970年1月1日起,到用户最近一次更改密码的天数禁止修改密码的天数从1970年1月1日起,到用户可以更改密码的天数用户必须修改密码的天数从1970年1月1日起,到用户必须更改密码的天数警告修改密码的期限在用户密码过期之前多少天提醒用户更改密码不活动时间在用户密码过期之后到禁用账户的天数失效时间从1970年1月1日起,到用户被禁用的天数标志保留
利用 useradd 下令添加用户会相应更改/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow。
利用 passwd 下令为用户设置密码会更改/etc/shadow。
1.2 用户组相关设置文件
- /etc/group #<==用户组信息文件。
- /etc/gshadow #<==用户组密码信息文件。
- useradd newuser # 添加用户实际上也会修改上述两个文件(因为会创建同名用户组)
- groupadd newuser # 添加用户实际上就是修改上述两个文件
复制代码 用户组信息文件
/etc/group 文件是存储用户组相关信息的文件,内容包含用户组名称、用户组GID等属性。/etc/group 文件同/etc/passwd文件的权限相同,也是644,示例如下:
- [root@localhost ~]# ls -l /etc/group
- -rw-r--r--. 1 root root 652 Apr 30 20:42 /etc/group
复制代码 /etc/group 文件的现实内容格式为:
- [root@localhost ~]# head -5 /etc/group
- root:x:0:
- bin:x:1:bin,daemon
- daemon:x:2:bin,daemon
- sys:x:3:bin,adm
- adm:x:4:adm,daemon
- ...省略部分...
复制代码 group文件各个字段的说明
字段名称注释说明用户组名用户组的名称用户组密码通常不需要设置该密码,基于安全原因,该密码被记录在/etc/gshadow中,因此,表现为“x”。这有点雷同于/etc/shadowGID用户组的ID用户构成员加入这个组的所有用户(附加构成员,即用“-G”加入的成员) 提示:
利用groupadd下令添加用户组会更改/etc/group、/etc/gshadow。
存储用户组密码的文件
/etc/gshadow是存储用户组密码信息的文件。比如,用户组管理密码就存放在这个文件中。/etc/gshadow和/etc/group是两个互补的文件;早期对于大型服务器,针对许多用户和用户组,定制一些关系布局比较复杂的权限模子,可以选择设置用户组密码。比如,假如不想让一些非用户构成员永世拥有用户组的权限和特性,那么可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码了。
在现实运维工作中,一般是用不到这个功能的。
/etc/gshadow文件权限及内容格式如下,每个用户组独占一行:
- [root@localhost ~]# ls -l /etc/gshadow
- ----------. 1 root root 530 Apr 30 20:42 /etc/gshadow
- [root@localhost ~]# head -5 /etc/gshadow
- root:::
- bin:::bin,daemon
- daemon:::bin,daemon
- sys:::bin,adm
- adm:::adm,daemon
- ...省略部分...
复制代码 gshadow文件中每一行各个字段的具体说明:
字段名称注释说明用户组名用户组的名称用户组密码这个段可以是空的或“!”,假如是空的或有“! ”,则表示没有密码用户组管理员用户用户组管理者,这个字段也可以为空,假如存在多个用户组管理者,则用“,”号进行分割用户构成员加入这个组的所有用户,列表中多个用户之间可通过“,”进行分隔 2. 下令先容
2.1 用户管理的常见下令
下令注释说明用户直接相关的下令useradd添加用户usermod修改用户信息userdel删除用户及与用户相关联的设置或文件用户密码直接相关的下令passwd为用户设置或修改密码chpasswd批量更新用户密码chage修改用户密码属性信息与其他用户相关的下令id查看用户的UID、GID及所归属的用户组信息su切换用户角色工具sudo以一个其他用户身份(主要是root 用户))实行下令的工具,普通用户用来提权的重要工具visudo用于编辑suders设置文件( sudo授权文件)的工具 有关用户组管理的常见下令汇总
下令注释说明groupadd添加用户组groupdel删除用户组groupmod修改用户组信息gpasswd为用户组设置密码groups表现用户所属的用户组newgrp更改用户所属的有用用户组 2.2 添加用户下令useradd
useradd下令的工作原理
当不带任何参数利用useradd下令添加用户时,起首会读取设置文件/etc/login.defs和/etc/default/useradd中预先界说的规则,并且根据设置的规则添加用户,同时向 /etc/passwd 和 /etc/group 文件内添加新建的用户和用户组记录。系统还会根据 /etc/login.defs 和 /etc/default/useradd 文件中的设置信息创建用户的家目录,并且复制/etc/skel 中的隐蔽环境设置文件到新用户的家目录中,以完成对用户环境的初始化设置。
1)与创建用户相关的文件/etc/login.defs
/etc/login.defs文件的作用是预先界说创建用户时需要的一些用户默认设置信息。如创建用户时,是否需要家目录,以及UID和GID的取值起始值及取值范围,用户及密码的有用期限等,完整功能参考/etc/logins.defs文件的内容及注释说明:
- [root@localhost ~]# cat /etc/login.defs
- ...忽略若干注释行...
- # *REQUIRED*
- # Directory where mailboxes reside, _or_ name of file, relative to the
- # home directory. If you _do_ define both, MAIL_DIR takes precedence.
- # QMAIL_DIR is for Qmail
- #QMAIL_DIR Maildir
- MAIL_DIR /var/spool/mail #<==设定用户对应的mail文件所在的路径。
- #MAIL_FILE .mail
- # Password aging controls:
- ...忽略若干注释行...
- PASS_MAX_DAYS 99999 #<==密码最长可以使用的天数。
- PASS_MIN_DAYS 0 #<==更换密码的最小天数。
- PASS_MIN_LEN 5 #<==密码的最小长度。
- PASS_WARN_AGE 7 #<==密码失效之前提前多少天开始警告。
- # Min/max values for automatic uid selection in useradd
- UID_MIN 1000 #<==默认最小UID为1000,也就是说添加用户时,UID是从1000开始的。
- UID_MAX 60000 #<==默认最大UID为60000。
- # System accounts
- SYS_UID_MIN 201
- SYS_UID_MAX 999
- # Min/max values for automatic gid selection in groupadd
- GID_MIN 1000 #<==默认最小GID为1000,也就是说添加用户时,GID是从1000开始的。
- GID_MAX 60000 #<==默认最大GID为60000。
- # System accounts
- SYS_GID_MIN 201
- SYS_GID_MAX 999
- # If defined, this command is run when removing a user.
- # It should remove any at/cron/print jobs etc. owned by
- # the user to be removed (passed as the first argument).
- #USERDEL_CMD /usr/sbin/userdel_local #<==删除用户时,删除与用户相关的所有工作,默认关闭。
- # If useradd should create home directories for users by default
- # On RH systems, we do. This option is overridden with the -m flag on
- # useradd command line.
- CREATE_HOME yes #<==是否创建用户家目录,默认要求创建;可以用-m参数进行控制。
- # The permission mask is initialized to this value. If not specified,
- # the permission mask will be initialized to 022.
- UMASK 077 #<==家目录对应umask默认值。
- # This enables userdel to remove user groups if no members exist.
- #
- USERGROUPS_ENAB yes #<==删除用户同时删除用户组(如果用户组没有其他成员,则删除)。
-
- # Use SHA512 to encrypt password.
- ENCRYPT_METHOD SHA512 #<==密码加密算法SHA512。
复制代码 2)与创建用户相关的文件/etc/default/useradd
/etc/default/useradd文件是在利用useradd添加用户时预先加载的默认用户信息设置文件,可以利用“useradd-D参数”修改此文件的设置,固然,也可以直接利用vim编辑器来修改文件里面的内容,下面就来看看它的内容,具体如下:
- [root@localhost ~]# cat /etc/default/useradd
- # useradd defaults file
- GROUP=100 #<==依赖于/etc/login.defs的USERGROUPS_ENAB参数,如果为no,则此处控制。
- HOME=/home #<==在/home目录下创建用户的家目录。
- INACTIVE=-1 #<==是否启用用户过期停权,-1表示不启用。
- EXPIRE= #<==用户终止日期,不设置表示不启用。
- SHELL=/bin/bash #<==新用户默认使用的Shell解释器类型。
- SKEL=/etc/skel #<==配置新用户家目录的默认环境变量文件的存放路径。当我们使用useradd添加用户时,用户家目录下的隐藏环境变量文件,都是从这里配置的/etc/skel目录中复制过去的。
- CREATE_MAIL_SPOOL=yes #<==创建mail文件。
复制代码 3)与创建用户相关的目录/etc/skel
/etc/skel目录是用来存放新用户需要的所有底子环境变量文件的目录,当添加新用户时,这个目录下的所有文件都会被主动复制到新添加的用户的家目录下;默认环境下,/etc/skel目录下的所有文件都是隐蔽文件(以点号开头的文件),通过修改、添加、删除/etc/skel目录下的环境变量文件,我们可为新创建的用户提供统一的、尺度的、定制化的初始化用户环境。
- [root@localhost ~]# ls -la /etc/skel/
- -rw-r--r--. 1 root root 18 Mar 23 2017 .bash_logout #<==用户环境变量文件,退出时加载。
- -rw-r--r--. 1 root root 176 Mar 23 2017 .bash_profile #<==用户环境变量文件,登录时加载。
- -rw-r--r--. 1 root root 124 Mar 23 2017 .bashrc #<==用户环境变量文件,登录时加载。
复制代码 问题:用户登录到Linux系统后,发现提示符为如下所示的异常环境,请问如何恢复到正常的Linux下令行提示符环境?
- -bash-4.1$
- -bash-4.1$
- # 故障原因就是,用户家目录下的环境变量不存在了。
复制代码 故障恢复方案及步骤:
- -bash-4.1$ cp /etc/skel/.bash* ~/ #<==从/etc/skel中将所有环境变量文件复制回来,注意当前用户。
- -bash-4.1$ logout #<==可以按快捷键(Ctrl+D),退出当前环境。
- [root@localhost ~]# su - test #<==重新切换到test用户下。
- [test@localhost ~]$ #<==故障排除了。
复制代码 useradd下令的常用参数先容
参数选项注释说明-c设置新用户在passwd文件中的说明字段的信息-d新用户每次登录时利用的家目录-e用户制止日期,日期指定格式为MM/DD/YY-f用户过期几日后永世停权。当值为0时用户立刻被停权。而当值为-1时表示关闭此功能,预设值为-1-g指定新用户所属的用户组ID,即GID。用户组名需为系统现存的名称-G将新用户指定为多个不同用户组的成员。每个用户组均利用“,”(逗号)进行分隔。用户组名同“-g”选项的限制。默认值为用户的起始用户组-m假如家目录不存在,则创建并指定用户家目录-M不创建用户家目录,其优先于/etc/login.defs文件的设定。一般创建虚拟用户时不创建家目录,摆设网络服务时需要创建虚拟用户-n默认环境下,用户的用户组与用户的名称是相同的。假如添加了-n参数,就不会生成与用户同名的用户组了-s用户登入后利用的表明器名称,默认为bash-u指定用户ID值,即所谓的UID useradd下令利用
- # 语法结构:
- useradd 参数选项 用户名称
- # 一次只能创建一个用户
- # 案例1.创建test用户,不加任何参数
- 1.默认UID GID按照passwd中的编号顺延
- 2.默认创建家目录
- 3.默认允许登录,默认创建的就是普通用户
- [root@localocal ~]# useradd test
- # 过滤passwd中是否存在test用户
- [root@localhost ~]# grep test /etc/passwd
- test:x:1003:1003::/home/test:/bin/bash
- # 案例2.创建虚拟用户test01 不创建家目录 不允许登录操作系统
- [root@localhost ~]# useradd -M -s /sbin/nologin test01
- [root@localhost ~]# grep test01 /etc/passwd
- test01:x:1004:1004::/home/test01:/sbin/nologin
- # 案例3.创建虚拟用户test02 指定UID666 GID666 不创建家目录 不允许登录,如果指定GID,必须先创建组,然后再创建用户指定小组的id号
- [root@localhost ~]# useradd -u666 -g666 -M -s /sbin/nologin test02
- useradd: group '666' does not exist
- # 因为GID666不存在,指定GID的话需要GID已存在
- # 所以需要先创建组
- [root@localhost ~]# groupadd -g666 test02
- # 再创建用户
- [root@localhost ~]# useradd -u666 -g666 -M -s /sbin/nologin test02
- [root@localhost ~]# grep test02 /etc/passwd
- test02:x:666:666::/home/test02:/sbin/nologin
- # 如果指定UID不指定gid,小组会自动创建gid会顺延
- [root@localhost ~]# useradd -u666 -M -s /sbin/nologin test03
- [root@localhost ~]# grep test03 /etc/passwd
- test03:x:666:1005::/home/test03:/sbin/nologin
复制代码 2.3 用户信息修改下令usermod
usermod下令的功能非常强大,但在生产场景中其的利用频率不是许多,它不仅能更改用户的表明器类型、UID、家目录等,还能更改用户的有用期、登录名等许多与用户有关的信息。
usermod的作用是修改用户,而useradd的作用是添加用户,本质上都是对用户进行操纵,因此,这两个下令大部门的参数作用都是一样的,只不过下令不同而已,功能上的区别就是一个是添加,一个是修改。
- usermod [options] [login]
- usermod [选项] [用户名]
复制代码
参数选项注释说明-c修改用户 passwd文件中用户的说明栏,同useradd 的 -c 功能-d修改用户每次登入时所利用的家目录,同useradd 的-d功能-e修改用户制止日期,同useradd的-e功能-f修改用户过期几日后永世停权,同useradd 的-f功能-g修改与用户对应的用户组,同useradd 的 -g功能-G修改此用户为多个不同组的成员,同useradd 的-G功能-m移动内容到用户的新目录,假如不存在就不会创建,与useradd 的 -m不同-M不创建用户家目录,优先于/etc/login.defs文件设定。一般创建虚拟用户时不创建家目录,摆设应用服务时需要创建虚拟用户-n默认环境下,用户的用户组与用户的名称是相同的。假如下令添加了-n参数,则不会再生成与用户同名的用户组了-s修改用户登入后利用的Shell名称,同useradd的-s功能-u修改用户的ID值,同useradd 的-u功能-a追加用户到用户组,仅与-G参数连用-l修改用户账号名称-L锁定用户密码-U排除密码锁定- # 修改用户信息
- [root@localhost ~]# usermod -u777 test02
- [root@localhost ~]# id test02
- uid=777(test02) gid=666(test02) groups=666(test02)
复制代码 2.4 删除用户下令userdel
- userdel [options] [login]
- userdel [选项] [用户名]
复制代码
参数选项表明说明-f逼迫删除用户,即利用户当前已登录-r删除用户的同时,删除与用户相关的所有文件(常用)
- userdel下令实践
- 在生产场景中,假如不能确认用户相关的目录有没有重要数据,就不能利用-r。
- 删除用户时,先辈入vi /etc/passwd,然后注释掉用户,观察一段时间(发起1个月以上),这样若出问题还可以还原。 相当于进行操纵前备份,将登录Shell修改为/sbin/nologin。
提示:处于登录状态中的用户无法被删除。
2.5 添加用户组下令groupadd
groupadd下令的用途不大,由于useradd下令在创建用户的同时会创建与用户同名的用户组,正常环境下都可以满足创建用户组的需求。
- groupadd [options ] [group]
- groupadd [选项] [用户组]
复制代码
参数选项注释说明-g指定用户组的GID,除非接-o参数,否则ID值唯一且不为负,假如不指定-g参数,则GID 从1000开始-f新增一个账户,逼迫覆盖一个已存在的组账号 2.6 删除用户组下令groupdel
groupdel下令用于删除指定的用户组,此下令的利用频率极低,了解一下即可。
- groupdel [group]
- groupdel [用户组]
复制代码 groupdel不能删除另有用户归属的主用户组。
2.7 修改用户密码下令passwd
passwd下令可以修改用户密码及密码过期时间等内容,是工作中很常用的下令。 普通用户和超等用户都可以运行passwd下令,但普通用户只能更改自身的用户密码,超等用户root则可以设置或修改所有用户的密码。
- passwd [option] [username]
- passwd [选项] [用户名]
复制代码
参数选项表明说明-k为密码已经过期的用户更新有用期-l锁定用户,被锁定用户将不能登录。仅root用户有权利用该选项–stdin从尺度输入读取密码字符串-u排除对用户的锁定。仅root用户有权利用该选项-d删除用户的密码,使密码为空。仅root用户有权利用该选项-e利用户密码立刻过期,将在用户下次登录时逼迫用户修改密码。仅root用户有权利用该选项-n设置修改密码的最短天数。仅root用户有权利用该选项-x设置修改密码的最长天数。仅root用户有权利用该选项-w设置用户在密码过期前多少天收到警告的信息。仅 root用户有权利用该选项-i设置密码过期多少天之后禁用账户。仅root用户有权利用该选项-S表现与用户密码相关的简单描述。仅root用户有权利用该选项 root用户可以修改任何用户的密码,普通用户只能修改自身的密码。
root用户修改密码时,假如不符合系统密码规则,则会给出警告信息,但密码设置仍然有用。 而普通用户修改密码时,假如利用的是弱密码,则会给出告警信息,且修改无效。
- # 交互式:
- # 1. passwd 直接回车修改当前登录用户的密码
- # 2. passwd test # 指定修改test用户的密码
-
- [root@localhost ~]# passwd # 修改root的密码
- Changing password for user root.
- New password:
- BAD PASSWORD: The password is a palindrome
- Retype new password:
- passwd: all authentication tokens updated successfully.
- # 非交互式:
- echo 密码|passwd --stdin 用户名
- # 案例.修改test01的密码为123456
- [root@localhost ~]# echo 123456|passwd --stdin test01
- Changing password for user test01.
- passwd: all authentication tokens updated successfully.
- # 密码复杂度要求:
- [root@localhost ~]# echo "L898#23iz%henya'I{am-18"
- L898#23iz%henya'I{am-18
复制代码 【密码软件工具】
- win端密码管理工具:keepass、lastpass;
- Linux端生成随秘密码:
- # 需要安装expect
- # 使用mkpasswd自动生成密码
- [root@localhost ~]# mkpasswd
- (9lm8uPGb
- [root@localhost ~]# mkpasswd
- BJqcla05{
- [root@localhost ~]# mkpasswd
- kt[47lxYA
- # mkpasswd -l len -d 最小数字个数 -C 大写字母个数
- [root@localhost ~]# mkpasswd -l 15 -d 3 -C 5
- tqHR9sqU)T9bM0c
- [root@localhost ~]# mkpasswd -l 15 -d 3 -C 5
- I6VOlC2cdi&wuB3
- [root@localhost ~]# mkpasswd -l 15 -d 3 -C 5
复制代码 【MD5校验】
- # 1.创建一个文件
- [root@localhost ~]# echo aaaa > 1.txt
- [root@localhost ~]# cat 1.txt
- aaaa
- # 2.生成MD5校验值
- [root@localhost ~]# md5sum 1.txt
- e5828c564f71fea3a12dde8bd5d27063 1.txt
- # 修改文件后,哈希值变化了
- [root@localhost ~]# echo bbbb >> 1.txt
- [root@localhost ~]# md5sum 1.txt
- 7c438cbff62ba78d44b5b31ed043549b 1.txt
复制代码
- [root@localhost ~]# echo cccc > 2.txt
- [root@localhost ~]# ll
- total 8
- -rw-r--r-- 1 root root 10 Nov 17 15:13 1.txt
- -rw-r--r-- 1 root root 5 Nov 17 15:16 2.txt
- [root@localhost ~]# md5sum 1.txt 2.txt
- 7c438cbff62ba78d44b5b31ed043549b 1.txt
- b26795c69684a7c9cc4a94ff70a95b71 2.txt
- [root@localhost~]# find ./ -type f -name "*.txt"
- ./1.txt
- ./2.txt
- ./ceshi/test/test.txt
- [root@localhost ~]# find ./ -type f -name "*.txt"|xargs md5sum
- 7c438cbff62ba78d44b5b31ed043549b ./1.txt
- b26795c69684a7c9cc4a94ff70a95b71 ./2.txt
- e5828c564f71fea3a12dde8bd5d27063 ./ceshi/test/test.txt
复制代码 md5sum *.txt 不能找出目录下的文件;需要实现这种操纵的时间,往往利用这种方式:find ./ -type f -name "*.txt"|xargs md5sum
- 保留最原始的未被修改过的MD5校验值写入文件中,然后进行校验
- # 写入文件
- [root@localhost ~]# md5sum 1.txt 2.txt > md5.log
- [root@localhost ~]# cat md5.log
- 7c438cbff62ba78d44b5b31ed043549b 1.txt
- b26795c69684a7c9cc4a94ff70a95b71 2.txt
- # 检测校验
- [root@localhost ~]# md5sum -c md5.log
- 1.txt: OK
- 2.txt: OK
- [root@localhost ~]# ll
- total 12
- -rw-r--r-- 1 root root 10 Nov 17 15:13 1.txt
- -rw-r--r-- 1 root root 5 Nov 17 15:16 2.txt
- [root@localhost ~]# cat md5.log
- 7c438cbff62ba78d44b5b31ed043549b 1.txt
- b26795c69684a7c9cc4a94ff70a95b71 2.txt
- # 修改文件1.txt
- [root@localhost ~]# echo yyyy >> 1.txt
- [root@localhost ~]# md5sum -c md5.log
- 1.txt: FAILED
- 2.txt: OK
- md5sum: WARNING: 1 computed checksum did NOT match
复制代码
- 路径问题:为了防止在校验的时间出现找不到路径或找不到文件的问题,要求在利用md5sum进行生成哈希码的时间,文件都要利用绝对路径。
- [root@localhost ~]# find /root/ -type f -name "*.txt"
- /root/1.txt
- /root/2.txt
- /root/ceshi/test/test.txt
- [root@localhost ~]# md5sum /root/*.txt
- 68a07a8bf1b376046f63285a80426ec7 /root/1.txt
- 3c88ec828e5489c32a25514871fa8a8f /root/2.txt
- [root@localhost ~]# md5sum /root/*.txt > md5.log
- [root@localhost ~]# cat md5.log
- 68a07a8bf1b376046f63285a80426ec7 /root/1.txt
- 3c88ec828e5489c32a25514871fa8a8f /root/2.txt
- [root@localhost ~]# cat md5.log
- 68a07a8bf1b376046f63285a80426ec7 /root/1.txt
- 3c88ec828e5489c32a25514871fa8a8f /root/2.txt
- [root@localhost ~]# cd /opt/
- [root@localhost opt]# md5sum -c /root/md5.log
- /root/1.txt: OK
- /root/2.txt: OK
复制代码 由于此时都是绝对路径,以是在其他位置也可以进行文件校验。
2.8 批量更新用户的密码下令chpasswd
chpasswd下令可从尺度输入中读取肯定格式的用户名、密码来批量更新用户的密码。 这个格式为用户名:密码,留意,用户名必须事先真实存在,否则,该下令无法为一个不存在的用户设置密码。
第一步:要确保修改密码的用户存在
第二步:实行下令
- [root@localhost ~]# chpasswd #<==在命令行输入chpasswd,回车。
- root:123456 #<==格式为“用户名:密码”,用户必须事先真实存在才行。
- test:123456 #<==一行一个。
- test01:123456
- [root@localhost ~]# #<==在新的空行输入Ctrl+D结束输入。
复制代码
- [root@localhost ~]# cat user.txt #<==用户及密码字符串文件,注意格式。
- root:123456 #<==格式为“用户名:密码”,用户必须事先真实存在才行,且一行一个。
- test:123456
- test01:123456
- [root@localhost ~]# chpasswd <user.txt #<==利用输入重定向一次性为所有用户设置预先指定的密码。
复制代码 2.9 修改用户密码有用期下令chage
chage下令用于查看或修改用户密码的有用期,有些参数的功能与passwd相同。
- chage [option] [login]
- chage [选项] [用户名]
复制代码
参数选项表明说明-d设置上一次密码更改的日期-E账号过期的日期。日期格式为YYYY-MM-DD-I(大写i)设置密码过期多少天后禁用账户-l(小写L)表现账号有用期信息-m密码可更改的最小天数。默认为0,表示任何时间都可以更改密码-M密码保持有用的最大天数-W密码到期之前,提前收到警告信息的天数
- 范例:创建新用户range,要求该用户在7天之内不能更改密码,60天以后必须修改密码,过期前10天关照用户,过期30天之后禁止用户登录。
- [root@localhost ~]# useradd range #<==添加新用户range。
- [root@localhost ~]# chage -m7 -M60 -W10 -I30 range #<==使用chage按题意要求进行授权。
- [root@localhost ~]# chage -l range #<==-l参数用于查看账户的信息。
- Last password change : May 01, 2018
- #<==最后一次密码变化时间为2018-05-01,-d选项可控制该行。
- Password expires : Jun 30, 2018
- #<==密码过期时间为60天,即从2018-05-01到2018-06-30,该行受-M参数影响。
- Password inactive : Jul 30, 2018
- #<==密码停权时间,即密码过期30天后停权,-I选项可控制该行。
- Account expires : never #<==账号过期时间,-E选项可控制该行。
- Minimum number of days between password change : 7 #<==-m选项可控制该行。
- Maximum number of days between password change : 60 #<==-M选项可控制该行。
- Number of days of warning before password expires : 10 #<==-W选项可控制该行。
复制代码 2.10 用户查询相关下令
查询用户的几种常见工具id、finger、users、w、who、last、lastlog、groups的用法。
- id下令通常用来查询用户和组信息以及对应的UID、GID等信息,它的用法非常简单
- [root@localhost ~]# id test #<==查看test的用户及组相关的信息。
- uid=1002(test)gid=1002(test)groups=1002(test) #<==用户和组信息以及对应的UID、GID。
- [root@localhost ~]# id -u test #<==只查看用户UID。
- 1002
- [root@localhost ~]# id -g test #<==只查看用户组GID。
- 1002
- [root@localhost ~]# id -un test #<==只查看用户名。
- test
- [root@localhost ~]# id -gn test #<==只查看用户组名。
- test
复制代码
- whoami、who、w、last、lastlog下令
whoami下令可用于查看当前登录的用户,who和w下令的作用是表现已经登录的用户,并且展示他都做了什么的信息。 而last、lastlog下令可以查看用户更具体的登录信息,不同下令的侧重点略有差别,大家可以仔细对比下。 示例代码具体如下:
- [root@localhost ~]# whoami #<==查看当前登录的用户,比较常用。
- root
- [root@localhost ~]# w
- #<==显示已经登录的用户,并且展示他都做了什么的信息。查看的信息与/var/run/utmp文件有关,比较常用。
- 21:34:56 up 5 days, 21:31, 3 users, load average: 0.00, 0.00, 0.00
- USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
- root pts/0 10.0.0.1 09:21 0.00s 0.30s 0.07s w
- root pts/1 10.0.0.1 21:34 8.00s 0.04s 0.00s -bash
- root pts/2 10.0.0.1 21:34 14.00s 0.04s 0.00s -bash
复制代码
上面第1行的输出依次表现了当前的系统时间、系统从启动到现在已经运行的时间、登录到系统中的用户数和系统均匀负载。 均匀负载是指在1分钟、5分钟、15分钟之内系统的负载状况。
- USER:表示登录系统的用户。
- TTY:表示用户利用的TTY名称。
- FROM:表示用户从那边登录进来,一般是表现远程登录主机的IP地址或者主机名。
- LOGIN@:用户登录的日期和时间。
- IDLE:表现终端空闲时间。
- JCPU:表示该终端上的所有进程及子进程利用系统的总时间。
- PCPU:当前活动进程利用的系统时间。
- WHAT:当前用户实行的进程名称和选项。
- [root@localhost ~]# who #<==显示哪些用户正在登录,登录的终端及登录时间,来源主机,显示的信息比w少,不常用。
- root pts/0 May 1 09:21 (10.0.0.1)
- root pts/1 May 1 21:34 (10.0.0.1)
- root pts/2 May 1 21:34 (10.0.0.1)
复制代码
名称 [状态] 线路 时间 [活动] [进程标识] (主机名)
其中各项参数的说明具体如下。
- 名称:用户的登录名。
- 状态:表明线路对用户是否都是可写的。
- 线路:雷同于pts/1、pts/2等,此线路标识在/dev目录中可以找到。
- 时间:用户登录系统的时间。
- 活动:某个用户在本身的线路上最后一次活动发生以来到现在的时间。 假如此项是个“.”,就表示一分钟内的线路活动; 假如线路保持静止已经高出24小时,或者自从系统启动以来还没有被利用过,那么此项标志为“old”。
- 进程标识:用户登录Shell的进程id。
- 主机名:登录到Linux系统上的客户端机器标识。
- [root@localhost ~]# last
- #<==显示已登录的用户列表及登录时间等,查看的信息与/var/log/wtmp及/var/log/btmp两个文件有关。
- root pts/2 10.0.0.1 Tue May 1 21:34 still logged in
- root pts/1 10.0.0.1 Tue May 1 21:34 still logged in
- ...省略部分信息...
- root pts/0 10.0.0.1 Sat Mar 31 14:33 - 18:01 (03:28)
- root tty1 Sat Mar 31 13:17 - 13:17 (00:00)
- root pts/0 10.0.0.1 Sat Mar 31 13:02 - 14:33 (01:30)
- reboot system boot 2.6.32-696.el6.x Sat Mar 31 12:36 - 21:36 (31+09:00)
- root pts/0 10.0.0.1 Wed Mar 14 18:40 - crash (16+17:55)
- ...省略部分信息...
- root pts/0 10.0.0.1 Sat Mar 10 12:26 - 12:28 (00:02)
- reboot system boot 2.6.32-696.el6.x Sat Mar 10 12:26 - 21:36 (52+09:10)
- root tty1 Thu Mar 8 10:10 - 10:10 (00:00)
- reboot system boot 2.6.32-696.el6.x Thu Mar 8 10:07 - 21:36 (54+11:29)
- wtmp begins Thu Mar 8 10:07:21 2018
-
- [root@localhost ~]# lastlog
- #<==报告最近的所有系统用户的登录信息,查看的信息与/var/log/lastlog日志有关。
- Username Port From Latest
- root pts/2 10.0.0.1 Tue May 1 21:34:29 +0800 2018
- bin **Never logged in**
- daemon **Never logged in**
- adm **Never logged in**
- ...省略部分信息...nobody
- dbus **Never logged in**
- vcsa **Never logged in**
- abrt **Never logged in**
- haldaemon **Never logged in**
- ...省略部分信息...
- test **Never logged in**
- range **Never logged in**
复制代码 2.11 Linux用户身份切换下令su
简单地说,su下令就是切换用户身份的下令。su下令可以在用户之间进行切换,超等权限用户root向普通用户切换不需要密码验证(这就是超等权限所在),其他普通用户之间或者从普通用户切换到root,都需要切换用户的密码验证。
- su [option] [user]
- su [选项] [用户名]
复制代码 1)若下令后面的用户名省略了,则默认切换为root用户。
2)从root用户切换到普通用户时,不需要任何密码,从普通用户切换到root用户时,则需要输入root密码。
参数选项注释说明-切换用户的时间,连带着用户的环境变量一起进行切换-c后面跟随利用的shell下令,实行完成后,切换回原来的用户 在生产场景中,su下令比较常用的参数为“-”和“-c”,其他的参数很少用到。
“su 用户名”固然可以或许切换到对应用户,但是登录后的环境变量信息有些照旧切换前用户的环境变量信息。
“su - 用户名”不但能切换到相应的用户,还能将登录后的环境变量一并切换,这是尺度规范的操纵方法。
2.12 visudo:编辑sudoers文件的工具
visudo下令是专门用来编辑/etc/sudoers这个文件的,同时它还提供了语法检查等功能。 /etc/sudoers文件是sudo下令的设置文件。
- visudo [option]
- visudo [选项]
- # visudo命令的参数选项及说明
- -c # 手动执行语法检查
复制代码
- 范例:实行visudo对普通用户test、test01授权的例子。
实行如下visudo下令,即可打开sudo的设置文件进行编辑:
- [root@localhost ~]# visudo # 相当于直接执行vim /etc/sudoers编辑,但使用命令方式更安全,推荐此种方式。
复制代码 在/etc/sudoers文件的大约第100行下面添加需要提升为root权限的普通用户名及对应权限,格式如下:
- test ALL=(ALL) ALL #<==此行是第98行,将test提权为root身份。
- test01 ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel
- #<==授权test使其可以以root身份添加和删除用户权限。
- #<==分别对test和test01两个用户做不同的授权,如上。
复制代码 待授权的用户或组机器=(授权角色)可以实行的下令userMACHINE=COMMANDStest01ALL=(ALL)/usr/sbin/useradd,/usr/sbin/userdel 假如是针对用户组,则对应的授权下令如下:
- %用户组 机器=(授权使用哪个角色的权限)/usr/sbin/useradd
复制代码 通过sudo下令进行系统的授权管理的目标是,既能让运维职员正常工作,又不会威胁到系统的安全,还可以审计用户利用sudo的提权操纵下令,默认的用户是无法得到root权限的。
为了管理方便,工作中可以为test授权ALL权限,test既可管理整个系统,平常也可以利用test用户处理工作,而不利用root用户。
有的时间,用户并不是利用visudo(保存时会主动检查语法)编辑的sudoer文件,而是利用vim或者echo等下令编辑的sudoer文件,此时就需要实行如下下令检查编辑文件的语法是否精确,假如语法不精确,则可能会导致授权无法收效的问题。
例如,工作中若有批量管理用户的需求,那么利用快速操纵下令增加sudo授权,就需要单独实行语法检查,快速操纵下令如下:
- \cp /etc/sudoers /etc/sudoers.ori
- echo "test ALL=(ALL)NOPASSWD: ALL " >>/etc/sudoers
- tail -1 /etc/sudoers
-
- # 上述操作是直接追加内容到sudoers文件,并没有进行语法检查,因此需要单独执行语法检查命令:
-
- [root@localhost ~]# visudo -c #<==使用-c选项进行语法检查。
- /etc/sudoers: parsed OK
复制代码 2.13 sudo:用户提权
sudo下令可以让普通用户在实行指定的下令或程序时,拥有超等用户(也可以是其他用户)的权限,并且可以有针对性地(精致)将不同下令或程序授予指定的普通用户,同时普通用户不需要知道root密码就可以得到授权,这个授权可以利用visudo设置管理。
- 普通用户提权,开发测试职员想要以root的权限实行下令
- 软件的权限提权,针对启动软件的用户进行提权
- # 案例1.普通用户提权
- # 第一步: 切换用户
- [root@localhost ~]# su - test
- # 第二步: 普通用户下执行命令
- [test@localhost ~]$ tailf /var/log/messages
- tailf: cannot open /var/log/messages: Permission denied
- [test@localhost ~]$ cat /var/log/messages
- cat: /var/log/messages: Permission denied
- # 第三步:查看当前普通用户拥有的sudo命令
- [test@localhost ~]$ sudo -l # 然后要输入自己的密码查看拥有的权限 默认为空
- # 第四步: sudo提权 在root中配置
- visudo
- 100 root ALL=(ALL) ALL # 在100行下面
- 101 test ALL=(ALL) /usr/bin/cat # 找到命令的绝对路径粘贴进来
- # 保存退出然后再普通用户查看sudo命令
- [test@localhost ~]$ sudo -l # 可以看到有一个命令可以执行
- User test may run the following commands on localhost:
- (ALL) /usr/bin/cat
- # 第五步: 执行sudo命令
- [test@localhost ~]$ sudo cat /var/log/messages
- # sudo授权单个命令:
- test ALL=(ALL) /usr/bin/cat
- # sudo授权多个命令: 使用逗号分隔命令
- test ALL=(ALL) /usr/bin/cat,/usr/bin/tailf
- # sudo授权所有的命令: 授权给运维人员
- test ALL=(ALL) NOPASSWORD: ALL
- # 对命令进行取反:
- test ALL=(ALL) ALL,!/usr/bin/rm,!/usr/bin/vim
- # 执行su是使用root的身份执行所以不需要密码
- [test@localhost ~]$ sudo su - root
- Last login: Mon Nov 20 11:26:42 CST 2023 from 10.0.0.1 on pts/2
- [root@localhost ~]# exit
复制代码 编辑sudo提权的区别:
visudo ===> 现实编辑的是 /etc/sudoers
- 利用sudo提权可以直接利用visudo,有语法检测功能
- 利用 vim /etc/sudoers 利用 :wq! 没有语法检测功能
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |