命令指南2

Linux系统权限

9位基础权限表

前三位是用户权限位 中三位是用户组权限位 后三位表示其他用户权限位
r w x r - x r - x
user(用户) group(用户组) others(其他用户)
代表字符u 代表字符g 代表字符o

Linux文件及目录权限核心

普通文件对应读、写、执行权限的说明

  1. 可读r:表示具有读取、浏览文件内容(即读取文件实体block)的权限
  2. 可写w:表示具有新增、修改、删除文件内容的权限
  3. 可执行x:表示具有执行文件的权限

其中,对于可读r,有两点需要进一步说明

  • 如果没有可读r的配合,那么使用vim编辑文件时会提示无法编辑(但可强制编辑覆盖文件),可以使用echo等命令进行重定向或追加内容到文件
  • 删除、移动或创建文件是受到父目录(上一级目录)的权限控制的(因为文件名没有存放在Inode里,而是在上级目录的block里存放着,若修改上级目录的block(删除文件本体),当然会受到上级目录的Inode的权限控制),与文件本身的权限无关,因此,文件本身的可写w权限,与文件是否能被删除和改名无关

对于可执行x,需要注意3点

  • 首先文件的本身需要能够执行(文件为命令或脚本)
  • 如果是普通用户,同时具备可读r的权限才能执行文件
  • 而root用户只要有可执行x的权限就能执行文件

目录对应读、写、执行权限的说明

  1. 可读:表示具有浏览目录下面文件及子目录名的权限.如果没有可执行x的配合,则不能切换到指定目录里,即无法执行cd命令
  2. 可写w:表示具有增加、删除或修改目录内文件的权限.但是,如果没有可执行x权限的配合,即使有w权限,也无法删除或创建文件
  3. 可执行x:表示具有进入目录的权限.

总结

  • 对于目录,r权限表示可以浏览目录下的内容(ls以及ls -l),w权限表示可以删除目录下的文件,以及在目录下创建文件,x表示切换到目录下
  • 没有x权限的配合,即使有w权限也无法删除和创建文件
  • 没有x权限的配合,即使有r权限,在查看目录内容及目录下的内容属性时也会报错或显示问号,但依然可以看到列表的文件名

chmod*****:设置及更改文件及目录权限命令

只有文件的属主和超级用户root才能执行这个命令

参数选项 解释说明
-R 递归处理指定目录及其子目录下的所有文件

数据权限表

权限 二进制 八进制
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7

chmod字符式权限(不推荐)

权限命令 用户类型 操作字符 权限字符 文件或目录
chmod u +、-、= r
g -
o w
a x

用户或用户组的定义

  • u:代表属主用户(user)
  • g:代表属组(group)
  • o:代表其他用户(other)
  • a或者不写:同时代表ugo,也就是上面三个用户或组(all)

权限定义字母

  • r:代表读权限,用数字4表示
  • w:代表写权限,用数字2表示
  • x:代表执行权限,用数字1表示
  • -:代表没有权限,用数字0表示
示例
chmod u-x test.txt
chmod g+x test.txt
chmod u-x,g+w,o-rwx test.txt
chmod ugo=rw test.txt
chmod a=rw test.txt
chmod +x test.txt  # 常用,所有权限增加x权限

目录字符权限的安全临界点:rwxr-xr-x 755

文件字符权限的安全临界点:rw-r--r-- 644

umask***:默认设置权限掩码及设置命令

root用户对应的umask值
[root@grape ~]# umask
0022
普通用户对应的umask值
[zyc@grape ~]$ umask
0002
# umask的值存在于/etc/bashrc文件中
[root@grape ~]# sed -n '70,74p' /etc/bashrc
    if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
       umask 002
    else
       umask 022
    fi
# 当用户UID值大于199,并且用户组与用户同名时,if判断成立umask值为002,否则为022
操作对象 默认最大权限 umask值 用户创建的权限
创建文件(umask所有位为偶数) 666 022(全偶数) 644
-rw-rw-rw- ----w--w- -rw-r--r-
偶数加减法:(默认最大权限)-(umask权限)=(用户创建的权限)
创建文件(umask部分位为奇数) 666 123(部分位为奇数)--x-w--wx 644(因为umask的值123中有2位都是奇数,因此在计算结果543的基础上再加上101,即奇数位对应的文件数字权限分别加1即可)
rw-rw-rw- rw-r--r--
说明:(默认最大权限)-(umask权限)+(umask奇数对应权限位+1)=(用户创建的权限)
创建目录 777 022 755(直接做减法即可)
-rwxrwxrwx ----w--w- -rwxr-xr-x
说明:(默认最大权限)-(umask权限)=(用户创建的权限)

特殊权限位(了解)

除了最基本的9位权限外,实际上Linux还有额外的3位权限位,总共是12权限位

  • suid(setuid)
  • sgid(setgid)
  • sticky(粘滞)

特殊权限位对比

类别 suid sgid sticky
字符表示 S S T
占据位置 基本权限x位 基本权限x位 基本权限x位
基本权限位有x权限 s s t
基本权限位没有x权限 S S T
八进制表示 4000 2000 1000
特护权限作用 针对用户位 针对用户组 针对其他用户
4 2 1
chomd u+s 文件/目录
chomd g+s 文件/目录
chomd o+t 文件/目录  # /tmp默认有sticky权限,绿底黑字表示
[root@grape ~]# ll `which passwd`
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd  # 红底白字

suid小结

  1. suid的作用是针对二进制命令或程序的,不能用在shell等类似脚本文件上
  2. 用户或属主对应的前三位权限的x位上,如果有s(S)则表示具备suid权限
  3. suid的作用就是让普通用户可以在执行某个设置了suid位的命令或程序时,拥有与命令对应属主(一般为root管理员)一样的身份和权限(默认)
  4. 二进制命令程序需要具有可执行权限x配合才能进行相关操作
  5. suid对应的身份和权限仅在程序命令的执行过程中才有效
  6. suid是一把双刃剑,是一个比较危险的功能,对系统安全存在一定的威胁,企业里用户授权可以使用sudo等替代suid功能
  7. 在进行安全优化时,系统中默认设置了suid权限的命令要取消

