基础命令讲解(二)
权限管理
Linux 权限是操作系统用来限制对资源访问的机制,权限一般分为读、写、执行。系统中每个文件都拥有特定的权限、所属用户及所属组,通过这样的机制来限制哪些用户或用户组可以对特定文件进行相应的操作。
Linux 每个进程都是以某个用户身份运行,进程的权限与该用户的权限一样,用户的权限越大,则进程拥有的权限就越大。
Linux 权限授权,默认是授权给三种角色,分别是 user、group、other,Linux 权限与用户之间的关联如下:
- U 代表 User,G 代表 Group,O 代表 Other;
- 每个文件的权限基于 UGO 进行设置;
- 权限三位一组(rwx),同时需授权给三种角色,UGO;
- 每个文件拥有一个所属用户和所属组,对应 UGO,不属于该文件所属用户或所属组使用 O 来表示;
在 Linux 系统中,可以通过 ls –l 查看目录的详细属性
分析图中 xiaobei 的数据
d 表示目录,同一位置如果为-则表示普通文件;
rwxr-xr-x 表示三种角色的权限,每三位为一种角色,依次为 u,g,o 权限,如上则表示 user 的权限为 rwx,group 的权限为 r-x,other 的权限为 r-x;
2 表示文件夹的链接数量,可理解为该目录下子目录的数量;
从左到右,第一个 xiaobei 表示该用户名,第二个 xiaobei 则为组名,其他人角色默认不显示;
6 表示该文件夹占据的字节数;
Jul 15 16:40 表示文件创建或者修改的时间;
xiaobei 为目录的名,或者文件名。
常用命令:chmod、chown、setfacl、chattr、lsattr
chmod 二进制权限
Linux 权限默认使用 rwx 来表示,为了更简化在系统中对权限进行配置和修改,Linux 权限引入二进制表示方法
Linux权限可以将rwx用二进制来表示,其中有权限用1表示,没有权限用0表示;
Linux权限用二进制显示如下:
rwx=111
r-x=101
rw-=110
r--=100
依次类推,转化为十进制,对应十进制结果显示如下:
rwx=111=4+2+1=7
r-x=101=4+0+1=5
rw-=110=4+4+0=6
r--=100=4+0+0=4
得出结论,用r=4,w=2,x=1来表示权限
特殊权限及掩码
Linux 权限除了常见的 rwx 权限之外,还有很多特殊的权限,为什么 Linux 目录默认权限 755,而文件默认权限为 644,这是因为 Linux 权限掩码 umask 导致。
每个 Linux 终端都拥有一个 umask 属性,umask 熟悉可以用来确定新建文件、目录的默认权限,默认系统权限掩码为 022。在系统中每创建一个文件或者目录,文件默认权限是 666,而目录权限则为 777,权限对外开放比较大,所以设置了权限掩码之后,默认的文件和目录权限减去 umask 值才是真实的文件和目录的权限。
- 对应目录权限为:777-022=755;
- 对应文件权限为:666-022=644;
- 执行 umask 命令可以查看当前默认的掩码,umask -S 023 可以设置默认的权限掩码
chmod 命令
变更文件或者改变目录权限 | 参数 | 注释 | | :---------: | :----------------------------------------- | |u |用户 user,文件或目录的所有者| |g |用户组 group,文件或目录所属群组| |o |其它用户 others| |a |所有用户 all,系统默认使用此项| |-|添加某些权限| |*|取消某些权限| |= |设置文件的权限为给定的权限| |r |表示可读权限| |w |表示可写权限| |x |表示可执行权限| |s |设置权限 suid 和 sgid,使用权限组合“u+s”设定文件的用户的 ID 位,“g+s”设置组 ID 位| |t |只有目录或文件的所有者才可以删除目录下的文件| |-R |递归处理,将指令目录下的所有文件及子目录一并处理|
设置可读可写
# o+w | o=rw
# + 表示直接加上写权限。
# = 表示将其他用户权限设置为可读可写,如果以前还有可执行权限,现在也去掉。
[root@xiaobei home]# mkdir -p /home/file
[root@xiaobei home]# ll
total 0
drwxr-xr-x. 2 root root 6 Jul 14 19:30 file
[root@xiaobei home]# chmod o+w file
[root@xiaobei home]# ll
total 0
drwxr-xrwx. 2 root root 6 Jul 14 19:30 file
# 或者:
[root@xiaobei home]# chmod o=rw file
[root@xiaobei home]# ll
total 0
drwxr-xrw-. 2 root root 6 Jul 14 19:30 file
# 对目录进行授权,R表示递归:
[root@xiaobei home]# chmod -R o+w /home/file/
危险操作
将目录权限设置为其他用户可写,这时普通用户是可以进入到目录中任意删除,修改文件名(即使不是自己的文件),对文件的其他用户权限为不可写的文件也可以强制保存。
# chmod o+w /home/
# xiaobei1用户修改xiaobei2用户的文件:
# 提示不能修改
# E45: 'readonly' option is set (add ! to override)
# 这时可以强制保存(:wq!)
# 【o-w】将目录权限设置为其他用户不可写(目录默认权限755),这时普通用户就无法删除,修改文件名,但是如果文件本身有其他可写权限,还是可以写数据的。
总结一下: 父目录其他用户有可写权限,其下子文件不管有没有可写权限,均可强行写入,修改! 父目录其他用户没有可写权限,其下子文件只有可写才有写入权限,但不具备删除,修改文件名权限。
设置 t 权限
【-t】 是对目录设置特殊权限,用户只能删除自己的文件
[root@xiaobei home]# chmod o+t /home/file/
[root@xiaobei home]# ll
total 0
drwxr-xrwT. 2 root root 6 Jul 14 19:30 file
# 小北账户删除file文件 失败
[root@xiaobei ~]# su xiaobei
bash-4.2$ cd /home/
bash-4.2$ ls
file xiaobei
bash-4.2$ rm -rf /home/file/
rm: cannot remove ‘/home/file/’: Permission denied
设置 s 权限
【-s】权限可以设置 suid 和 sgid:
- “u+s” : 设置使文件在执行阶段具有文件所有者的权限;
- “g+s” 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。
# 【u+s】
# 未设置前,普通用户执行netstat -ntlp,会提示没有root权限,普通用户看不了pid的属主:
bash-4.2$ netstat -ntlp
(No info could be read for "-p": geteuid()=1000 but you should be root.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN -
# 设置suid后:
[root@xiaobei home]# chmod u+s /usr/bin/netstat
bash-4.2$ netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 25482/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 25663/master
# 【g+s】
# 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组
[root@xiaobei home]# chmod g+s file/
[root@xiaobei file]# ll
total 0
drwxr-srwx. 2 root root 6 Jul 15 10:50 file1
drwxr-srwx. 2 xiaobei root 6 Jul 15 10:52 file2
setfacl 命令
设置文件访问控制列表
修改 acl 规则
通过-m 参数,可以修改文件的 acl 规则。
# 设置用户权限
[root@xiaobei file]# setfacl -m u:xiaobei:rw file1.txt
-rw-rw-r--+ 1 root root 0 Jul 15 11:00 file1.txt
# getfacl 查看文件acl权限
[root@xiaobei file]# getfacl /home/file/file1.txt
# file: home/file/file1.txt
# owner: root
# group: root
user::rw-
user:xiaobei:rw-
group::r--
mask::rw-
other::r--
#第一个user没有写用户名,代表是默认属主root的权限
user::rw-
#第二个user代表得是xiaobei用户得权限
user:xiaobei:rw-
# 设置组权限
[root@xiaobei file]# setfacl -m g:xiaobei:rw file1.txt
# 取消用户所有权限
[root@xiaobei file]# setfacl -m u:xiaobei:- file1.txt
# 取消其他用户得所有权限:
[root@xiaobei file]# setfacl -m o::- file1.txt
# 用户必须存在,否则会报错:
[root@xiaobei file]# setfacl -m u:xx:rw file1.txt
setfacl: Option -m: Invalid argument near character 3
[root@xiaobei file]# id xx
id: xx: no such user
[root@xiaobei file]# useradd xx
[root@xiaobei file]# setfacl -m u:xx:rw file1.txt
#现在xx可以写入数据到file1.txt文件了
[root@xiaobei file]# su xx
[xx@xiaobei file]$ echo "this is xx ! " > file1.txt
[xx@xiaobei file]$ cat file1.txt
this is xx !
批量修改 acl 规则
【-M】从文件中读取相应得权限进行设置,多用于批量管理用户权限
#先创建一个文件:
[root@xiaobei home]# touch acl.txt
#添加要设置得权限:(创建xx,xx1,xx2,xx3用户)
# u:xx:rwx
# u:xx1:rw
# u:xx2:x
# u:xx3:rx
[root@xiaobei home]# cat > acl.txt <<EOF
> u:xx:rwx
> u:xx1:rw
> u:xx2:x
> u:xx3:rx
> EOF
#执行,其中file.txt是要进行权限设置得文件:
[root@xiaobei home]# setfacl -M acl.txt file.txt
[root@xiaobei home]# getfacl file.txt
# file: file.txt
# owner: root
# group: root
user::rw-
user:xx1:rw-
user:xx2:--x
user:xx3:r-x
group::r--
mask::rwx
other::r--
撤销 acl 权限
【-x】撤销某个用户得 acl 权限,恢复到普通 ugo 权限:
#不能单独撤销某一个权限,比如只撤销可写权限
[root@xiaobei home]# setfacl -x u:xx file.txt
【-b】撤销所有用户或者组得 acl 权限:
[root@xiaobei home]# setfacl -b file.txt
复制 acl 规则
【--set-file】复制一个文件 acl 权限到另外一个文件。
# [root@xiaobei home]# getfacl file.txt |setfacl --set-file=- file2.txt
# -表示输出流
# echo file.txt |cat -
临时降低权限
【mask】会临时降低 acl 用户或者组的权限,只能降低用户权限,不能提升。
# 创建file.txt文件,设置小北 rw权限,此时xiaobei是可写的
[root@xiaobei data]# touch file.txt
[root@xiaobei data]# setfacl -m u:xiaobei:rw file.txt
[root@xiaobei data]# su xiaobei
bash-4.2$ cd /data/
bash-4.2$ echo "this is xiaobei" >> file.txt
bash-4.2$ exit
exit
# 设置mask:
[root@xiaobei data]# setfacl -m mask::r file.txt
# 此时acl用户只有只读权限,不可写
[root@xiaobei data]# su xiaobei
bash-4.2$ echo "this is xiaobei" >> /data/file.txt
bash: /data/file.txt: Permission denied
注意:如果 xiaobei 用户本身 r 权限(只读权限),即使 mask 设置为 rw,也是不能写的。 而且设置了 mask 之后,如果再次使用 setfacl 进行权限的设置,那么 mask 的作用就失效了。
chattr 命令
改变文件属性
只允许追加
【+a】让某个文件只能往里面追加内容,不能删除。
[root@xiaobei data]# chattr +a /data/file.txt
#去掉属性就是-a
[root@xiaobei data]# chattr -a /data/file.txt
完全限制
【+i】完全限制系统中某个关键文件,不能被修改,删除。
[root@xiaobei data]# chattr +i /data/file.txt
用户管理
Linux 用户在操作系统可以进行日常管理和维护,涉及到的相关配置文件如下:
- /etc/passwd 保存用户信息
- /etc/shdaow 保存用户密码(以加密形式保存)
- /etc/group 保存组信息
- /etc/login.defs 用户属性限制,密码过期时间,密码最大长度等限制
- /etc/default/useradd 显示或更改默认的 useradd 配置文件
命令:useradd、passwd、userdel、usermod、groupadd、groupdel
useradd
创建的新的系统用户 默认是在/home 下创建家目录:
[root@xiaobei data]# su - xiaobei
Last login: Wed Jul 15 11:51:40 CST 2020 on pts/1
-bash-4.2$ pwd
/home/xiaobei
指定家目录的根
【-b】指定用户家目录的根目录,会自动创建用户家目录。
[root@xiaobei data]# useradd -b /data/ xiaobei2
[root@xiaobei data]# su - xiaobei2
[xiaobei2@xiaobei ~]$ pwd
/data//xiaobei2
[xiaobei2@xiaobei ~]$
指定家目录
【-d】指定用户的家目录,即指定的目录即为家目录,也会自动创建。
[root@xiaobei data]# useradd -d /data/xiaobei3/ xiaobei3
[root@xiaobei data]# su - xiaobei3
[xiaobei3@xiaobei ~]$ pwd
/data/xiaobei3/
指定系统用户
【-r】指定创建系统用户
[root@xiaobei data]# useradd -r xiaobei4
[root@xiaobei data]# id xiaobei4
uid=998(xiaobei4) gid=996(xiaobei4) groups=996(xiaobei4)
指定 shell
【-s】指定用户登入后所使用的 shell
[root@xiaobei data]# useradd -s /sbin/nologin xiaobei5
[root@xiaobei data]# grep "xiaobei5" /etc/passwd
xiaobei5:x:1008:1008::/home/xiaobei5:/sbin/nologin
# 用户不能登录系统,多用于创建系统服务用户
passwd
锁定密码
【-l】锁定用户密码,用户登录不了
[root@xiaobei data]# passwd -l xiaobei1
Locking password for user xiaobei1.
passwd: Success
# 用普通用户身份进行切换,因为root切换普通用户,不需要输入密码,所以会感觉没生效
[root@xiaobei data]# su xiaobei1
# 先切换其他账号,再切换回xiaobei1
[root@xiaobei data]# su xiaobei
bash-4.2$ su xiaobei1
Password:
su: Authentication failure
# 或者用ssh登录普通用户,也可以验证
ssh xiaobei1@192.168.115.129
解锁密码
【-u】解锁用户密码
[root@xiaobei data]# passwd -u xiaobei1
Unlocking password for user xiaobei1.
passwd: Success
[root@xiaobei ~]# su xiaobei
bash-4.2$ su - xiaobei1
Password:
Last login: Wed Jul 15 14:32:51 CST 2020 on pts/0
注销密码
【-e】使用户密码立即失效
[root@xiaobei ~]# passwd -e xiaobei1
Expiring password for user xiaobei1.
passwd: Success
# 已经登录不上了
[root@xiaobei ~]# su xiaobei
bash-4.2$ su xiaobei1
Password:
You are required to change your password immediately (root enforced)
非交互方式修改密码
【--stdin】通过标准输入设置用户密码
[root@xiaobei ~]# echo "123456" | passwd --stdin xiaobei1
Changing password for user xiaobei1.
passwd: all authentication tokens updated successfully.
userdel
删除用户以及相关数据,但是如果不加参数,则只删除用户,不删除其家目录
[root@xiaobei ~]# useradd xiaobei6
[root@xiaobei ~]# ls /home/
xiaobei xiaobei1 xiaobei5 xiaobei6
[root@xiaobei ~]# userdel xiaobei5
[root@xiaobei ~]# ls /home/
xiaobei xiaobei1 xiaobei5 xiaobei6
删除用户家目录
【-r】删除用户的同时,删除与用户相关的所有文件
[root@xiaobei ~]# useradd xiaobei7
[root@xiaobei ~]# ls /home/
xiaobei xiaobei1 xiaobei5 xiaobei6 xiaobei7
[root@xiaobei ~]# userdel -r xiaobei7
[root@xiaobei ~]# ls /home/
xiaobei xiaobei1 xiaobei5 xiaobei6
强制删除在线用户
【-f】强制删除用户,即使用户已经登录,默认情况下,用户在线,是不能删除的,因为用户可能正在执行相关操作
[root@xiaobei ~]# userdel xiaobei1
userdel: user xiaobei1 is currently used by process 78724
[root@xiaobei ~]# userdel -rf xiaobei1
userdel: user xiaobei1 is currently used by process 78724
[root@xiaobei ~]# id xiaobei1
id: xiaobei1: no such user
usermod
修改用户的基本信息,不允许改变正在线上的使用者帐号名称
修改用户名
【-l】修改用户名
[root@xiaobei ~]# useradd xiaobei2
[root@xiaobei ~]# usermod -l xiaobei3 xiaobei2
[root@xiaobei ~]# id xiaobei2
id: xiaobei2: no such user
[root@xiaobei ~]# id xiaobei3
uid=1006(xiaobei3) gid=1006(xiaobei2) groups=1006(xiaobei2)
添加附加组
【-a】用户添加附加组
[root@xiaobei ~]# usermod -a -G wheel xiaobei
bash-4.2$ ps -ef |grep nginx
xiaobei 79109 79100 0 16:00 pts/3 00:00:00 grep nginx
修改用户家目录
【-d】修改用户登入时的目录,只是修改/etc/passwd 中用户的家目录配置信息,不会自动创建新的家目录,通常和-m 一起使用。
如果已经使用-d 执行了,可以立马去创建其家目录,并将/etc/skel/.bash* 文件拷贝进去
移动用户家目录
【-m】移动用户家目录到新的位置,不能单独使用,一般与-d 一起使用
[root@xiaobei ~]# useradd xiaobei3
[root@xiaobei ~]# usermod -md /data/new xiaobei3
[root@xiaobei ~]# su - xiaobei3
[xiaobei3@xiaobei ~]$ pwd
/data/new
[xiaobei3@xiaobei ~]$
groupadd
创建一个新的工作组
# 创建普通组
[root@xiaobei ~]# groupadd web
# 创建系统组
[root@xiaobei ~]# groupadd -r web2
# 创建指定id的组
[root@xiaobei ~]# groupadd -g 500 web3
[root@xiaobei ~]# grep "web3" /etc/group
web3:x:500:
# 查看组信息
[root@xiaobei ~]# tail /etc/group
sshd:x:74:
postdrop:x:90:
postfix:x:89:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
xiaobei:x:1000:xiaobei
web:x:1001:
web2:x:996:
web3:x:500:
groupdel
删除指定的工作组
[root@xiaobei ~]# groupdel web
[root@xiaobei ~]# groupdel web2
[root@xiaobei ~]# groupdel web3
[root@xiaobei ~]# grep "web" /etc/group