四、文件属性,用户管理,权限体系,正则式
1.文件属性
1.1文件属性概述
ls -lhi 每一列的含义
1.2 inode与block
- cat oldboy.txt 与lnode block
- 一个非空的文件
- inode:文件的属性信息
- block:文件的内容(文件是实体)
概念 |
说明 |
特点 |
inode(索引节点) |
存放文件的属性信息(大小,权限,时间,连接数),存放文件block的位置(指向文件实体的指针)。没有存放文件名。 |
|
block 块(数据块) |
存放文件数据空间。(文件内容) |
|
1.3 Linux文件类型
- Linux:linux下面的扩展名是给我们人看的。
- Windows:通过扩展名区分不同的文件,如果扩展名改变,默认无法识别文件。
Linux常见扩展名 |
作用 |
.txt |
普通文件 |
.cfg .conf |
配置文件 |
.sh .bash |
脚本文件 |
.py |
Python 脚本文件 |
.html |
html文件 网站文件。 |
.php .jsp |
一些语言的代码文件php java |
- 查看文件类型
Linux文件类型 |
|
file 文件 |
|
directory 目录 |
|
link 软连接 |
|
boolk 设备文件 |
磁盘,硬盘,U盘,光驱,移动硬盘,移动固态硬盘 |
character特殊符号文件 |
用于输出或吸收字符 |
管道文件(了解) |
|
套接字文件(了解) |
案例01 查看文件类型
[root@lichengbo-nb ~]# file /bin/find /etc/hostname /tmp/etc.tar.gz 二进制文件(命令) /bin/find: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=fd27753c2a274155615007bf3f5289378cf7b513, stripped 普通文本文件 /etc/hostname: ASCII text 普通文件文本文件 数据文件 /tmp/etc.tar.gz: gzip compressed data, from Unix, last modified: Fri Apr 28 16:35:54 2023 数据文件,需要使用专用的命令查看
案例 02 (了解) 系统其他类型的文件案例
- 字符特殊设备文件 黑洞与白洞
白洞(生成随机字符,密码)
/dev/urandom
tr -cd 'a-zA-Z0-9' </dev/urandom |head -c 100 (随机生成)
黑洞
/dev/null
[root@lichengbo-nb ~]# echo oldboy oldboy [root@lichengbo-nb ~]# echo oldboy >/dev/null
1.4软连接与硬链接
- 概述
- 软连接:softlink软链接,symlink符号链接,类似于windows快捷方式,方便我们 快速访问某个文件或目录,应用很广泛
- 硬链接:hardlink,在通一个磁盘分区中,inode号码相同的文件,互为硬链接,应用极少
- 特点
- 如何创建
创建软连接:
ln -s 源文件(用绝对路径) 软链接文件名字及位置
[root@lichengbo-nb /oldboy]# ln -s oldboy.txt oldboy.txt-soft [root@lichengbo-nb /oldboy]# ll oldboy.txt* -rw-r--r--. 1 root root 0 Apr 28 17:04 oldboy.txt lrwxrwxrwx. 1 root root 10 Apr 28 17:05 oldboy.txt-soft -> oldboy.txt
案例01 现在nginx软件是安装在/app/nginx-1.20.2要求创建软连接/app/nginx 指向/app/nginx-1.20.2
[root@lichengbo-nb /oldboy]# mkdir -p /app/nginx-1.20.2 [root@lichengbo-nb /oldboy]# tree /app/ /app/ └── nginx-1.20.2 1 directory, 0 files [root@lichengbo-nb /oldboy]# ln -s /app/nginx-1.20.2 /app/nginx [root@lichengbo-nb /oldboy]# ll /app total 0 lrwxrwxrwx. 1 root root 17 Apr 28 17:13 nginx -> /app/nginx-1.20.2 drwxr-xr-x. 2 root root 6 Apr 28 17:13 nginx-1.20.2 [root@lichengbo-nb /oldboy]# cd /app/nginx [root@lichengbo-nb /app/nginx]# pwd /app/nginx [root@lichengbo-nb /app/nginx]# pwd -P /app/nginx-1.20.2
创建硬链接:
ln
[root@lichengbo-nb ~]# cd /oldboy [root@lichengbo-nb /oldboy]# ll total 0 -rw-r--r--. 1 root root 0 Apr 28 17:04 oldboy.txt lrwxrwxrwx. 1 root root 10 Apr 28 17:05 oldboy.txt-soft -> oldboy.txt [root@lichengbo-nb /oldboy]# ln oldboy.txt oldboy.txt_hard [root@lichengbo-nb /oldboy]# ll -i oldboy.txt* 100709007 -rw-r--r--. 2 root root 0 Apr 28 17:04 oldboy.txt 100709007 -rw-r--r--. 2 root root 0 Apr 28 17:04 oldboy.txt_hard 100709008 lrwxrwxrwx. 1 root root 10 Apr 28 17:05 oldboy.txt-soft -> oldboy.txt
- 软链接与硬链接的特点
1、软连接是最常用的,给文件、目录创建软链接。
2、硬链接应用极少
3、软链接是存放的源文件的位置。
4、硬链接在同一个分区中文件的inode号码一致,类似与一个大楼的不通入口。
5、可以给文件和目录创建软链接,只能给文件创建硬链接
- 怎么没的
- 删除源文件:软链接失效(红底白字闪烁),硬链接可以继续访问与使用。文件是还在的。
- 删除软链接:对于其他没有影响。
- 删除硬链接:源文件的软链接没有影响
- 删除文件所有硬链接:文件测不发访问,相当于文件不存在。
- 面试题:软链接与硬链接区别
- 软链接是通过ln -s创建,硬链接是通过ln命令创建。
- 软链接:类似与快捷方式,他存放的是源文件的位置。
硬链接:在同一个分区中,inode号码相同的文件互为硬链接。
软链接可以给文件、目录创建软链接,很常用。
硬链接只能给文件创建硬链接,目录无法创建硬链接。 - 删除源文件:软链接失效(红底白字闪烁),硬链接可以继续访问与使用。文件是还在的。
删除软链接:对于其他没有影响。
删除硬链接:源文件的软链接没有影响
删除文件所有硬链接:文件测不发访问,相当于文件不存在。
1.5文件的3种时间
时间 |
含义 |
详细 |
mtime modify time |
修改时间 |
文件内容修改了 |
atime acess time |
访问时间 |
只要你看一次文件,时间就会改变。 |
ctime change time |
文件属性改变时间 |
文件属性信息大小,权限,所有者,硬链接数 |
[root@lichengbo-nb /oldboy]# touch lidao.txt 检查初始的时间 [root@lichengbo-nb /oldboy]# stat lidao.txt File: ‘lidao.txt’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 100709009 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:default_t:s0 Access: 2023-04-28 17:51:58.925044701 +0800 Modify: 2023-04-28 17:51:58.925044701 +0800 Change: 2023-04-28 17:51:58.925044701 +0800 Birth: - [root@lichengbo-nb /oldboy]# echo sadasdasd >lidao.txt 检查mtime [root@lichengbo-nb /oldboy]# stat lidao.txt File: ‘lidao.txt’ Size: 10 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 100709009 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:default_t:s0 Access: 2023-04-28 17:51:58.925044701 +0800 Modify: 2023-04-28 17:53:41.198045591 +0800 Change: 2023-04-28 17:53:41.198045591 +0800 Birth: - [root@lichengbo-nb /oldboy]# cat lidao.txt sadasdasd 检查atime [root@lichengbo-nb /oldboy]# stat lidao.txt File: ‘lidao.txt’ Size: 10 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 100709009 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:default_t:s0 Access: 2023-04-28 17:54:09.167045834 +0800 Modify: 2023-04-28 17:53:41.198045591 +0800 Change: 2023-04-28 17:53:41.198045591 +0800
小结
- 文件属性概述
- inode与block特点
- 文件类型
- 软连接与硬链接
- 文件的三种时间
2.用户管理体系
- 熟练掌握用户管理的命令,用户安全防范操作。
2.1用户管理概述
- 为何要有用户。
- 未来通过不同的用户远程连接到linux系统,然后进行操作与维护。
- 避免每个运维、开发都是用root,出现紧急情况无法追责与排查。
- 未来安全要求严格:连接linux之前都会有跳板机,堡垒机进行防护。
- Linux多用户的系统,同一时间可以登录多个用户。
- Linux多任务的系统。
2.2用户分类
- UID 用户身份证号
- GID 用户的户口本号码
用户 |
含义 |
UID |
root用户 |
最高权限用户 |
0 |
普通用户 |
只对自己家目录拥有权限的用户 |
1000开始 |
虚拟用户(傀儡用户) |
这种用户存在是用与让一些服务正常运行,一些服务运行需要指定的用户。 |
uid是1-999(非唯一判断标准) |
2.3用户相关文件
文件 |
含义 |
/etc/passwd |
存放用户的信息(非密码信息) |
/etc/group |
存放用户组的信息 |
/etc/shadow |
存放密码的信息 |
/etc/gshadow |
用户组密码的信息 |
/etc/profile |
环境变量(PS1),别名配置文件 |
/etc/bashrc |
别名配置文件 |
~/.bashrc |
当前用户生效的别名 |
~/.bash_profile |
当前用户生效的环境变量 |
- /etc/passwd每一列的含义
2.4用户相关目录
- /etc/skel/
- /etc/profile.d/
目录 |
含义 |
/etc/skel |
用户家目录的模板,添加用户的用户的家目录会从这里复制。 |
/etc/profile.d |
用户登录系统后会执行这个目录下面以.sh结尾的文件 |
[root@lichengbo-nb /oldboy]# ll -a /etc/skel total 24 drwxr-xr-x. 2 root root 62 Apr 3 17:27 . drwxr-xr-x. 82 root root 8192 Apr 28 16:31 .. -rw-r--r--. 1 root root 18 Apr 1 2020 .bash_logout 用户退出的时候,执行里面的命令 -rw-r--r--. 1 root root 193 Apr 1 2020 .bash_profile 配置环境命令 -rw-r--r--. 1 root root 231 Apr 1 2020 .bashrc 配置别名
故障案例:
现象:输入命令的时候,命令行变成了-bash-4.1$ 或-bash-4.2$ 样子。
原因:用户不小心删除了当前用户家目录下面的环境变量相关文件.bash*
解决:从/etc/skel/.bash*复制到当前用户家目录即可。重新登录即可
cp /etc/skel/.bash* ~
模拟故障案例:
临时取消/etc/profile中PS1的配置
添加用户: useradd oldboy
切换用户: su – oldboy
搞事情,模拟故障:
[oldboy@lichengbo-nb ~]$ \rm -rf /*
退出用户:ctrl+d 或出入命令logout
[root@lichengbo-nb ~]# su - oldboy Last login: Fri Apr 28 19:31:37 CST 2023 on pts/0 -bash-4.2$ -bash-4.2$
恢复故障:
先进入到有问题的用户
-bash-4.2$ cp /etc/skel/.bash* ~ -bash-4.2$ logout [root@lichengbo-nb ~]# su - oldboy Last login: Fri Apr 28 19:33:26 CST 2023 on pts/0 [oldboy@lichengbo-nb ~]$
2.5用户管理命令
1)增加用户:useradd添加用户 adduser添加用户
useradd选项 |
|
基本用法:useradd 用户名 |
|
-s |
添加用户的时候指定用户的命令解释器。如果不指定默认是/bin/bash |
-M |
添加用户的时候不创建家目录。(一般与-sM搭配使用) |
-u |
添加用户的时候指定UID |
-r |
添加系统用户(不创建家目录,uid 1-999),命令解释器是bash) |
-G |
添加用户的时候,让用户属于多个组 |
-g |
主要组(原生组) |
[root@lichengbo-nb ~]# ll /sbin/useradd /sbin/adduser lrwxrwxrwx. 1 root root 7 Apr 3 17:27 /sbin/adduser -> useradd -rwxr-xr-x. 1 root root 137616 Aug 9 2019 /sbin/useradd
案例01 添加用户oldboy
命令:useradd oldboy
[root@lichengbo-nb ~]# grep 'oldboy' /etc/passwd oldboy:x:1000:1000::/home/oldboy:/bin/bash
案例02 添加一个虚拟用户 命令解释器/sbin/nologin 不创建家目录
无法登录系统的用户,也无法切换到这个用户。
[root@lichengbo-nb ~]# useradd -s /sbin/nologin -M mysql [root@lichengbo-nb ~]# su - mysql su: warning: cannot change directory to /home/mysql: No such file or directory This account is currently not available. [root@lichengbo-nb ~]# ll /home total 0 drwx------. 2 oldboy oldboy 83 Apr 28 19:37 oldboy
案例03 了解 添加用户设置说明
[root@lichengbo-nb ~]# useradd -c 'this is lidao,oldboy linux teacher' lidao996 [root@lichengbo-nb ~]# tail -5 /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin oldboy:x:1000:1000::/home/oldboy:/bin/bash mysql:x:1001:1001::/home/mysql:/sbin/nologin lidao996:x:1002:1002:this is lidao,oldboy linux teacher:/home/lidao996:/bin/bash
案例04 添加系统用户(不创建家目录,命令解释器是/bin/bash) system
[root@lichengbo-nb ~]# useradd -r system [root@lichengbo-nb ~]# grep system /etc/passwd systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin system:x:998:996::/home/system:/bin/bash [root@lichengbo-nb ~]# ll /home total 0 drwx------. 2 lidao996 lidao996 62 Apr 28 20:04 lidao996 drwx------. 2 oldboy oldboy 83 Apr 28 19:37 oldboy
案例05 添加用户指定UID 添加lidao007用户 指定UID为1111
[root@lichengbo-nb ~]# useradd -u 1111 lidao007 [root@lichengbo-nb ~]# grep lidao007 /etc/passwd lidao007:x:1111:1111::/home/lidao007:/bin/bash
案例06 添加用户的时候,让用户属于多个用户组 用户lidaoroot 属于root组
[root@lichengbo-nb ~]# useradd -G root,lidao lidaoroot useradd: group 'lidao' does not exist [root@lichengbo-nb ~]# useradd -G root,lidao996 hotblood [root@lichengbo-nb ~]# id hotblood uid=1112(hotblood) gid=1112(hotblood) groups=1112(hotblood),0(root),1002(lidao996)
企业实际应用案例 添加一个虚拟用户mariadb 指定他的uid为1222
[root@lichengbo-nb ~]# useradd -s /sbin/nologin -m -u 1222 mariadb [root@lichengbo-nb ~]# id mariadb uid=1222(mariadb) gid=1222(mariadb) groups=1222(mariadb) [root@lichengbo-nb ~]# su - mariadb This account is currently not available. [root@lichengbo-nb ~]# grep mariadb /etc/passwd mariadb:x:1222:1222::/home/mariadb:/sbin/nologin
2)su切换用户 switch user
选项 |
|
格式:su – 用户名 |
|
- |
切换用户的时候,根系下用户的环境变量 |
-c |
切换到指定用户并执行命令,执行后返回。 |
案例01切换用户
[root@lichengbo-nb ~]# su - oldboy Last login: Fri Apr 28 20:35:55 CST 2023 on pts/0 [oldboy@lichengbo-nb ~]$ logout [root@lichengbo-nb ~]# su oldboy [oldboy@lichengbo-nb /root]$ env |grep root PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin MAIL=/var/spool/mail/root PWD=/root [oldboy@lichengbo-nb /root]$ exit [root@lichengbo-nb ~]# su - oldboy Last login: Fri Apr 28 20:40:20 CST 2023 on pts/0 Last failed login: Fri Apr 28 20:41:12 CST 2023 on pts/0 There was 1 failed login attempt since the last successful login. [oldboy@lichengbo-nb ~]$ env |grep root [oldboy@lichengbo-nb ~]$ env |grep oldboy USER=oldboy MAIL=/var/spool/mail/oldboy PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/oldboy/.local/bin:/home/oldboy/bin PWD=/home/oldboy HOME=/home/oldboy LOGNAME=oldboy
案例02 切换用户执行命令
[root@lichengbo-nb ~]# su - oldboy -c whoami oldboy [root@lichengbo-nb ~]#
su与su – 区别:
su:切换用户时不会更新环境变量
su - :切换用户时更新环境变量
切换用户流程:
3)设置密码:
Passwd给用户设置或修改密码 |
|
基本格式:passwd用户名 或passwd |
|
--stdin |
非交互式设置密码 |
案例01 修改oldboy用户的密码
[root@lichengbo-nb ~]# passwd oldboy Changing password for user oldboy. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. [root@lichengbo-nb ~]#
案例02 非交互式设置密码
[root@lichengbo-nb ~]# echo 'lichengbo!!!' |passwd --stdin oldboy Changing password for user oldboy. passwd: all authentication tokens updated successfully.
企业级保存密码方法
Excel表格
保存密码工具:keepass
4)删除用户
userdel删除用户 选项 |
|
-r |
删除用户及用户相关数据 |
案例01 删除用户 mysql
userdel删除用户的时候,只删除用户的信息,不会删除用户的家目录,邮件文件。
[root@lichengbo-nb ~]# userdel lidao007 [root@lichengbo-nb ~]# grep lidao007 /etc/passwd [root@lichengbo-nb ~]# ll /home total 0 drwx------. 2 hotblood hotblood 62 Apr 28 20:16 hotblood drwx------. 2 1111 1111 62 Apr 28 20:12 lidao007 drwx------. 2 1002 lidao996 83 Apr 28 20:51 lidao996 drwx------. 2 mariadb mariadb 62 Apr 28 20:26 mariadb drwx------. 2 oldboy oldboy 83 Apr 28 19:37 oldboy [root@lichengbo-nb ~]# userdel mysql [root@lichengbo-nb ~]# grep mysql /etc/passwd [root@lichengbo-nb ~]#
案例02 删除用户及相关文件 家目录
[root@lichengbo-nb ~]# userdel -r lidao666 [root@lichengbo-nb ~]# grep lidao666 /etc/passwd [root@lichengbo-nb ~]# ll /home total 0 drwx------. 2 hotblood hotblood 62 Apr 28 20:16 hotblood drwx------. 2 1111 1111 62 Apr 28 20:12 lidao007 drwx------. 2 1002 lidao996 83 Apr 28 20:51 lidao996 drwx------. 2 mariadb mariadb 62 Apr 28 20:26 mariadb drwx------. 2 oldboy oldboy 83 Apr 28 19:37 oldboy [root@lichengbo-nb ~]#
案例03 企业删除用户流程 企业应用案例
不推荐删除用户
如果非要删除,可以在/etc/passwd中注释掉用户。
[root@lichengbo-nb ~]# vim /etc/passwd [root@lichengbo-nb ~]# grep oldboy /etc/passwd #oldboy:x:1000:1000::/home/oldboy:/bin/bash [root@lichengbo-nb ~]# id oldboy id: oldboy: no such user [root@lichengbo-nb ~]#
5)修改用户信息(了解)
- usermod修改已存在的用户的信息,useradd添加用户时候设置的信息,usermod都可以改
- usermod的选项与useradd类似
案例01 修改用户的用户组信息
[root@lichengbo-nb ~]# usermod -G '' hotblood [root@lichengbo-nb ~]# id hotblood uid=1112(hotblood) gid=1112(hotblood) groups=1112(hotblood) [root@lichengbo-nb ~]# usermod -G 'root' hotblood [root@lichengbo-nb ~]# id hotblood uid=1112(hotblood) gid=1112(hotblood) groups=1112(hotblood),0(root) [root@lichengbo-nb ~]# usermod -G '' hotblood [root@lichengbo-nb ~]# id hotblood uid=1112(hotblood) gid=1112(hotblood) groups=1112(hotblood) [root@lichengbo-nb ~]# usermod -g 'root' hotblood [root@lichengbo-nb ~]# id hotblood uid=1112(hotblood) gid=0(root) groups=0(root)
6)查看用户信息
- 查看用户基本信息
- whoami 显示当前用户的名字
- id查看当前或指定用户的信息(uid,gid,用户组信息)
- 查看用户登录情况
- W
- last 查看用户的登录情况。
- lstlog 查看所有最近一次的登录情况
用户实时登录情况再做什么,以及能认识核心部分的含义
[root@lichengbo-nb ~]# w 22:37:42 up 6:11, 2 users, load average: 0.07, 0.03, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 16:27 6:06m 0.83s 0.83s -bash root pts/0 10.0.0.1 19:38 6.00s 0.48s 0.01s w
2.6用户组命令 (了解)
- groupadd 添加用户组
企业案例 添加用户的时候保证用户和用户组uid gid一致
如果直接添加的时候uid gid 不一致,那么需要先添加用户组,让后在创建用户。
groupadd -g 888 mysqlv2 -g指定gid
useradd -u 888 -g mysqlv2 mysqlv2 -g指定用户组
3.sudo权限集中管理
情景:
- linux系统,开发人员找我们要linux的权限,查看日志。
- 问题:给还是不给?
方法一:给root权限,这个很危险
方法二:给普通用户,但是这个无法满足要求,用户无法查看系统日志。
- 如果可以给他普通用户的权限,但是普通用户可以以root权限执行某个、某些命令。
- 类似与古代,你想拥有皇帝的权限,古代使用尚方大宝剑,只要亮剑,就相当于皇帝亲临。
- sudo权限。 给普通用户授权以root身份区执行命令
3.1进行sudo授权
- root授权
授权命令:visudo 编辑sudo授权
案例01授予oldboy以root权限运行rm和vi权限
oldboy ALL=(ALL) /bin/rm, /bin/vi
[root@lichengbo-nb ~]# visudo [root@lichengbo-nb ~]# grep oldboy /etc/sudoers oldboy ALL=(ALL) /bin/rm, /bin/vi [root@lichengbo-nb ~]#
案例02 授予oldboy用户所有命令
[root@lichengbo-nb ~]# visudo [root@lichengbo-nb ~]# grep oldboy /etc/sudoers #oldboy ALL=(ALL) /bin/rm, /bin/vi oldboy ALL=(ALL) ALL
案例03 授予oldboy用户所有命令并且不需要输入密码
[root@lichengbo-nb ~]# visudo [root@lichengbo-nb ~]# grep oldboy /etc/sudoers #oldboy ALL=(ALL) /bin/rm, /bin/vi #oldboy ALL=(ALL) ALL oldboy ALL=(ALL) NOPASSWD: ALL [root@lichengbo-nb ~]#
案例04 了解 授予/bin 目录所有命令
[root@lichengbo-nb ~]# visudo [root@lichengbo-nb ~]# grep oldboy /etc/sudoers #oldboy ALL=(ALL) /bin/rm, /bin/vi #oldboy ALL=(ALL) ALL #oldboy ALL=(ALL) NOPASSWD: ALL oldboy ALL=(ALL) /bin/*
3.2进行测试、使用
- oldboy使用
案例01 oldboy的演示
sudo -l
sudo vi /etc/passwd
[oldboy@lichengbo-nb ~]$ sudo -l Matching Defaults entries for oldboy on lichengbo-nb: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User oldboy may run the following commands on lichengbo-nb: (ALL) /bin/rm, /bin/vi
案例02
[oldboy@lichengbo-nb ~]$ sudo -l Matching Defaults entries for oldboy on lichengbo-nb: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User oldboy may run the following commands on lichengbo-nb: (ALL) ALL
小结
- root用户进行统一授权 visudo===vi /etc/sudoers
- 进行授权:命令
- 普通用户进行使用 sudo命令即可 sudo -l查看
4.用户管理补充
4.1 跳板机、堡垒机
- 跳板机/堡垒机:用户登录系统前的环境,用户需要先登录连接跳板机,然后才能操作linux 环境。在跳板机中会有命令,操作详细记录。
5. Linux权限体系
目标:
- 熟练掌握linux权限设置于查看
- 解决permission denied 权限拒绝问题
- 扩展:通过控制网站架构的安全。
5.1 linux权限体系概述
- Linux通过权限,用户控制人员访问,通过linux权限控制让系统、网站安全
5.2 linux权限体系rwx设置,计算
1)linux rwx 权限
权限字符 |
|
r |
read 读,是否可以读取内容? |
w |
write 写,是否可以修改内容? |
x |
executable 执行,是服可以执行内容?一般执行命令,脚本(shell脚本) |
- |
没有权限 |
2)linux权限与用户
3)linux权限与计算
权限字符 |
权限数字 |
|
r |
read 读,是否可以读取内容? |
4 |
w |
write 写,是否可以修改内容? |
2 |
x |
executable 执行,是服可以执行内容?一般执行命令,脚本(shell脚本) |
1 |
- |
没有权限 |
0 |
4)linux权限设置,用户设置
- change 修改
- chown 修改所有者
- chmod 修改权限
chown修改所有者 |
|
基本用法chown 用户.用户组 文件/目录 |
|
-R |
递归修改所有者 |
案例01 把/oldboy/oldboy.txt所有者和用户组改为oldboy
chown 用户 文件/目录
chown 用户.用户组 文件/目录
[root@lichengbo-nb ~]# chown oldboy.oldboy /oldboy/oldboy.txt [root@lichengbo-nb ~]# ll /oldboy/oldboy.txt -rw-r--r--. 2 oldboy oldboy 0 Apr 28 17:04 /oldboy/oldboy.txt [root@lichengbo-nb ~]# chown root /oldboy/oldboy.txt [root@lichengbo-nb ~]# ll /oldboy/oldboy.txt -rw-r--r--. 2 root oldboy 0 Apr 28 17:04 /oldboy/oldboy.txt [root@lichengbo-nb ~]# chown oldboy.oldboy /oldboy/oldboy.txt [root@lichengbo-nb ~]# chown .root /oldboy/oldboy.txt [root@lichengbo-nb ~]# ll /oldboy/oldboy.txt -rw-r--r--. 2 oldboy root 0 Apr 28 17:04 /oldboy/oldboy.txt
案例02 递归修改目录权限所有者
方法:chown -R oldboy.oldboy /oldboy
[root@lichengbo-nb ~]# chown -R oldboy.oldboy /oldboy [root@lichengbo-nb ~]# ll /oldboy total 4 -rw-r--r--. 1 oldboy oldboy 10 Apr 28 17:53 lidao.txt -rw-r--r--. 2 oldboy oldboy 0 Apr 28 17:04 oldboy.txt -rw-r--r--. 2 oldboy oldboy 0 Apr 28 17:04 oldboy.txt_hard lrwxrwxrwx. 1 oldboy oldboy 10 Apr 28 17:05 oldboy.txt-soft -> oldboy.txt
- chmod修改权限
chmod 权限 文件/目录 |
|
-R |
递归修改权限 |
- 通过数字修改权限
案例01 根据数字修改权限 把lidao.txt 权限修改为 777
[root@lichengbo-nb /oldboy]# ll lidao.txt -rw-r--r--. 1 oldboy oldboy 10 Apr 28 17:53 lidao.txt [root@lichengbo-nb /oldboy]# chmod 777 lidao.txt [root@lichengbo-nb /oldboy]# ll lidao.txt -rwxrwxrwx. 1 oldboy oldboy 10 Apr 28 17:53 lidao.txt
- chmod通过字符修改权限
所有者权限 用户组权限 其他人权限
user group other
chomd命令 |
ugo |
+或-或= |
r或w或x |
文件 |
案例02 给oldboy.txt所有者上增加x权限
[root@lichengbo-nb /oldboy]# ll oldboy.txt -rw-r--r--. 2 oldboy oldboy 0 Apr 28 17:04 oldboy.txt [root@lichengbo-nb /oldboy]# chmod u+x oldboy.txt 增加权限 [root@lichengbo-nb /oldboy]# ll oldboy.txt -rwxr--r--. 2 oldboy oldboy 0 Apr 28 17:04 oldboy.txt [root@lichengbo-nb /oldboy]# [root@lichengbo-nb /oldboy]# chmod u=x oldboy.txt [root@lichengbo-nb /oldboy]# ll oldboy.txt ---xr--r--. 2 oldboy oldboy 0 Apr 28 17:04 oldboy.txt
案例03 企业级应用案例给文件/etc/rc.d/rc.local增加x权限。
[root@lichengbo-nb /oldboy]# chmod ugo+x /etc/rc.d/rc.local [root@lichengbo-nb /oldboy]# chmod a+x /etc/rc.d/rc.local [root@lichengbo-nb /oldboy]# chmod +x /etc/rc.d/rc.local -rwxr-xr-x. 1 root root 473 Oct 2 2020 /etc/rc.d/rc.local
5)小结
- 熟练掌握:知晓任何文件所有者,用户组,其他人的权限。
- 熟练掌握:文件数字<=====>字母权限之间转换
- 熟练掌握:修改权限(数字和字母)和所有者
5.3Linux权限核心:文件/目录与rwx
- 目标:熟练掌握文件的rwx含义,目录的rwx含义,为了解决permission denied故障做铺垫
- 测试流程:root用户进行修改权限与所有者,普通用户进行测试
1)文件的rwx权限
文件的rwx权限 |
含义 |
r |
读,是否能查看文件内容(显示与查看) |
w |
写,是否能修改文件内容 |
x |
执行,是否能执行这个文件(命令,脚本) |
环境准备:
[root@lichengbo-nb /oldboy]# vim lidao.sh [root@lichengbo-nb /oldboy]# cat lidao.sh pwd whoami hostname [root@lichengbo-nb /oldboy]# ll lidao.sh -rw-r--r--. 1 root root 20 May 2 12:02 lidao.sh [root@lichengbo-nb /oldboy]# chown oldboy.oldboy lidao.sh [root@lichengbo-nb /oldboy]# ll lidao.sh -rw-r--r--. 1 oldboy oldboy 20 May 2 12:02 lidao.sh
oldboy用户进行初步的测试
[oldboy@lichengbo-nb /oldboy]$ cat lidao.sh pwd whoami hostname [oldboy@lichengbo-nb /oldboy]$ echo "date +%T" >>lidao.sh [oldboy@lichengbo-nb /oldboy]$ cat lidao.sh pwd whoami hostname date +%T [oldboy@lichengbo-nb /oldboy]$ /oldboy/lidao.sh -bash: /oldboy/lidao.sh: Permission denied [oldboy@lichengbo-nb /oldboy]$ ./lidao.sh -bash: ./lidao.sh: Permission denied
测试文件r权限
root用户
[root@lichengbo-nb /oldboy]# chmod u=r lidao.sh
oldbou用户
[oldboy@lichengbo-nb /oldboy]$ ll lidao.sh -r--r--r--. 1 oldboy oldboy 29 May 2 12:07 lidao.sh [oldboy@lichengbo-nb /oldboy]$ cat lidao.sh pwd whoami hostname date +%T [oldboy@lichengbo-nb /oldboy]$ echo 'pwd' >>lidao.sh -bash: lidao.sh: Permission denied
小结:只有r权限,对于文件来说只能查看文件内容,无法修改与执行
测试文件的w权限
root用户:
[root@lichengbo-nb /oldboy]# chmod u=w lidao.sh
oldboy用户:
[oldboy@lichengbo-nb /oldboy]$ ll lidao.sh --w-r--r--. 1 oldboy oldboy 29 May 2 12:07 lidao.sh [oldboy@lichengbo-nb /oldboy]$ cat lidao.sh cat: lidao.sh: Permission denied [oldboy@lichengbo-nb /oldboy]$ echo 'hostname' >>lidao.sh
小结:只有W权限,对文件来说只能写入内容,但是无法查看,需要r配合,无法执行
注意:如果通过vi/vim,强制修改文件,强制保存退出,导致源文件内容丢失。
测试文件的x权限
root用户:
[root@lichengbo-nb /oldboy]# chmod u=x lidao.sh
oldboy用户:
[oldboy@lichengbo-nb /oldboy]$ ll lidao.sh ---xr--r--. 1 oldboy oldboy 51 May 2 12:22 lidao.sh [oldboy@lichengbo-nb /oldboy]$ cat lidao.sh cat: lidao.sh: Permission denied [oldboy@lichengbo-nb /oldboy]$ echo 'hostname' >>lidao.sh -bash: lidao.sh: Permission denied [oldboy@lichengbo-nb /oldboy]$ ./lidao.sh bash: ./lidao.sh: Permission denied
小结:只有x权限无法执行脚本,需要r权限配合。
文件有rx后可以执行
[oldboy@lichengbo-nb /oldboy]$ ll lidao.sh -r-xr--r--. 1 oldboy oldboy 51 May 2 12:22 lidao.sh [oldboy@lichengbo-nb /oldboy]$ cat lidao.sh echo 这个是一本脚本内容 hostname hostname [oldboy@lichengbo-nb /oldboy]$ ./lidao.sh 这个是一本脚本内容 lichengbo-nb lichengbo-nb
文件权限小结:
文件的rwx权限 |
含义 |
|
r |
读,是否能查看文件内容(显示与查看) |
|
w |
写,是否能修改文件内容, |
需要r权限配合 |
x |
执行,是否能执行这个文件(命令,脚本) |
需要r权限配合 |
2)目录的rwx权限
目录rwx |
含义 |
r |
查看,查看目录的内容 |
w |
修改,在目录中创建、删除、 重命名文件的权限。 |
x |
是否可以进入目录权限 |
目录测试环境准备:
[root@lichengbo-nb /oldboy]# chmod u=rx lidao.sh [root@lichengbo-nb /oldboy]# mkdir -p oldboydir [root@lichengbo-nb /oldboy]# touch /oldboy/oldboydir/lidao{1..10}.txt [root@lichengbo-nb /oldboy]# chown -R oldboy.oldboy /oldboy/oldboydir
oldboy用户初测
[oldboy@lichengbo-nb /oldboy]$ ll -d oldboydir/ drwxr-xr-x. 2 oldboy oldboy 187 May 2 12:34 oldboydir/ [oldboy@lichengbo-nb /oldboy]$ ll oldboydir/ total 0 -rw-r--r--. 1 oldboy oldboy 0 May 2 12:34 lidao10.txt -rw-r--r--. 1 oldboy oldboy 0 May 2 12:34 lidao1.txt -rw-r--r--. 1 oldboy oldboy 0 May 2 12:34 lidao2.txt -rw-r--r--. 1 oldboy oldboy 0 May 2 12:34 lidao3.txt -rw-r--r--. 1 oldboy oldboy 0 May 2 12:34 lidao4.txt -rw-r--r--. 1 oldboy oldboy 0 May 2 12:34 lidao5.txt -rw-r--r--. 1 oldboy oldboy 0 May 2 12:34 lidao6.txt -rw-r--r--. 1 oldboy oldboy 0 May 2 12:34 lidao7.txt -rw-r--r--. 1 oldboy oldboy 0 May 2 12:34 lidao8.txt -rw-r--r--. 1 oldboy oldboy 0 May 2 12:34 lidao9.txt
测试目录的r权限
root用户修改
[root@lichengbo-nb /oldboy]# chmod u=r oldboydir/
oldboy用户测试
[oldboy@lichengbo-nb /oldboy]$ ls oldboydir/ ls: cannot access oldboydir/lidao1.txt: Permission denied ls: cannot access oldboydir/lidao2.txt: Permission denied ls: cannot access oldboydir/lidao3.txt: Permission denied ls: cannot access oldboydir/lidao4.txt: Permission denied ls: cannot access oldboydir/lidao5.txt: Permission denied ls: cannot access oldboydir/lidao6.txt: Permission denied ls: cannot access oldboydir/lidao7.txt: Permission denied ls: cannot access oldboydir/lidao8.txt: Permission denied ls: cannot access oldboydir/lidao9.txt: Permission denied ls: cannot access oldboydir/lidao10.txt: Permission denied lidao10.txt lidao1.txt lidao2.txt lidao3.txt lidao4.txt lidao5.txt lidao6.txt lidao7.txt lidao8.txt lidao9.txt [oldboy@lichengbo-nb /oldboy]$ ll oldboydir/ ls: cannot access oldboydir/lidao1.txt: Permission denied ls: cannot access oldboydir/lidao2.txt: Permission denied ls: cannot access oldboydir/lidao3.txt: Permission denied ls: cannot access oldboydir/lidao4.txt: Permission denied ls: cannot access oldboydir/lidao5.txt: Permission denied ls: cannot access oldboydir/lidao6.txt: Permission denied ls: cannot access oldboydir/lidao7.txt: Permission denied ls: cannot access oldboydir/lidao8.txt: Permission denied ls: cannot access oldboydir/lidao9.txt: Permission denied ls: cannot access oldboydir/lidao10.txt: Permission denied total 0 -????????? ? ? ? ? ? lidao10.txt -????????? ? ? ? ? ? lidao1.txt -????????? ? ? ? ? ? lidao2.txt -????????? ? ? ? ? ? lidao3.txt -????????? ? ? ? ? ? lidao4.txt -????????? ? ? ? ? ? lidao5.txt -????????? ? ? ? ? ? lidao6.txt -????????? ? ? ? ? ? lidao7.txt -????????? ? ? ? ? ? lidao8.txt -????????? ? ? ? ? ? lidao9.txt
目录的r小结:目录只有r权限,无法查看详细信息,只能查看文件名,需要x权限的配置。
目录的x权限,进入目录的权限,能否访问或修改属性信息的权限
测试目录的w权限
root用户修改
[root@lichengbo-nb /oldboy]# chmod u=w oldboydir/
oldboy用户测试
[oldboy@lichengbo-nb /oldboy]$ ll -d oldboydir/ d-w-r-xr-x. 2 oldboy oldboy 187 May 2 12:34 oldboydir/ [oldboy@lichengbo-nb /oldboy]$ touch oldboydir/lidao007.txt touch: cannot touch ‘oldboydir/lidao007.txt’: Permission denied [oldboy@lichengbo-nb /oldboy]$ touch oldboydir/lidao007.txt [oldboy@lichengbo-nb /oldboy]$ ll oldboydir/ ls: cannot open directory oldboydir/: Permission denied
目录的w权限小结:
目录只有w权限,无法操作,需要x权限配合(严格意义需要rx权限配合)
小结:
目录rwx |
含义 |
|
r |
查看,查看目录的内容 |
需要x权限配合 |
w |
修改,在目录中创建、删除、 重命名文件的权限。 |
需要x配合(工作一般需要rx配合) |
x |
是否可以进入目录权限,能否查看或修改目录中文件属性信息 |
- 目录的w权限案例:oldboydir所有者是oldboy权限是777,问oldboy用户能否删除这个目录???
- 目录:删除文件或目录需要对谁拥有什么权限?
[root@lichengbo-nb ~]# chmod 777 oldboydir [lichengbo@lichengbo-nb /oldboy]$ ll -d oldboydir drwxrwxrwx. 2 lichengbo lichengbo 6 May 2 13:08 oldboydir [lichengbo@lichengbo-nb /oldboy]$ \rm -rf oldboydir rm: cannot remove ‘oldboydir’: Permission denied [lichengbo@lichengbo-nb /oldboy]$
删除文件或目录要对文件或目录所在的目录拥有w(rwx)权限
演示修改/oldboy目录的所有者,改为lichengbo,检查删除情况
[root@lichengbo-nb /oldboy]# chown lichengbo /oldboy [root@lichengbo-nb /oldboy]# ll -d /oldboy drwxr-xr-x. 3 lichengbo root 103 May 2 13:08 /oldboy
5.4 permission denied权限排除
- 分析各种权限拒绝原因
1)操作与权限
文件rwx含义 |
目录rwx含义 |
|
r |
是否可以查看内容 |
查看,查看目录的内容(需要x配合) |
w |
是否可以修改文件内容(需要r) |
修改,在目录中创建、删除、 重命名文件的权限。需要x配合(工作一般需要rx配合) |
x |
是否可以执行文件(需要r) |
是否可以进入目录权限,能否查看或修改目录中文件属性信息 |
日常操作 |
需要权限 |
查看文件的内容 |
文件要有r权限 |
编辑或修改文件内容 |
文件需要rw权限 |
执行脚本/命令 |
文件需要有rx权限 |
查看目录内容 |
目录需要有rx权限 |
创建文件,删除文件 |
文件所在目录要有rwx权限 |
重命名 |
文件所在目录要有rwx权限 |
2)具体分析案例及流程
- 遇到故障permission denied权限拒绝
- 分析原因:分析文件、目录权限导致
- 详细分析:缺少什么具体的权限导致的
普通用户测试:
#案例01 ls -l /root
##与什么权限有关:文件、目录
##与目录确实什么权限??rx
##检查是否缺少rx
[lichengbo@lichengbo-nb /oldboy]$ ll /root ls: cannot open directory /root: Permission denied [lichengbo@lichengbo-nb /oldboy]$ ll -d /root dr-xr-x---. 2 root root 170 May 2 12:02 /root
检查发现oldboy用户对/root没有权限(最后三位权限)
案例02 echo '#oldboy' >>/etc/passwd
[lichengbo@lichengbo-nb /oldboy]$ echo '#oldboy' >>/etc/passwd -bash: /etc/passwd: Permission denied [lichengbo@lichengbo-nb /oldboy]$ #拥有rx权限就可以修改文件内容 [lichengbo@lichengbo-nb /oldboy]$ [lichengbo@lichengbo-nb /oldboy]$ ll /etc/passwd -rw-r--r--. 1 root root 1160 May 2 13:13 /etc/passwd [lichengbo@lichengbo-nb /oldboy]$ #oldboy对/etc/passwd只有r权限(最后三位)所以无法修改内容
总结
- 熟练掌握:知晓任何文件所有者、用户组、其他人的权限。随便一个用户你能知道当前用户对文件的权限。
- 熟练掌握:文件数字🡸🡺字母权限之间转换
- 熟练掌握:修改权限(数字和字母)和所有者
- 文件目录的rwx权限
- 权限拒绝类故障排查
6. linux系统12位权限体系
6.1 Linux系统默认权限
- 创建文件,文件权限默认是644
- 创建目录,目录权限默认是755
- 从结果看,这个默认的权限还是较为安全的
- umask反掩码(控制linux系统默认权限)
[root@lichengbo-nb ~]# umask 0022
- 系统中一般情况下文件和目录最大的权限是?
普通文件最大权限:666
普通目录最大权限:777
最大的权限减去umask就是文件和目录的默认权限。
注意:目录是完全符合规则
文件的666减去umask后,如果有奇数,奇数为减去后还要加1
文件的默认的权限:666-022=644
目录的默认的权限:777-022=755
6.2 Linux通过权限控制网站让网站安全
- 网站一般通过linux下面服务软件运行的,常用有nginx
- 运行nginx软件,软件运行的时候需要一个用户。
- 用户可以是root?其他虚拟用户?
- 网站服务运行的时候通过虚拟用户运行,较为安全
- 网站程序代码
- 存放代码/app/bao/blog
- file 644 root root
- dir 755 root root
- 用户上传的目录/app/bao/zhibo/upload
- file 644 nginx nginx
- dir 755 nginx nginx
小结:
- 通过linux权限控制网站的安全
- 网站都是虚拟用户运行:www/nginx
- 网站程序代码的目录:
- 文件644 root root
- 目录755 root root
- 网站有上传的目录:
- 文件644 www www
- 目录755 www www
6.3 linux12位权限体系之3个特殊权限
[root@lichengbo-nb ~]# ll -d /bin/passwd /bin/ls /tmp /bin/write -rwxr-xr-x. 1 root root 117608 Aug 20 2019 /bin/ls -rwsr-xr-x. 1 root root 27856 Apr 1 2020 /bin/passwd -rwxr-sr-x. 1 root tty 19544 Oct 1 2020 /bin/write drwxrwxrwt. 23 root root 4096 May 2 12:45 /tmp
- suid set uid 红色 权限的所有者的位置上有s标记 suid
- 拥有suid权限的命令,用户在运行的时候相当于是命令的所有者(root)
- sgid与suid类似,用户运行带有sgid的相当命令的用户组的权限
- sticky粘滞位
- 拥有粘滞位的目录,用户可以在目录下面任意创建文件
- 但是每个用户只能管理自己的文件
[root@lichengbo-nb ~]# stat /tmp File: ‘/tmp’ Size: 4096 Blocks: 8 IO Block: 4096 directory Device: fd00h/64768d Inode: 67160136 Links: 23 Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:tmp_t:s0 Access: 2023-05-02 11:59:33.694000053 +0800 Modify: 2023-05-02 12:45:37.541024097 +0800 Change: 2023-05-02 12:45:37.541024097 +0800 Birth: - [root@lichengbo-nb ~]# stat /bin/passwd File: ‘/bin/passwd’ Size: 27856 Blocks: 56 IO Block: 4096 regular file Device: fd00h/64768d Inode: 620202 Links: 1 Access: (4755/-rwsr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:passwd_exec_t:s0 Access: 2023-04-28 20:45:02.368135031 +0800 Modify: 2020-04-01 11:57:19.000000000 +0800 Change: 2023-04-03 17:28:13.239992898 +0800 Birth: - [root@lichengbo-nb ~]# stat /bin/write File: ‘/bin/write’ Size: 19544 Blocks: 40 IO Block: 4096 regular file Device: fd00h/64768d Inode: 464099 Links: 1 Access: (2755/-rwxr-sr-x) Uid: ( 0/ root) Gid: ( 5/ tty) Context: system_u:object_r:bin_t:s0 Access: 2020-10-01 01:46:32.000000000 +0800 Modify: 2020-10-01 01:46:32.000000000 +0800 Change: 2023-04-03 17:27:57.289993623 +0800 Birth: -
小结:掌握理解suid和粘滞位含义即可
6.4 linux特殊属性
- 目标:掌握通过chattr,给系统关机命令或文件加上锁头。
- chattr 设置特殊属性
- chattr +a或+i 文件/目录
- 去掉权限 -a或-i
- lsattr 查看特殊属性
# a appemd只能追加,不能删除
[root@lichengbo-nb /oldboy]# lsattr oldboy.txt ---------------- oldboy.txt [root@lichengbo-nb /oldboy]# chattr +a oldboy.txt [root@lichengbo-nb /oldboy]# lsattr oldboy.txt -----a---------- oldboy.txt [root@lichengbo-nb /oldboy]# echo oldboy >>oldboy.txt [root@lichengbo-nb /oldboy]# cat oldboy.txt oldboy [root@lichengbo-nb /oldboy]# echo old >oldboy.txt -bash: oldboy.txt: Operation not permitted [root@lichengbo-nb /oldboy]# \rm -f oldboy.txt rm: cannot remove ‘oldboy.txt’: Operation not permitted
# i immutable 无敌的,无法杯摧毁的
[root@lichengbo-nb /oldboy]# chattr +i oldboy.txt [root@lichengbo-nb /oldboy]# lsattr oldboy.txt ----i----------- oldboy.txt [root@lichengbo-nb /oldboy]# tail oldboy.txt oldboy [root@lichengbo-nb /oldboy]# echo old >oldboy.txt -bash: oldboy.txt: Permission denied [root@lichengbo-nb /oldboy]# \rm -f oldboy.txt rm: cannot remove ‘oldboy.txt’: Operation not permitted
应用场景:
- 可以给一些核心命令加上i
- 可以给一些配置文件加上a
小结:
- linux权限体系概述
- linux权限体系rwx设置,计算(权限的计算修改chmod chown)
- linux权限体系文件和目录与权限
- linux permission denied 权限拒绝故障分析解决
- linux系统默认的权限
- linux通过权限控制让网站安全(重点内容,目前不是核心)
- liunx特殊权限
- linux特殊属性
7.linux特殊符号系列
7.1引号系列:单引号、双引号、不加引号区别(反引号)
反引号: ` ` 或$() |
优先执行,先执行里面的命令,一遍创建/打包的时候给文件名加上一个日期 |
单引号:’ ’ |
所见即所得,单引号里面的内容会原封不懂的输出。 |
双引号:” ” |
与单引号类似,但是对引号的里面的特殊符号会进行解析(运行) |
不加引号: |
与双引号类似,同时支持{ } |
实际例子:
单引号:’ ’ 所见即所得,单引号里面的内容会原封不懂的输出。
[root@lichengbo-nb ~]# echo 'lidao $UID `whoami` {1..5}' lidao $UID `whoami` {1..5}
双引号:” ” 与单引号类似,但是对引号的里面的特殊符号会进行解析(运行)
[root@lichengbo-nb ~]# echo "lidao $UID `whoami` {1..5}" lidao 0 root {1..5}
不加引号:与双引号类似,同时支持{ }
[root@lichengbo-nb ~]# echo lidao $UID `whoami` {1..5} lidao 0 root 1 2 3 4 5
7.2重定向
重定向符号 |
含义 |
>或1> |
标准输出重定向,先清空文件内容然后写入 |
>>或1>> |
标准输出追加重定向,把内容追加到文件结尾 |
2> |
标准错误输出,先清空文件,然后写入错误信息到文件 |
2>> |
标准错误追加输出重定向,把错误信息追加到文件 |
>oldboy.log 2>$1 |
把标准错误输出与标准输出合并,让后重定向到oldboy.log |
>>oldboy.log 2>$1 |
把标准错误输出与标准输出合并,追加到oldboy.log |
&>oldboy.txt |
正确输出和错误输出重定向到oldboy.txt |
&>>oldboy.txt |
正确输出和错误输出追加到oldboy.txt |
<或0< |
标准输入重定向 |
<<或0<< |
标准输入追加 |
标准输出1
[root@lichengbo-nb ~]# echo oldboy > oldboy.txt [root@lichengbo-nb ~]# echo oldboy 1> oldboy.txt
标准错误输出2
[root@lichengbo-nb ~]# eco lidao >lidao.txt -bash: eco: command not found [root@lichengbo-nb ~]# eco lidao 2>lidao.txt [root@lichengbo-nb ~]# cat lidao.txt -bash: eco: command not found
#案例01 输出1 2 3 ...10重定向到oldboy.txt
[root@lichengbo-nb ~]# echo {1..10} >oldboy.txt [root@lichengbo-nb ~]# cat oldboy.txt 1 2 3 4 5 6 7 8 9 10
#案例02 输出1 2 3 ...10追加向到oldboy.txt
[root@lichengbo-nb ~]# echo {1..10} >>oldboy.txt [root@lichengbo-nb ~]# cat oldboy.txt 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
#案例03 执行个错误命令,把错误信息重定向到error.log中
[root@lichengbo-nb ~]# awk-lidao -bash: awk-lidao: command not found [root@lichengbo-nb ~]# awk-lidao 2>error.log [root@lichengbo-nb ~]# cat error.log -bash: awk-lidao: command not found
#案例04 执行个错误命令,把错误信息追加到error.log中
[root@lichengbo-nb ~]# awk-lidao 2>>error.log [root@lichengbo-nb ~]# cat error.log -bash: awk-lidao: command not found -bash: awk-lidao: command not found
#案例05 企业案例 未来无论执行的命令是错误的还是正确的都把信息追加到all.log中
方法一:
[root@lichengbo-nb ~]# echo lidao >>all.log [root@lichengbo-nb ~]# cho lidao >>all.log 2>>all.log [root@lichengbo-nb ~]# cat all.log lidao -bash: cho: command not found
方法二:
[root@lichengbo-nb ~]# cho lidao >>all.log 2>&1 [root@lichengbo-nb ~]# cat all.log lidao -bash: cho: command not found -bash: cho: command not found -bash: cho: command not found -bash: cho: command not found
简单写法:
[root@lichengbo-nb ~]# cho lidao >>all.log 2>&1 [root@lichengbo-nb ~]# cho lidao &>>all.log
- 标准输入
#<< 与cat一起使用 案例01
cat <<表示想文件中追加多行内容
EOF结束标记 end of file
注意事项:EOF两边不要有多余的内容,空格
这种批量写入的方式,先找地方写好了,然后在linux里面执行
[root@lichengbo-nb ~]# cat >oldboy.txt<<EOF > 内容 > 你过来啊 > 你过来 > 你来 > 你 > EOF [root@lichengbo-nb ~]# cat oldboy.txt 内容 你过来啊 你过来 你来 你
#< 与特定命令使用 案例02 tr
[root@lichengbo-nb ~]# echo {a..z} >oldboy.txt [root@lichengbo-nb ~]# cat oldboy.txt a b c d e f g h i j k l m n o p q r s t u v w x y z [root@lichengbo-nb ~]# tr 'a-z' 'A-Z' oldboy.txt tr: extra operand ‘oldboy.txt’ Try 'tr --help' for more information. [root@lichengbo-nb ~]# tr 'a-z' 'A-Z' <oldboy.txt A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
#xargs
[root@lichengbo-nb ~]# seq 10 >num.txt [root@lichengbo-nb ~]# cat num.txt 1 2 3 4 5 6 7 8 9 10 [root@lichengbo-nb ~]# xargs <num.txt 1 2 3 4 5 6 7 8 9 10 [root@lichengbo-nb ~]# xargs -n2 <num.txt 1 2 3 4 5 6 7 8 9 10
小结:
- 特殊符号:必会单引号,双引号不加引号区别(反引号)
- 特殊符号:重定向符号系列:> >> 对错放一起
- 特殊符号:重定向符号系列:< tr << cat
8.特殊符号补充
8.1 位置相关的特殊符号
. 当前目录 cp /etc/hosts . #把/etc/hosts 复制到当前目录
. . 当前目录的上级目录 cd . .
~ 当前用户家目录 cd ~ 或 cp /etc/hosts ~ 把文件复制到当前用户家目录
/ 根目录
cd – 返回上一次所在目录
8.2 (了解)其他特殊符号
# 注释符号,root命令提示符
$ 取值(取出变量的值),普通用户的提示符
9. 通配符
- 通配符:匹配文件名(参数)
通配符 |
||
* |
所有,任何内容 |
|
{ } |
生成序列 |
|
? |
任意一个字符 |
|
[ ] |
||
[^] |
- * 所有,任何内容 *.txt *.log *.avi
- { } 生成序列
基本用法:
[root@lichengbo-nb /oldboy]# echo {1..10} 1 2 3 4 5 6 7 8 9 10 [root@lichengbo-nb /oldboy]# echo {01..10} 01 02 03 04 05 06 07 08 09 10 [root@lichengbo-nb /oldboy]# echo oldboy{01..10} oldboy01 oldboy02 oldboy03 oldboy04 oldboy05 oldboy06 oldboy07 oldboy08 oldboy09 oldboy10 [root@lichengbo-nb /oldboy]# echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z [root@lichengbo-nb /oldboy]# echo {1,5,9} 1 5 9 [root@lichengbo-nb /oldboy]# echo oldboy{1,5,9} oldboy1 oldboy5 oldboy9
通过{ }进行备份:
只有单独备份一个文件时有用
[root@lichengbo-nb /oldboy]# echo oldboy.txt{,.bak} oldboy.txt oldboy.txt.bak [root@lichengbo-nb /oldboy]# #cp oldboy.txt{,.bak} [root@lichengbo-nb /oldboy]# echo A{B,C} AB AC [root@lichengbo-nb /oldboy]# echo A{,C} A AC
?通过任意一个字符查找文件
[root@lichengbo-nb /oldboy]# ll /bin/? -rwxr-xr-x. 1 root root 41488 Aug 20 2019 /bin/[ -rwxr-xr-x. 1 root root 19912 Oct 1 2020 /bin/w
10. 正侧表达式
- 目标:掌握常见的正则表达式符号,通过三剑客使用。
- 学习:时间最长,随着使用时间逐渐理解与掌握
- 难点:变化多端
- 学习建议:通过案例理解用法与格式,通过习题进行练习
10.1 正则是啥?
- 网站如何验证输入内容是否符合格式:身份证号码、手机号
- 通过三剑客进行过滤,精确过滤?
- 正则表达式
- 正则表达式核心:方便人们通过命令,软件进行过滤或判断格式
10.2学习正则注意事项
- 刚开始学习,建议通过正则网站和grep一起理解与观察,正则符号含义与特点
- 正则符号都是英文符号。
- 给grep命令设置好别名,过滤的时候有红色(C7自带)。
10.3正则vs通配符
共同点 |
支持的命令 |
匹配的内容不通 |
|
正则 |
用于过滤字符 |
三剑客,高级语言Python,golang,java |
过滤字符(文件内容) |
通配符 |
让人感觉是用于过滤字符 |
Linux下面大部分命令都可以使用 |
匹配文件名 |
10.4正则概述
- RE正则,regular expression
分类 |
||
基础正则(BRE) |
^ $ . * [ ] [^] |
|
扩展正则(ERE) |
| ( ) { } ? |
10.5基础正则-详解
- 环境准备
I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com my qq is 49000448 not 4900000448. my god ,i am not oldbey,but OLDBOY!
1)^ 以什么开头的行
案例01 过滤以my开头的行
[root@lichengbo-nb /oldboy]# grep '^my' re.txt my blog is http://oldboy.blog.51cto.com my qq is 49000448 my god ,i am not oldbey,but OLDBOY! [root@lichengbo-nb /oldboy]# grep '^my ' re.txt [root@lichengbo-nb /oldboy]#
2)$ 以什么结尾的行
案例02 过滤出以8结尾的行
[root@lichengbo-nb /oldboy]# grep '8$' re.txt my qq is 49000448
案例03 过滤出以m结尾的行
#说明:文件结尾的地方可能还有特殊符号,无法看到
#cat -A 查看即可
[root@lichengbo-nb /oldboy]# cat re.txt I am oldboy teacher! I teach linux. : I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com my qq is 49000448 not 4900000448. my god ,i am not oldbey,but OLDBOY! [root@lichengbo-nb /oldboy]# cat -A re.txt I am oldboy teacher!$ I teach linux.$ $ :$ I like badminton ball ,billiard ball and chinese chess!$ my blog is http://oldboy.blog.51cto.com $ $ $ our size is http://blog.oldboyedu.com $ my qq is 49000448$ not 4900000448.$ $ $ my god ,i am not oldbey,but OLDBOY!$ [root@lichengbo-nb /oldboy]# cat -A re.txt I am oldboy teacher!$ I teach linux.$ $ :$ I like badminton ball ,billiard ball and chinese chess!$ my blog is http://oldboy.blog.51cto.com $ $ $ our size is http://blog.oldboyedu.com $ my qq is 49000448$ not 4900000448.$ $ $ my god ,i am not oldbey,but OLDBOY!$ [root@lichengbo-nb /oldboy]# grep 'm $' re.txt my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com
3)^$ 空行(这行没有任何字符)
案例04 过滤出文件中的空行并显示行号
[root@lichengbo-nb /oldboy]# grep -n '^$' re.txt 3: 7: 8: 12: 13: [root@lichengbo-nb /oldboy]# cat re.txt I am oldboy teacher! I teach linux. : I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com my qq is 49000448 not 4900000448. my god ,i am not oldbey,but OLDBOY!
案例05 排除文件中的空行(遇到空行不显示)
[root@lichengbo-nb /oldboy]# grep -v '^$' re.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com my qq is 49000448 not 4900000448. my god ,i am not oldbey,but OLDBOY! [root@lichengbo-nb /oldboy]# grep -nv '^$' re.txt 1:I am oldboy teacher! 2:I teach linux. 4:I like badminton ball ,billiard ball and chinese chess! 5:my blog is http://oldboy.blog.51cto.com 8:our size is http://blog.oldboyedu.com 9:my qq is 49000448 10:not 4900000448. 13:my god ,i am not oldbey,but OLDBOY!
4).(点)任意一个字符
案例06 熟悉 过滤任意一个字符
5)\ 转义字符脱掉马甲打回原形。去掉特殊含义
案例 07 过滤出文件中以 . 结尾的行
[root@lichengbo-nb /oldboy]# grep '\.$' re.txt I teach linux. not 4900000448.
扩展
转义字符系列(元字符) |
|
\n |
回车 |
\t |
Tab键 |
扩展案例01 显示oldboy回车oldboy回车oldboy tab键 lidao回车李导
[root@lichengbo-nb /oldboy]# echo 'oldboy \n oldboy' oldboy \n oldboy [root@lichengbo-nb /oldboy]# echo -e 'oldboy \n oldboy \n oldboy \n oldboy \t lidao' oldboy oldboy oldboy oldboy lidao [root@lichengbo-nb /oldboy]# #echo -e 支持转义字符
6)* 前一个字符,连续出现(重复)了0次或0次以上
案例08 熟悉 过滤出连续出现的0
[root@lichengbo-nb /oldboy]# grep '0*' re.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com my qq is 49000448 not 4900000448. my god ,i am not oldbey,but OLDBOY! [root@lichengbo-nb /oldboy]# grep -o '0*' re.txt 000 00000 [root@lichengbo-nb /oldboy]# 在正则表达式表示连续的时候连续出现特点:贪婪性 [root@lichengbo-nb /oldboy]# 尽可能多的匹配字符
- 核心:
- 理解:连续出现
- 理解:贪婪性
7) .* 所有,任何内容
案例09 过滤出文件以任意字符开头一直到http行
[root@lichengbo-nb /oldboy]# grep '^.*http' re.txt my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com
案例10 理解贪婪性 过滤出文件以任意字符开头一直到o(字母的行)
[root@lichengbo-nb /oldboy]# grep '^.*o' re.txt I am oldboy teacher! I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com not 4900000448. my god ,i am not oldbey,but OLDBOY!
8)[abc] 匹配a或b或c,表示1个整体,相当于是一个字符
演示
[root@lichengbo-nb /oldboy]# [root@lichengbo-nb /oldboy]# grep '[abc]' re.txt I am oldboy teacher! I teach linux. I like badminton ball ,billiard ball and chinese chess! my blog is http://oldboy.blog.51cto.com our size is http://blog.oldboyedu.com my god ,i am not oldbey,but OLDBOY! [root@lichengbo-nb /oldboy]# grep -o '[abc]' re.txt a b a c
案例11 过滤文件中的小写字母
案例12 过滤文件中的小写字母或大写字母
[root@lichengbo-nb /oldboy]# grep '[a-zA-Z]' re.txt
简写:
[root@lichengbo-nb /oldboy]# grep '[a-Z]' re.txt
案例13 过滤文件中的小写字母或大写字母或数字
[root@lichengbo-nb /oldboy]# grep '[a-zA-Z0-9]' re.txt
简写:
[root@lichengbo-nb /oldboy]# grep '[0-Z]' re.txt
案例14 过滤出以8或 . 或!结尾的行
[root@lichengbo-nb /oldboy]# grep '[8.!]$' re.txt
9)[^] [^abc] 过滤出不是a或不是b或不是c的内容。一个整体相当于一个字符
案例15 熟悉 排除不匹配文件中的小写字母
[root@lichengbo-nb /oldboy]# grep '[^a-z]' re.txt
10)小结BRE
基础正则符号 |
|
^ |
开头 |
$ |
结尾 |
^$ |
空行 |
. |
任意一个字符 |
* |
前一个字符,连续出现(重复)了0次或0次以上 |
.* |
所有,任何内容 |
[ ] |
[abc] a或b或c |
[^] |
[^abc]过滤出不是a或b或c的内容 |
\ |
转义字符 |
10.6扩展正则-详解-ERE
- 扩展正则需要使用:egrep或grep -E 、sed -r 、awk
1)| 或者
案例01 取出文件中包含oldboy或blog的行
方法一 [root@lichengbo-nb /oldboy]# egrep 'oldboy|blog' re.txt 方法二 [root@lichengbo-nb /oldboy]# grep -E 'oldboy|blog' re.txt
扩展方法:
[root@lichengbo-nb /oldboy]# grep 'oldboy\|blog' re.txt
注意事项:
[ ] 里面的内容都是独立的[oldboy]匹配o或l或d... 建议:匹配单个字符
| 可以是独立也可以是整体a|b|c oldboy|lidao 建议: 匹配单词
2)+ 前一个字符,连续出现1次及1次以上
- 工作建议:一般与[ ]搭配
演示 取出连续出现的0
案例02 取出文件中连续出现的数字
- 匹配数字 [0-9]
- 连续出现 +
[root@lichengbo-nb /oldboy]# egrep '[0-9]+' re.txt [root@lichengbo-nb /oldboy]# egrep -o '[0-9]+' re.txt 只显示数字
案例03 取出文件中的单词
- 单词 连续出现的字母
- 字母[a-Z]
- 连续 +
[root@lichengbo-nb /oldboy]# egrep '[a-Z]+' re.txt [root@lichengbo-nb /oldboy]# egrep -o '[a-Z]+' re.txt 只显示字母或单词
3)()表示被括起来的内容是个整体;表示反向引用(后向引用)一般在sed中
案例 (熟悉) 过滤出oldboy或oldbey的行
方法一 [root@lichengbo-nb /oldboy]# egrep 'oldb(o|e)y' re.txt 方法二 [root@lichengbo-nb /oldboy]# egrep 'oldb[oe]y' re.txt
后向引用(反向引用)sed中使用
4){ } 🡺 o{n,m}前一个字符o连续出现至少n次最多m次。
- o{n,m}前一个字符o连续出现至少n次最多m次。
- o{n}前一个字符o连续出现至少n次
- o{n,}前一个字符o连续出现至少n次。
- o{,m}前一个字符o连续出现最少m次。
案例:(熟悉)
[root@lichengbo-nb /oldboy]# egrep '0{1,4}' re.txt [root@lichengbo-nb /oldboy]# egrep -o '0{1,4}' re.txt 0 [root@lichengbo-nb /oldboy]# egrep '0{3,4}' re.txt [root@lichengbo-nb /oldboy]# egrep '0{3}' re.txt
5)?前一个字符出现0次或1次
[root@lichengbo-nb /oldboy]# egrep 'gd|god' wenhao.txt gd god [root@lichengbo-nb /oldboy]# egrep 'go?d' wenhao.txt gd god
6)小结
| |
或者 |
+ |
连续出现1次及1次以上 |
() |
整体;后向引用 |
{} |
前一个字符连续出现n次到每次 |
? |
前一个字符连续出现0次或1次 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人