在工作中禁止使用suid,任何用户设置了suid后都是以root的身份和权限来进行的

chmod u+s /bin/rm # 任何用户执行rm都是root身份和权限

查找带有suid权限的文件
find /bin -type f -perm 4755|xargs ls -l

sgid小结

  1. 与suid不同的是,sgid即可以针对文件,也可以针对目录进行设置
  2. sgid的权限是针对用户组权限位的
  • 对于文件来说,sgid的功能为

    1. sgid仅对二进制命令及程序有效
    2. 二进制命令或程序,也需要有可执行权限x的配合
    3. 执行命令的任意用户可以获得该命令在程序执行期间所属组的身份和权限
  • 对于目录(继承目录所属的组)来说,sgid的功能为

    1. Linux里默认情况下所有用户创建文件,默认用户和组都是自身
    2. sgid可以让用户在此目录下创建的文件和目录具有与此目录相同的用户组设置

setgid主要用于目录中,在为某个目录设置了sgid后,在该目录中新创建的文件具有该目录的所属组权限,而不是创建该文件的用户的默认所有者.这就使得多个用户之间共享一个目录中的文件

[root@grape tmp]# ls -l `which locate`
-rwx--s--x. 1 root slocate 40520 Apr 11  2018 /usr/bin/locate  # 黄底黑字

chmod g-s `which locate` # 取消权限位

粘滞位(sbit)

  • /tmp目录,是整个系统用户的临时文件存放地.一个目录即使它的所有权限都开放了,即权限位rwxrwxrwx,同时还设置的粘滞位,那么除目录的属主和root用户都有权限删除它,除此之外其他用户是不能删除这个目录的.粘滞位的用途一般是将一个目录的权限都开打,然后共享该目录中的文件,比如/tmp目录.粘滞位的功能虽然很方便,但同时也带来了一定的安全隐患,生产环境中应禁止设置粘滞位权限

chown*****:改变文件或目录的用户和用户组命令

参数选项 解释说明
-R 递归更改目录的用户和用户组
示例
chown mango test.txt  # 添加用户
chown .apple test.txt # 添加用户组
chown mango.apple test.txt  # 同时添加用户和用户组

当用户和用户组删除时,文件/目录中属性的属主和属组就会出现数字id

Linux系统定时任务crond

Crond

  • Cron是Linux系统中以后台进程模式周期性执行命令或指定程序任务的服务软件.默认情况下,安装完Linux系统后,Cron服务软件便会启动,服务对应的进程名字为Crond,crond服务会定期(默认每分钟检查一次)检查系统中是否有需要执行的任务工作计划.如果有,则会根据其预先设定的定时任务规则自动执行该定时任务工作.这个Crond定时任务服务就相当于我们平时使用的闹钟
  • Linux系统中的Cron定时任务执行的最快频率是每分钟执行一次,因此如果是需要以秒为单位执行的计划任务,Cron就不适用了

linux下的定时任务软件

  1. at定时任务软件(依赖于atd服务)适合于执行一次就结束的调度任务工作.例如,某天夜里需要处理一个工作任务,仅仅是这一天的夜里,对于这种突发性的工作任务,那就可以使用该软件.要使得at这个软件设定的配置生效,还需要提前启动一个名为atd的服务,这个工具在生产环境中使用需求很少,了解即可
  2. Cron定时任务依赖于Crond服务.通过crontab命令可以配置周期性执行的定时任务计划,例如,每5分钟做一次服务器时间同步.要使得crontab命令设定的配置生效,还需要事先启动一个服务Crond才行.这是运维在生产工作中最常使用的工具
  3. anacron定时任务软件主要是为非7*24小时开机的服务器准备的,anacron并不能指定具体时间执行任务工作,而是以周期或者在系统每次开机后执行任务工作.它会检测服务器停机期间应该执行但是并没有执行的任务工作,并将该任务执行一遍

Cron详细说明

  • 在linux系统中,cron是定时任务的软件名,Crond是服务进程名,而crontab命令则是用来设置定时任务规则的配置命令
  1. 用户定时任务
    • Crond服务在工作时会以分钟为单位查看/var/spool/cron路径下以系统用户名命名的定时任务文件,以确定是否有需要执行的任务计划.如果有,就会将定时任务调度到内存中执行,使用crontab命令编辑的文件最终都会以当前用户名作为文件名存在于/var/spool/cron路径下
    • 如果是系统管理员或某个普通用户定期要做的任务工作,例如每隔5分钟与互联网上的时间服务器进行一次时间同步,每天晚上0点备份网站站点数据以及数据库数据,就可以使用crontab命令配置在/var/spool/cron路径下
  2. 系统定时任务
    • Crond服务在工作时除了查看/var/spool/cron下的定时任务之外,还会查看/etc/cron.d目录以及/etc/anacrontab下的文件内容,里面通常是每天、每周或每月需要执行的任务
    • Crond服务除了执行用户定时任务计划(/var/spool/cron目录)以外,还会周期地自动执行与操作系统相关的定时任务工作,例如轮询系统日志、备份系统数据、清理系统缓存等
