11.用户和权限

简化的启动流程

  • 1.开机BIOS自检测
  • 2.MBR引导
  • 3.grub引导菜单
  • 4.加载内核kernel
  • 5.启动init进程
  • 6.读取inittab文件,执行rc sysinit.rc等脚本
  • 7.启动mingetty,进入系统登录界面

环境变量

变量=值

$PATH:环境变量

set:显示当前设置的所有shell临时变量(变量=值)

env:显示shel所有的环境变量(export 变量)

alias 别名=’命令’:通过别名执行命令

unalias 别名:取消别名

unset 变量:取消临时变量

export -n 环境变量:取消环境变量

系统的环境配置文件:

  • /etc/profile

普通用户环境配置文件:

  • .bashrc
  • .bash_profile

提示符环境变量:PS1

信息:

1
2
3
4
5
6
7
8
9
10
11
12
\d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
\H :完整的主机名称
\h :仅取主机名中的第一个名字
\t :显示时间为24小时格式,如:HH:MM:SS
\T :显示时间为12小时格式
\A :显示时间为24小时格式:HH:MM
\u :当前用户的账号名称
\v :BASH的版本信息
\w :完整的工作目录名称
\W :利用basename取得工作目录名称,只显示最后一个目录名
\# :下达的第几个命令
\$ :提示字符,root用提示符为 # ,普通用户为 $

颜色:

格式:[\e[F;Bm]……..[\e[0m]

F B 颜色
30 40 黑色
31 41 红色
32 42 绿色
33 43 黄色
34 44 蓝色
35 45 紫红色
36 46 青蓝色
37 47 白色

例如:

1
PS1="[\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\]\[\e[31;1m\] \w\[\e[0m\]]\\$"
1
export PS1="\[\[\e[32;1m\]\u\[\e[36m\]@\[\e[35m\]\h \[\e[34m\]$(pwd) \[\e[0m\]\]\$ "

恢复用户级的环境变量

1
2
# 主要是.bashrc和.bash_profile
cp /etc/skel/.* . # 复制user的bash环境模块

用户管理

操作系统用户分类:

  • root:管理员,拥有最高权限。UID:0
  • 普通用户:普通用户,拥个人用户的最高权限。UID:1000+
  • 进程用户:启动某UID:201-999
  • 系统用户:启动进程必须使用一个用户来运行,该用户不需要登录,只是为了运行程序而存在。UID:1-200

/etc/passwd

用户名,密码占位,UID,GID,简介,启动初始目录,默认shell程序(/bin/bash,/sbin/nologin)

/etc/group

组名,密码占位,GID,组列表。

id:查看用户信息

su:新的用户,环境是指前的用户(比如之前用户的export的环境变量,可使用(如果还是当前bash))

su -:新用户与新用户的环境

sudo -i:root用户体验卡,与su -同

/etc/sudoers(visudo):sudo命令的主要配置文件,例如

组:%wheel ALL=(ALL:ALL) ALL,主机(以任何主机),用户(以任意其他用户),组(以任何组),命令(执行任何命令)

用户:user01 ALL=(ALL) ALL

​ user01 ALL=(ALL) NOPASSWD: ALL:提权不需要密码

/etc/sudoers.d/user01:对user01用户的一对一权限设置

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
which cat # 查看路径

user01 ALL=(ALL) /usr/bin/cat # 就给user01用户cat命令的root提权

# 给多个命令
user01 ALL=(ALL) /usr/bin/cat,/usr/bin/sed
# 注意sed可以修改/etc/passwd使root密码失效
sudo sed -i '/root/s#x##g' /etc/passwd

# 这样就可以随便切换用户
user01 ALL=(ALL) /usr/bin/su

# 不允许rm命令
user01 ALL=(ALL) ALL,!/usr/bin/rm
  • 堡垒机(跳板机):先在这台登录用户再跳转到要操作的实体机,就可以记录用户操作日志信息信息

查看当前用户拥有的提权的命令

1
sudo -l

/etc/login.defs:用户默认选项(UID范围,密码过期。。。)

useradd

​ -r:系统用户

​ -d:家目录

​ -u:uid

​ -M:不创建家目录

passwd

echo “mypasswd” | passwd –stdin myuser # 修改myuser的密码

生成密码:

1
2
openssl rand -base64 14
mkpasswd # expect 包

userdel:删除用户信息,家文件夹/home中文件还在

userdel -r:删除用户信息与用户文件夹

usermod

-a(append):加G

-c(comment):用户描述

-d(home):指定用户主目录

-g(gid):指定用户主要组(id和名称都行)

-G(groups):补充组;-G:重新定义组的列表(wheel,hr)来去除用户附加组

-L(lock):锁定用户账户

-m(move):与d移动家

-s(shell):提供交互的shell(/bin/bash,/sbin/nologin)

-U(unlock):解锁

usermod -s /sbin/nologin 主要是不提供shell服务,登录系统服务还是可以的。

groupadd:创建组(GID范围login.defs:GID_MIN - GID_MAX)

-g(gid):指定GID

-r(system):创建系统专用组(GID范围login.defs:SYS_GID_MIN - SYS_GID_MAX)

groupmod

-n(name):为组改新名称

-g(gid):改指定新组id

groupdel

newgrp+组名:暂时将该用户的主组为‘附属的一个组’,重登回复

gpasswd -d:删除用户指定附加组(对象是组名,选项对象是要移除用户)

/etc/shadow:

用户名1

密码(加密)2

最后一次密码更改日期3

密码最短使用期限(想要更改密码的间隔)4

密码最长使用期限(必须更改密码的期限)5

密码过期提前警告的天数6

密码过期后的宽限期(例如:会员卡过期宽限2天,能用,但2天后不续不行)7

账户过期日期8

保留字段9

chage

-m(mindays):密码想要更改的密码间隔4

-M(maxdays):密码过期日期5

-W(warndays):警告日期6

-I(inactive):宽限期7

-E(expiredate):账户过期日期8

-d(lastday):设置密码最后修改日期(设置重置密码的有效期起点)3

-l(list):显示用户账户密码信息

chage -d 0 用户:下次用户一定要更改密码

像过期这种距离日期的可以:

chage -E $(date -d "+30 days" +%F) 用户

MD5校验

1
2
3
4
5
6
# 生成md5值
md5sum code.txt # 生成值,如果修改了,md5生成就不一样

# 大量的文件md5需要存放在一个文件,例如每5分钟检查一遍文件的md5看是否被修改
md5sum code.txt > md5.log
md5sum -c md5.log # 通过md5.log校验
1
2
3
4
5
6
7
8
# 路径问题,md5sum -c 校验的文件是相对路径
# 生成的是文件名而不是绝对路径的校验信息,配置文件会检查不到

md5summ /root/code.txt > md5sum.log
md5sum /root/*.txt > /opt/md5sum.log

# 查找出所有文件,因为md5sum不能递归
find /root/ -type f |xargs md5sum > /opt/md5.log

文件权限

sed批量创建用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 添加
echo test{01..3}|xargs -n1|sed -r 's#(.*)#useradd \1#g' |bash
# 删除
echo test{01..3}|xargs -n1|sed -r 's#(.*)#userdel -r \1#g' |bash

# 添加并设置密码,一般都用for i in ...,这个是示例
echo test{01..3}|xargs -n1|sed -r 's#(.*)#useradd \1;echo 123456|passwd --stdin \1#g' |bash

# 随机密码,
echo test{01..3}|xargs -n1|sed -r 's#(.*)#useradd \1;echo \1 >> pass.txt;echo $(mkpasswd) | tee -a pass.txt |passwd --stdin \1#g' |bash

# awk的
echo test{1..3} |xargs -n1|awk '{print "useradd "$1";p=`mkpasswd`;echo $p|passwd --stdin " $1";echo -e " $1 " $p"}'

# 正常来讲for循环,上面是练习
for i in test{1..3};do useradd $i;pass=$(mkpasswd);echo $pass|passwd --stdin $i;echo -e "$i\t $pass" >> pass.txt;done

改变文件所有者和所有组

1
2
chown user1:group1 file
chown -R user2:group2 directory

权限:

r:4

w:2

x:1

切换文件权限

  • u,g,o,a
  • +,-,=
  • rwx

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
chmod u+r test.txt
chmod g+r test.txt
chmod go+r test.txt

chmod a-x test.txt

chmod +w test.txt

chmod u=rw test.txt

chmod a=rwx test.txt

chmod 640 test.txt # 改为rw-r-----

特殊权限:

  • u+s(4):以拥有文件的身份执行文件(文件),例如root文件的rm命令,加上这个其他用户执行该rm命令相当于root执行

  • g+s(2):以拥有文件的组身份执行文件(文件)

                    该目录下创建的文件组为该组(目录)
    
  • o+t(1):其他人在该目录下只能删除自己的文件(目录)

S:不存在可执行权限

s:特殊

1
2
3
4
chmod u+s test.txt 
chmod g+s test.txt

chmod 4764 testdir # rwsrw-r--

umask:限制创建文件/目录权限

配置文件(/etc/login.defs <– /etc/bashrc <– ~/.bashrc)

umask 022:

  • 逻辑减,777 - 022=755,目录默认权限
  • 755 - 111 = 644,文件默认权限(就是文件还要去掉一个可执行权限)

隐藏权限

  • i:谁都无法修改
  • a:只可以>>追加
1
2
3
4
5
lsattr test.txt # 查看隐藏权限

chattr +i test.txt # 添加i隐藏权限

chattr -i test.txt # 移除i隐藏权限