[root@grape tmp]# ls -l /etc|grep cron
-rw-------.  1 root root    541 Apr 11  2018 anacrontab
drwxr-xr-x.  2 root root     21 Dec 27 11:33 cron.d       # 系统定时任务的目录
drwxr-xr-x.  2 root root     57 Jan 10 09:28 cron.daily   # 按天轮询配置的目录
-rw-------.  1 root root      0 Apr 11  2018 cron.deny    
drwxr-xr-x.  2 root root     22 Dec 27 11:33 cron.hourly  # 按小时轮询配置的目录
drwxr-xr-x.  2 root root      6 Jun 10  2014 cron.monthly # 按月轮询配置的目录
-rw-r--r--.  1 root root    451 Jun 10  2014 crontab
drwxr-xr-x.  2 root root      6 Jun 10  2014 cron.weekly  # 按周轮询配置的目录
[root@grape tmp]# ls -l /var/log/messages*  # Linux系统的日志自动轮循,以时间结尾
-rw-------. 1 root root  579897 Jan 16 15:54 /var/log/messages
-rw-------. 1 root root 1108756 Jan 10 09:25 /var/log/messages-20200110
-rw-------. 1 root root  165534 Jan 12 15:38 /var/log/messages-20200112
-rw-------. 1 root root  126037 Jan 13 09:29 /var/log/messages-20200113
-rw-------. 1 root root    1113 May 23  2020 /var/log/messages-20200523
[root@grape tmp]# ls -l /var/log/secure*
-rw-------. 1 root root  5385 Jan 16 14:39 /var/log/secure
-rw-------. 1 root root 13988 Jan 10 08:34 /var/log/secure-20200110
-rw-------. 1 root root  2228 Jan 12 14:52 /var/log/secure-20200112
-rw-------. 1 root root  1043 Jan 13 08:35 /var/log/secure-20200113
-rw-------. 1 root root  1069 May 23  2020 /var/log/secure-20200523
[root@grape tmp]# ll /etc/logrotate.conf /etc/cron.daily/logrotate 
-rwx------. 1 root root 219 Oct 31  2018 /etc/cron.daily/logrotate
-rw-r--r--. 1 root root 662 Jul 31  2013 /etc/logrotate.conf  # 日志文件轮询切割文件

用户定时任务Cron的使用

crontab定时任务编辑命令语法

使用crontab命令编辑的文件实际就是在操作'/var/spool/cron/当前用户名'文件

参数 含义 指定示例
-l 查看定时任务 crontab -l
-e 编辑定时任务 crontab -e
-i 删除定时任务,删除前会提示确认 crontab -ri
-r 删除定时任务 crontab -r
-u user 执行使用的用户执行任务 crontab -u mango -l

使用定时任务权限及配置文件

文件 说明
/etc/cron.deny 该文件中所列的用户不允许使用crontab命令,不常用
/etc/cron.allow 该文件中所列的用户允许使用crontab命令,优先于/etc/cron.deny
/var/spool/cron/ 所有用户的Cron配置文件默认都存放在此目录中,文件名以用户名命名.以root用户为例,执行crontab -e就等同于vim /var/spool/cron/root,而执行crontab -l等同于执行cat /var/spool/cron

定时任务的基本格式

* * * * * cmd  # cmd为执行的命令或脚本,例如/bin/sh /server/scripts/mango.sh
每个列之间必须要有一个空格,可以存在多个空格

定时任务时间段的含义

含义 取值范围(整数)
第1段 代表分钟 00~59(00也可以是0)
第2段 代表小时 00~23
第3段 代表日,天 01~31
第4段 代表月 01~12
第5段 代表星期,周几 0~7(0和7都代表周日)

定时任务特殊字符含义

特殊符号 含义
* *号,表示任意时间段,实际就是"每"的意思
- 减号,表示分隔符,表示一个时间范围、区间段,如17~19点,每天的17、18、19的00分执行任务.00 17-19 * * * cmd
, 逗号,表示分隔时段的意思.30 17,18,19 * * * cmd表示每天17、18和19点30执行cmd脚本.也可以与"-"号结合,例如:30 3-5,17-19 * * * cmd
/n n代表数字,即"每隔n单位时间",例如:每10分钟执行一次任务 */10 * * * * cmd,或者 00-59/10 * * * * cmd
[root@grape tmp]# systemctl status crond  # 查看Cron定时任务服务启动状态
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2020-01-16 08:48:24 CST; 8h ago
 Main PID: 6888 (crond)
   CGroup: /system.slice/crond.service
           └─6888 /usr/sbin/crond -n

Jan 16 08:48:24 grape systemd[1]: Started Command Scheduler.
Jan 16 08:48:24 grape crond[6888]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 63% if used.)
Jan 16 08:48:25 grape crond[6888]: (CRON) INFO (running with inotify support)
# enabled:说明开机Crond为自启动状态
# active(running):当前启动状态
  • 强调
    • 在编辑定时任务后,无须重启定时任务,Crond会自动检查更改的变化
    • 当定时任务不能正确执行时,查看定时任务日志文件(/var/log/cron)获取故障信息
示例
每分钟打印一次hello,world到tmp下的hello.txt文件中
*/1 * * * * echo 'hello.world' >> /tmp/hello.txt

[root@grape tmp]# crontab -l
* * * * * echo "hello,world" >> /tmp/hello.txt


  • 小结
    • 确认Crond服务进程是否开启
    • 书写定时任务规则前尽量写注释
    • 定时任务中的所有路径(包含文件和命令等的路径)都尽量使用绝对路径
    • 如果命令中有重定向符等,那么结尾不要再加>/dev/null 2>&1,否则会出错
    • 具体步骤
      • 先在命令行调试成功
      • 再将命令复制到定时任务配置中
      • 遇到问题,可根据输出以及定时任务日志/var/log/cron文件内容中排错
# 示例
每天晚上0点,将站点目录/var/www/html下的内容打包备份到/data目录下,并且每次生成不同的备份包名
vim /server/scripts/bak.sh
添加 /bin/tar zcf /data/bak_${date +%F}.tar.gz var/www/html内容
0 0 * * * * /bin/sh /server/scripts/bak.sh >/dev/null 2>&1 # 结尾要加>/dev/null 2>&1,将所有输出重定向  &表示将两个输出绑定在一起,就是错误输出和标准输出输出到同一个地方

定时任务的书写规范

  1. 为定时任务规则加上必要的注释

  2. 所有的定时任务尽量都以脚本的形式执行

    • 多行命令在命令后加&&,&&表示命令执行成功后执行下一条命令,\表示换行
  3. 在执行的Shell脚本上加上/bin/sh

    • 规范的Shell脚本定时任务执行方法:/bin/sh cmd
    • 规范的Perl脚本定时任务执行方法:/usr/bin/perl cmd
    • 规范的Python脚本定时任务执行方法:/usr/bin/python cmd
  4. 定时任务中在命令或脚本的结尾加上 >/dev/null 2>&1

    • 定时任务(一般是脚本任务)规则的结尾最好加上">/dev/null 2>&1",如果需要打印日志,则可以追加到指定的日志文件里(此时不要与/dev/null同时存在),总之,定时任务计划脚本的结尾尽量不要留空.因为在默认情况下,定时任务每一次执行完毕后,都会向对应的用户发送邮件,如果不加将输出(正确或错误)定向到空的内容(>/dev/null 2>&1),则可能会由于系统未开启邮件服务而导致邮件临时目录文件数猛增的隐患发生,大量小文件占用磁盘Inode节点数量(每个文件占一个Inode),以致磁盘Inode写满而无法再写入正常数据(故障提示:no space left on device)的故障发生

    • /dev/null 2>&1等价于 1>/dev/null 2>/dev/null 等价于 &>/dev/null

  5. 在指定用户下执行相关定时任务

  • 需要root权限执行的任务可以登录到root用户下然后进行设置,如果执行任务不需要root权限,则可以登录到普通用户下(也可以直接在root下通过命令crontab -u mango -e)进行设置.需要特别注意不同用户的环境变量问题,如果是调用了系统环境变量,例如/etc/profile等文件的下的变量,那么最好是在程序脚本中将用到的环境变量重新export
  1. 生产任务计划程序中不要随意打印输出信息
    • 在开发定时任务程序或脚本时,调试好脚本程序后,应尽量将Debug及命令输出的内容信息屏蔽调,如果确实需要输出日志,则可定向到指定的日志文件中,以避免随意输出不做重定向,从而导致系统垃圾的产生
  2. 定时任务执行的脚本要存放在规范路径下
    • 系统中的所有脚本存放都要有规范,推荐统一使用/server/scripts作为脚本的路径
  3. 配置定时任务要规范操作,减少出错
    1. 尽量先在命令行测试成功,再将成功的命令复制到脚本
    2. 执行测试脚本,测试成功后,将执行脚本的命令复制到定时任务配置中
    3. 先在测试环境下测试,然后在正式环境下部署
    4. 要有检验任务是否正确执行的手段,例如,检查/var/log/cron日志文件,如果任务执行计划频率较低,也要想法确保任务的可执行性
  4. 定时任务脚本中程序命令及路径尽量使用全路径
    • 防止定时任务执行错误
cat mango.sh
cd /var/www/&&\
/bin/tar zcf /data/bak_$(data +%F).tar.gz ./html
# 重新定义PATH环境变量
在文件中手动export 环境变量
export PATH='/sbin:/bin:/usr/bin:/usr/sbin'
  1. 时间变量%号要用反斜线转义
    • "%"号在Cron任务配置中被认为是newline,需要用""来转义.使用crontab编辑任务时,如果有类似"date +%F"的时间变量,则必须做如下转义"date +%F",但如果是在脚本中编写,那么%就不需要转义了
  2. 若脚本中调用了系统环境变量,则要重新定义
    • crontab在执行Shell等脚本时只能识别很少的系统环境变量,用户在/etc/profile等文件中定义的普通变量一般是无法被定时任务服务识别的,如果在编写的脚本中需要使用这些环境变量,那么最好是使用export重新声明下该变量
#!/bin/sh
export JAVA_HOME=/application/jdk1.6
export PATH=%JAVA_HOME/bin:$PATH
export SH_HOME=/application/resin/webapps/ROOT

No space left on device故障

  • 在保存设置定时任务时的规则时,系统提示'No space left on device',此时df -h命令检查磁盘,发现有剩余空间,再用df -i检查则显示Inode已被100%占用了,导致系统无法再/var目录下创建文件.因为定时任务配置在/var/spool/cron目录下,在ext3、ext4文件系统下,每个文件至少要占用一个Inode
  • 经检查发现在/var/spool/clientqueue/下有大量的小文件,使用命令cd /var/spool/clientqueue && ls|xargs rm -f进行清理
  • 更快的删除方法直接用cd /var/spool && rm -rf clientqueue删除上级目录,然后执行以下命令
# 修改回系统中原有的默认权限
mkdir clientqueque && chmod 770 clientqueue && chown smmsp.smmsp -R /var/spool/clientqueue
  • 当系统中Crond定时任务执行的程序包含输出内容时,输出内容会以邮件的方式发回给执行任务的用户(默认是root),而sendmail、postfix等mail服务没有启动时,这些输出内容就会在邮件队列临时目录中产生大量很小的文件,导致消耗大量的Inode和block数量,一旦Inode数量耗尽,就会导致系统无法写入文件报出上述错误'No space left on device'
  • 预防方法:
    1. 尽量在Cron任务中的命令或者脚本中的命令的结尾加上 '>/dev/null 2>&1'或者在写定时执行脚本时,将输出重定向到执行文件中(适合于所有情况)
    2. 也可以开启邮件服务,不过最好不做,因为邮件服务会带来安全隐患
    3. 添加定时清理任务,比如,find /var/spool/postfix/maildrop -type f -mtime +30|xargs rm -f放入定时任务,每周处理一次

Linux用户管理

用户及用户组配置文件

  • 在Linux系统中创建、增加、删除用户和用户组,实际上都是修改系统中对应的文件.与用户和用户组直接相关的文件主要有/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow这4个文件

系统用户相关配置文件

/etc/passwd  # 存储用户信息的文件
/etc/shadow  # 存储用户密码信息的文件

1.存储用户信息的文件 /etc/passwd

  • 主要存储系统用户的信息,通过":"号分隔,共7部分
  • passwd文件中有很多虚拟用户,如bin、daemon等,一般来说,这些用户都是系统正常运行所需的,在不确定的情况下,不要随意修改此类用户
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

/etc/passwd字段介绍

root :x :0 :0 :root :/root :/bin/sh
用户名称 用户密码 用户UID 用户组ID 用户说明 用户家目录 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即可.大部分内置系统的虚拟用户的这个字段都是/sbin/nologin,表示禁止登录系统,这是出于安全考虑进行的设置

2.存储用户密码信息的文件/etc/shadow

  • 由于passwd这个文件必须要被所有的用户读取,所以会带来安全隐患.而shadow文件就把/etc/passwd中的密码迁移过来,为了解决这个安全隐患
[root@mango ~]# ll /etc/shadow
---------- 1 root root 867 Jan 16 18:43 /etc/shadow  # 权限属性位置都是'-',即所有用户不可读(除root)
详细内容
[root@mango ~]# head /etc/shadow
root:$6$bUKvrhjv$CnURX3JyVj/KXVxzZZIKWj/HEifA79yM5eOVkrwPbS7s1.4qWhE49Xfujauizis..FATb8CWzWqdhkcypsplw0:18271:0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
/etc/shadow文件说明
字段名称 注释说明
用户名称 用户名称
用户密码 该密码是加密过的字符串
最近更改密码的时间 从1970年1月1日起,到用户最近一次更改密码的天数
禁止修改密码的天数 从1970年1月1日起,到用户可以修改密码的天数
用户必须更改口令的天数 从1970年1月1日起,到用户必须修改密码的天数
警告更改密码的期限 在用户密码过期之前多少天提醒用户更改密码
不活动时间 在用户密码过期之后到禁用账户的时间
失效时间 从1970年1月1日起,到用户被禁用的天数
标志 保留
  • 使用useradd添加用户会更改/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow,设计到的其他文件还有/etc/default/useradd、/etc/skel、/etc/login.defs、/home
  • 使用passwd或chpasswd为用户设置密码会更改/etc/shadow

系统用户组相关的配置文件

/etc/group    # 用户组信息文件
/etc/gshadow  # 用户组密码文件

1.存储用户组信息的文件/etc/group

  • /etc/group文件是存储用户组相关信息的文件,内容包括用户组名称、用户组id等属性
[root@mango ~]# ll /etc/group
-rw-r--r-- 1 root root 561 Jan 16 18:37 /etc/group[root@mango ~]# head /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:

group文件字段说明

字段名称 注释说明
用户组名 用户组的名称
用户密码 通常不需要设置该密码,基于安全原因,该密码被记录在/etc/passwd中,因此显示为"x".类似于/etc/passwd
GID 用户组的ID
用户组成员 加入这个组的所有用户(附加组成员,即用"-G"加入的成员)

2.存储用户组密码的文件/etc/gshadow

  • /etc/gshadow与/etc/passwd是两个互补的文件
[root@mango ~]# ll /etc/gshadow
---------- 1 root root 443 Jan 16 18:37 /etc/gshadow
[root@mango ~]# head /etc/gshadow
root:::
bin:::
daemon:::

/etc/gshadow字段说明

字段名称 注释说明
用户组名 用户组名称
用户组密码 这个段可以是空的或"!",如果是空的或有"!",则表示没有密码
用户组管理员用户 用户组管理者,这个字段也可以为空,如果存在多个用户组管理者,则用","号进行分割
用户组成员 加入这个组的所有用户,列表中多个用户之间可通过","进行分割

用户管理命令集合

命令 注释说明
1)与用户直接相关的命令
useradd 添加用户
usermod 修改用户信息
userdel 删除用户及与用户有关联的配置或文件
2)与用户密码直接相关的命令
passwd 为用户设置或修改密码
chpasswd 批量更新用户密码
chage 修改用户密码属性信息
3)与其他用户相关的命令
id 查看用户的UID、GID及所归属的用户组信息
su 切换用户角色的工具
sudo 以一个其他用户身份(主要是root用户)执行命令的工具,普通用户用来提权的重要工具
visudo 用于编辑suders配置文件(sudo授权文件)的工具

用户组管理命令

命令 注释说明
groupadd 添加用户组
groupdel 删除用户组
groupmod 修改用户组信息
gpasswd 为用户组设置密码
groups 显示用户所属的用户组
newgrp 更改用户所属的有效用户组

添加用户命令add

useradd工作原理

1.useradd

  • 当不带任何参数使用useradd添加用户时,首先会读取/etc/login.defs和/etc/default/useradd中预先定义的规则,并根据设置的规则添加用与户,同时还会向/etc/passwd和/etc/group文件内添加新建的用户和用户组记录.当然,/etc/shadow和/etc/gshadow也会同步生成记录,同时还会根据/etc/default/useradd及/etc/login.defs文件中配置的信息建立用户的家目录,并复制/etc/skel中所有隐藏的环境配置文件到新用户的家目录中,以完成对用户环境的初始化设置

2.与创建用户相关的文件tc/login.defs

/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   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
#
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,也就是说添加用户时,UID是从1000开始
UID_MAX                 60000      默认最大UID
# System accounts
SYS_UID_MIN               201
SYS_UID_MAX               999

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                  1000      默认最小GID,也就是说添加用户组时,GID是从1000开始
GID_MAX                 60000      默认最大GID
# 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                     是否创建用户家目录

# 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

3.与创建用户相关的文件/etc/default/useradd

  • /etc/default/useradd文件是使用useradd添加用户时预先加载的默认用户信息配置文件,可以使用"useradd -D参数"修改此文件的配置
# useradd defaults file
GROUP=100             依赖于/etc/login.defs的USERGOUPS_ENAB参数,如果为no,则此处控制
HOME=/home            在/home目录下创建用户的家目录
INACTIVE=-1           是否启用过期停权,-表示不启用
EXPIRE=               用户终止日期,不设置表示不启用
SHELL=/bin/bash       新用户默认使用的Shell解释器类型
SKEL=/etc/skel        配置新用户家目录的默认环境变量文件的存放路径.当我们使用useradd添加用户时,用户家目录下的隐藏环境变量文件,都是从这里配置的/etc/skel目录中复制过去的
CREATE_MAIL_SPOOL=yes 创建mail文件 

4.与创建用户相关的目录/etc/skel

  • /etc/skel目录是用来存放新用户需要的所有基础环境变量文件的目录,当添加新用户时,这个目录下的所有文件都会被自动复制到新添加的用户的家目录下;默认情况下,/etc/skel目录下的所有文件都是隐藏文件(以点号开头的文件),通过修改、添加、删除/etc/skel目录下的环境变量文件,可以为新创建的用户提供统一的、标准的、定制化的初始化用户环境
[zyc@lianxi ~]$ ll /etc/skel/.bash*
-rw-r--r--. 1 root root  18 Oct 31  2018 /etc/skel/.bash_logout 用户环境变量文件,退出时加载
-rw-r--r--. 1 root root 193 Oct 31  2018 /etc/skel/.bash_profile用户环境变量文件,登录时加载
-rw-r--r--. 1 root root 231 Oct 31  2018 /etc/skel/.bashrc      用户环境变量文件,登录时加载

5.创建用户的工作原理总结

  • 当不添加任何参数使用useradd添加用户时,默认配置就是读取/etc/default/useradd信息,并根据该文件的信息设定用户.这时,会从/etc/skel复制用户所需的环境变量文件,同时还会读取/etc/login.defs,并根据该文件设定相关的默认信息.这时一个用户在创建过程中的实现过程,当然了,还可以加上参数选项以改变文件中的默认设定

useradd命令参数

参数选项 注释说明
-c comment 设置新用户在passwd文件中的说明字段的信息
-d home_dir 新用户每次登陆时使用的家目录
-e expire_date 用户终止日期.日期指定格式为MM/DD/YY
-f inactive_days 用户过期几日后停权.当值为0时用户立刻被停权.而当值为-1时表示关闭此功能,默认为-1
-g initial_group 指定新用户所属的用户组.用户组名需为系统现存的名称
-G group,[...] 将新用户指定为多个不同用户组的成员.每个用户组均使用","进行分割.默认值为用户的起始用户组
-m 如果家目录不存在,则创建并指定用户家目录
-M 不建立用户家目录,其优先于/etc/login.defs文件的设定.一般创建虚拟用户不建立家目录,部署网络服务时需要创建虚拟用户
-n 默认情况下,用户的用户组与用户的名称是相同的.如果添加了-n参数,就不会生成与用户同名的用户组了
-s shell 用户登录后使用的解释器名称,默认为bash
-u uid 指定用户id,即UID
useradd mango -u 1200 -g root # 创建用户mango,属于指定组root,UID为1200
id mango  # 查看生效信息

useradd mysql -s /sbin/nologin -M # 创建虚拟用户mysql,禁止其登录,且不创建家目录

useradd apple -e "2020/01/26"  # 设置用户过期时间
chage -l apple  # 查看过期时间的设置结果

-c、-u、-G、-s、-d、-m多个参数混合使用
useradd -c "hello,world" -u 1555 -G root,mango,apple -s /bin/bash -d /home/grapelaowang

useradd -D参数

  • useradd加-D参数的作用是改变配置文件/etc/default/useradd文件的默认设置值
  • 同vim修改/etc/default/useradd的默认值
useradd -D参数选项 注释说明
-b default_home 定义用户所属目录的前一个目录.用户名称会附加在default_home后面用来建立新用户的目录.使用-d选项后此选项无效
-e default_expire_date 用户的停止日期
-f default_incative 用户过期几日后停权
-g default_group 新用户起始用户组名或ID.用户组名须为现有存在的名称.用户组ID也须为现有存在的用户组
-s default_shell 用户登录后使用的解释器.修改后新加入的用户都将使用此解释器
[root@lianxi ~]# cat /etc/shells  查看系统支持的Shell解释器种类
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

useradd -D -s /sbin/nologin  # 修改默认解释器为/sbin/nologin

用户信息修改命令usermod

  • usermod不仅能更改用户的解释器类型、UID、家目录等,还能更改用户的有效期、登录名等很多与用户有关的信息
  • usermod的作用是修改用户,而useradd的作用是添加用户,本质上都是对用户进行操作,因此,这两个命令大部分的参数作用都是一样的,只不过命令不同,功能上的区别就是一个是添加,另一个是修改
参数选项 解释说明
-c comment 修改用户passwd文件中用户的说明栏,同useradd的-c功能
-d home_dir 修改用户每次登陆时所使用的的家目录,同useradd的-d功能
-e expire_date 修改用户终止日期,同useradd的-e功能
-f inactive_days 修改用户过期几日后停权,同useradd的-f功能
-g initial_group 修改与用户对应的用户组,同useradd的-g功能
-G group,[...] 修改次用户为多个不同组的成员,同useradd的-G功能
-m 移动内容到用户的新目录,如果不存在就不创建,与useradd的-m不同
-M 不建立用户家目录,其优先于/etc/login.defs文件的设定.一般创建虚拟用户不建立家目录,部署网络服务时需要创建虚拟用户
-n 默认情况下,用户的用户组与用户的名称是相同的.如果添加了-n参数,就不会生成与用户同名的用户组了
-s shell 修改用户登录后使用的Shell名称,同useradd的-s功能
-a 追加用户到用户组,仅与-G参数连用
-l 修改用户账号名称
-L 锁定用户密码
-U 解除密码锁定
-u uid 修改用户的ID值,同useradd的-u功能
usermod -c "hello" -u 555 -G apple -s /sbin/nologin -d /home/laowang laowang

usermod apple -e "2020/01/26"  # 修改用户过期时间

删除用户命令userdel

参数选项 解释说明
-f 强制删除用户,即使用户当前已登录
-r 删除用户的同时,删除与用户相关的所有文件
  • 删除用户时,最好是在/etc/passwd中注释掉用户,注释一段时间后,确认真的没问题,再使用userdel

添加用户组命令groupadd

参数选项 解释说明
-g gid 指定用户组的GID,除非接-o参数,否则ID值唯一且不为负,如果不指定-g参数,则GID从1000开始
-f 新增一个账户,强制覆盖一个已存在的组账号
groupadd -g 1035 apple 

删除用户组命令groupdel

groupdel apple

修改用户密码命令passwd

参数选项 解释说明
-k 为密码已经过期的用户更新有效期
-l 锁定用户,被锁定的用户将不能登录.仅root用户有权使用该选项
--stdin 从标准输出读取密码字符串
-u 解除对用户的锁定,.仅root用户有权使用该选项
-d 删除用户的密码,是密码为空.仅root用户有权使用该项
-e 使用户密码立即过期,将在用户下次登录时强制用户修改密码.仅root用户有权使用该项
-n 设置修改密码的最短天数.仅root用户有权使用该项
-x 设置修改密码的最长天数.仅root用户有权使用该项
-w 设置用户在密码过期前多少天收到警告信息.仅root用户有权使用该项
-i 设置密码过期多少天之后禁用账户.仅root用户有权使用该项
-S 显示与用户密码相关的简单描述.仅root用户有权使用该项
[root@lianxi ~]# passwd -S zyc
zyc PS 2019-12-30 0 99999 7 -1 (Password set, SHA512 crypt.)

passwd -n 7 -x 60 -w 10 -i 30 mango

chage -l mango  # 查看用户信息
echo "123456"|passwd --stdin mango  # --stdin参数能从标准输入中获取密码

批量更新用户密码

  • chpasswd命令可从标准输入中读取一定格式的用户名、密码来批量更新用户的密码.格式为"用户名:密码",注意,用户名必须事先存在
[root@lianxi ~]# chpasswd
root:123456
mango:123456
apple:123456
[root@lianxi ~]#  在新的空行输入Ctrl+D结束输入
# 将用户名和密码放到文件中执行
[root@lianxi ~]# cat user.txt
root:123456
mango:123456
apple:123456
[root@lianxi ~]# chpasswd 

修改用户密码有效期命令chage

参数选项 解释说明
-d 设置上一次密码更改的日期
-E 账号过期的日期.日期格式为YYYY-MM-DD
-I 设置密码过期多少天后禁用账户
-l 显示账户有效信息
-m 密码可更改的最小天数.默认为0,表示任何时候都可以更改密码
-M 密码保持有效的最大天数
-W 密码到期之前,提前收到警告信息的天数
chage -m7 -M60 -W10 -I30 mango

chage -E 2020-05-24 mango

用户查询命令

id命令

  • 通常用来查看查询用户和组信息以及对应的UID、GID等信息
[root@lianxi ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

id -u mango  只查看UID
id -g mango  只查看GID
id -un mango 只查看用户名
id -gn mango 只查看用户组名

whoami、who、w、last、lastlog命令

  • whoami命令可用于查看当前登录的用户
  • w命令的作用是显式已经登录的用户,并且展示他都做了什么的信息
  • last、lastlog命令可以查看用户更详细的登录信息

whoami

[root@lianxi ~]# whoami
root

w:查看的信息与/var/run/utmp文件有关,比较常用

[root@lianxi ~]# w
 16:55:30 up  8:28,  3 users,  load average: 0.04, 0.03, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/1    10.0.0.1         14:41    1:45m  0.07s  0.04s vim /etc/login.defs
root     pts/2    10.0.0.1         14:56    1:00m  0.44s  0.01s vim /etc/default/useradd
root     pts/3    10.0.0.1         15:06    2.00s  0.08s  0.00s w

第一行的输出依次为当前的系统时间、系统从启动到现在已经运行的时间、登录到系统中的用户数和系统平均负载.平均负载指在1分钟、5分钟、15分钟之内系统的负载情况
USER:表示登录系统的用户
TTY:表示用户使用的TTY名称
FROM:表示用户从哪登录进来,一般是显示远程登录主句的IP地址或者主机名
LOGIN@:用户登录的日期和时间
IDLE:显示终端空闲时间
JCPU:表示该终端上的所有进程及子进程使用系统的总时间
PCPU:当前活动进程使用的系统时间
WHAT:当前用户执行的进程名称和选项

who:显示的信息比w少,不常用

输出格式:名称 [状态] 线路 时间 [活动] [进程标识] (主机名)

[root@lianxi ~]# who
root     pts/1        2020-01-17 14:41 (10.0.0.1)
root     pts/2        2020-01-17 14:56 (10.0.0.1)
root     pts/3        2020-01-17 15:06 (10.0.0.1)

名称:用户的登录名
状态:表名线路对用户是否都是可写的
线路:类似于pts/1、pts/2等,此线路标识在/dev目录中可以找到
时间:用户登录系统的时间
活动:某个用户在自己的线路上最后一次活动发生以来到现在的时间.如果此项是个".",就表示1分钟内的线路活动;如果线路静止已经24小时,或者自从系统启动以来还没有被使用过,那么此项标记为"old"
进程标识用户登录Shell的进程id
主机名:登录到Linux系统上的客户端机器标识

last:显示已登录的用户列表及登录时间,查看的信息与/var/log/wtmp及/var/log/btmp两个文件有关

[root@lianxi ~]# last
root     pts/3        10.0.0.1         Fri Jan 17 15:06   still logged in   
root     pts/2        10.0.0.1         Fri Jan 17 14:56   still logged in   
root     pts/1        10.0.0.1         Fri Jan 17 14:41   still logged in   
root     pts/0        10.0.0.1         Fri Jan 17 08:29 - 16:39  (08:10)    
reboot   system boot  3.10.0-957.el7.x Fri Jan 17 08:26 - 16:56  (08:30)    
root     pts/0        10.0.0.1         Thu Jan 16 17:51 - crash  (14:34)    
root     pts/1        10.0.0.1         Thu Jan 16 17:01 - crash  (15:24)    
root     pts/0        10.0.0.1         Thu Jan 16 14:39 - 17:51  (03:12)  

lastlog:报告最近的所有系统用户的登录信息,查看的信息与/var/log/lastlog日志有关

[root@lianxi ~]# lastlog
Username         Port     From             Latest
root             pts/3                     Fri Jan 17 16:00:22 +0800 2020
bin                                        **Never logged in**
daemon                                     **Never logged in**
adm                                        **Never logged in**
lp                                         **Never logged in**
sync                                       **Never logged in**
shutdown                                   **Never logged in**
halt                                       **Never logged in**
mail                                       **Never logged in**
operator                                   **Never logged in**
games                                      **Never logged in**
ftp                                        **Never logged in**
nobody                                     **Never logged in**
systemd-network                            **Never logged in**
dbus                                       **Never logged in**
polkitd                                    **Never logged in**
tss                                        **Never logged in**
abrt                                       **Never logged in**
sshd                                       **Never logged in**
postfix                                    **Never logged in**
zyc              pts/3                     Fri Jan 17 15:09:43 +0800 2020
maomao           pts/0                     Sat May 23 07:56:57 +0800 2020

用户切换身份命令su

参数选项 注释说明
-,-l,--login 使一个Shell称为登录的Shell,如执行su - mango,表示该用户希望改变用户为mango,并且使用mango用户对应的环境变量配置
-c,--command=COMMAND 切换到一个Shell下,执行一个命令,然后退出所切换的用户环境
-m,--preserver-environment 切换用户时,不需要重置用户环境变量,-p的功能同-m,这个参数为su的默认值,一般较少使用
-s,--shell=SHELL 如果/etc/shells允许,则运行执行的Shell
  • 生成环境中,su命令比较常用的参数为"-"和"-c"
# 切换到root用户,并且改变到root环境,然后列出root家目录的文件,最后退出root用户
[zyc@lianxi ~]$ su - -c "ls -l /root"
Password: 
total 4
-rw-------. 1 root root 1377 Dec 27 11:37 anaconda-ks.cfg
drwxr-xr-x. 3 root root  277 Dec 27 17:48 Envs
# 让系统在开机时自动以普通用户身份启动指定服务脚本
vim /etc/rc.local  # 在开机启动文件/etc/rc.local中写入启动命令
su - mango -c '/bin/sh /service/scripts/deploy.sh'  # 以普通用户执行脚本,但并不是在用户的下面

visudo:编辑sudoers文件的工具

  • visudo是专门用来编辑/etc/sudoers文件的
  • 执行visudo相当于vim /etc/sudoers编辑,但使用命令方式更安全
参数选项 解释说明
-c 手动执行语法检查
99 ## Allow root to run any commands anywhere
100 root    ALL=(ALL)       ALL
101 mango   ALL=(ALL)       ALL
102 apple   ALL=(ALL)       /usr/sbin/useradd  /usr/sbin/userdel
授权apple用户使其可以以root身份添加和删除用户
授权mango用户为root用户

sudo提权配置

待授权的用户或组 机器=(授权角色) 可以执行的命令
user MACHINE= COMMANDS
apple ALL=(ALL) /usr/sbin/useradd /usr/sbin/userdel
  • apple用户可以在所有的机器上以所有的角色执行sueradd、userdel命令
  • mango用户则会拥有与root相同的权限,并且可以切换到root用户
  • 如果是针对组,则授权命令如下:
    • % 用户组 机器=(授权使用哪个角色的权限) /usr/sbin/useradd
[root@lianxi ~]# visudo -c  检测文件语法
/etc/sudoers: parsed OK

sudo:以另一个用户身份执行命令

  • 执行visudo进行授权用户权限,之后用户可以用sudo命令提权
  • /var/run/sudo/目录有存放用户登录的时间戳文件
参数选项 解释说明
-l 列出当前用户可以执行的命令.只有sudoers文件里的用户才能使用该选项
-h 列出使用方法,并退出
-H 将环境变量中的HOME(家目录)指定为要变更身份的使用者家目录(如果不加-u参数就是系统管理者)
-V 显示版本信息,并退出
-v sudo如果是第一次执行,或者是在N分钟内没有执行(N预设为5),则会询问密码,这个参数用于重新做一次确认
-u 以指定用户的身份执行命令.后面是除root之外的用户,可以是用户名,也可以是uid
-k 清除时间戳上的时间,下次再使用sudo需要再次输入密码
-K 与-k类似,同时还要删除时间戳文件
-b 在后台执行指定的命令
-p 可以更改询问密码时的提示语
-e 不执行命令,而是修改文件,相当于sudo edit

你可能感兴趣的:(命令指南2)