一、文件权限管理
Linux 一切皆文件
先从如何查看文件类型开始:
file filename 查看文件类型和编码
stat filename 查看文件详情
(一)文件属性
# ls -a
drwxr-xr-x 5 root root 39 Nov 17 11:16 aaa
-rw-------. 1 root root 5060 Jun 3 2020 anaconda-ks.cfg
-rw-r--r-- 1 root root 101 Dec 22 15:02 test.sh
[ 权限 ] [连接数] [拥有者] [所属组] [文件大小] [修改时间] [文件名]
[ 权限 ]
字符1 (文件类型)
d 目录
- 普通文件
l 链接文件
b 设备文件
c 串行端口文件
s socket 文件
字符2:10 (文件权限,3位一组)
字段意思
[拥有者] [同组用户] [其他用户]
字母意思
r 可读
w 可写
x 可执行
其他写法
rwx = 111(7)
特殊权限 (如果没有执行权限,那么就是大写字母)
SUID 位置在拥有者的执行权限上's',能拥有拥有者的权限,只能用在二进制文件上
SGID 位置在群组执行权限上's',能拥有群组权限
SBIT 位置在其他用户执行权限上't',针对目录有效,只有自己和root可以管理此目录
[连接数]
描述:记录着指向该目录的硬链接数目
文件 链接数: 1 + 硬链接文件数
空目录 链接数: 2 (. 和 ..)
非空目录 链接数: 目录个数(. .. 加其他目录总数)
备注:目录下新建文件不会增加目录链接数,因为文件是目录的内容,另外目录不支持硬链接
[拥有者]
文件拥有者
[所属组]
文件所属组
[文件大小]
文件大小,默认单位bytes
[修改时间]
创建时间或者修改时间,如果时间太长就只显示年份
ctime 文件创建时间
atime 文件读取时间
mtime 文件修改时间
[文件名]
文件名 如果开头有'.',就是隐藏文档,需要ls -a 才会显示
. 表示当前目录
.. 表示上层目录
上述文件有个'.',是ACL类型,没有限制就没有,这个可以在ls的源码中看到,另外就是SELinux开启的原因,这些后续记录;
- getfacl filename 查看是否是ACL的原因,没有明显不同就不是
- ls -Z filename 查看是否是SELiunx的原因,,开启后会有一些权限关联
关于SELinux的导致的文件权限多一个.的问题,可以从ls -Z filename可以看到,另外就是man selinux 8 可以看到相关的信息
FILE LABELING
All files, directories, devices ... have a security context/label associated with them. These context are stored in the extended attributes of
the file system. Problems with SELinux often arise from the file system being mislabeled. This can be caused by booting the machine with a non
SELinux kernel. If you see an error message containing file_t, that is usually a good indicator that you have a serious problem with file system
labeling.
The best way to relabel the file system is to create the flag file /.autorelabel and reboot. system-config-selinux, also has this capability.
The restorecon/fixfiles commands are also available for relabeling files.
连接文件:
软连接(可以理解为快捷方式):
ln -s /path/to/fileordir soft_link
建立一个独立的文件,而这个文件会让数据的读取指向它 link 的那个文件的文件名
软连接会创建一个inode ,inode 里面记录源文件的inode,所以如果源文件删除,软连接将无法访问;
在目录上面就能看到有新的inode , ls -il 可以看到inode 不同;stat 软连接文件可以看到block 块数量是0;
硬链接:
ln /path/to/file hard_link_name
直接指向inode(理解为,目录中新增了一笔记录文件名对应的inode,并不会新增inode);
硬链接不能跨文件系统;
硬链接不能链接到目录;
硬连接是会在文件系统索引上建一笔记录,就是文件名指向indode,可以理解为同一个inode文件不同文件名的入口;ls -il 可以看到硬连接文件inode和源文件一样,索引数量会增加;
所以,当block 变化时,硬连接和源文件看到的都一样,当其中某个文件被删除后,由于inode还有索引存在,文件系统就不会去删除block ,也就是文件还存在;
打个比方
将文件的 block 比喻成后端实例,inode比喻成域名,文件系统索引比喻成DNS
软链接可以类比,我们新建了一个域名,跳转指向目标文件的域名,来实现对后端实例的访问
硬链接可以类比,我们新建了一个域名,域名指向后端实例,来实现对后端实例的访问
文件删除的操作,DNS会去找这个域名是否还有域名直接指向相同的后端实例,如果有就只删除这个域名,没有就会删除域名以及后端实例(即删除block)
当软链接源文件被删除时,后端实例被删除,DNS能找到软连接域名但是找不到最终的后端实例,无法访问
当硬链接源文件被删除时,DNS还能直接通过域名找到后端实例,就不会被影响
(二)了解文件权限
理解文件权限 (目录也是文件)
文件权限
- r 读取文件内容
- w 编辑文件内容
- x 被系统执行的权限
目录权限
- r 读取目录结构 ls
- w 改变文件目录结构;创建和删除文件;重命名和移动文件
- x 用户能否进入该目录成为工作目录,**是目录rw的基础权限**
隐藏权限
常见属性:
- a 当设定 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据
- i 让一个文件『不能被删除、改名、设定链接也无法写入或新增数据!』包括root
不常见属性:
- A 文件或目录的atime不会被修改,可避免 I/O 较慢的机器过度的存取磁盘
- c 将会自动的将此文件『压缩』,读取时解压
- S 同步写入磁盘,默认是异步缓存写入
- s 删除将被完全删除,无法恢复
- u 删除后数据还在,可以恢复
注意:
- chattr 指令只能在Ext2/Ext3/Ext4 的 Linux 传统文件系统上面完整生效
- xfs 文件系统仅支援 AadiS
- 查看方式 lsattr
特殊权限
- SUID 位置在拥有者的执行权限上's',能拥有拥有者的权限,只能用在二进制文件上
- SGID 位置在群组执行权限上's',能拥有群组权限
- SBIT 位置在其他用户执行权限上't',针对目录有效,只有自己和root可以删除此目录下的文件
注意:S 或者 T 表示 执行权限是空的,就是没有x权限,也没有特殊权限
(三)管理文件权限
常见权限配置
chmod 改变文件权限
普通权限:
r:4 w:2 x:1 -:0
特殊权限:
SUID s:4 SGID s:2 SBIT t:1 -:0
配置权限:
Each MODE is of the form '[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+'.
chmod 0777/777 filename
chmod [a/u/o/g][+/-/=][r/w/x] file
递归给目录以及下所有文件和目录授权
chmod -R 777 dir
改变指定目录下,所有目录权限
find /dir -type d -exec chmod g+w {} \;
改变指定目录下,所有文件权限
find /dir -type f -exec chmod g+w {} \;
chown 改变文件所有者
chown user[:group] path/to/file
chown -R user:group path/to/dir
chgrp 改变文件属组(不常用)
chgrp groupname path/to/file
chgrp groupname -R path/to/dir
chattr 改变隐藏权限(介绍查看上一节特殊权限)
chattr [+-=] 权限 文件或目录
ACL 文件权限控制
setfacl -R -m d:u:usera:rwx /tmp/test 设置目录后期添加的所有文件,usera都有rwx权限
预设权限
umask 文件创建时初始权限
文件默认值 (*初始没有执行权限*)
-rw-rw-rw- (0666)
目录默认值
drwxrwxrwx (0777)
umaks 初始值 (0022)
计算方式:
umask 0022 即-----w--w-
文件: (-rw-rw-rw-) - (-----w--w-) = -rw-r--r--
目录: (drwxrwxrwx) - (d----w--w-) = drwxr-xr-x
二、压缩与解压
常见压缩类型
常见压缩类型
*.Z compress 程序压缩的文件;
*.zip zip 程序压缩的文件;
*.gz gzip 程序压缩的文件;
*.bz2 bzip2 程序压缩的文件;
*.xz xz 程序压缩的文件;
*.tar tar 程序打包的数据,并没有压缩过;
*.tar.gz tar 程序打包的文件,其中并且经过 gzip 的压缩
*.tar.bz2 tar 程序打包的文件,其中并且经过 bzip2 的压缩
*.tar.xz tar 程序打包的文件,其中并且经过 xz 的压缩
常见压缩软件
常见压缩软件
gzip
gzip 压缩
gunzip 解压
bzip2
xz
zip/unzip
压缩文件 zip -r myfile.zip ./* 递归压缩当前目录下的所有文件
解压文件 unzip -d /home/user myfile.zip 解压到指定目录下,如例子/home/user/目录下
常用打包软件
tar
常用打包命令 (tar.gz == tgz)
压 缩:tar -zcv -f filename.tar.gz 要被压缩的文件或目录名称
压缩带时间:tar -zcvf filename$(date +%Y%m%d).tgz dirname
解压缩:tar -zxv -f filename.tar.gz -C target_dir
解打包:tar -xvf filename.tar -C target_dir
注意:解压目录以及当前目录还有解压后的目录名,以及目录容量
如下报错应该是指当前目录没有可用空间了
tar -xf mysql_dump20211207.tar
tar: test20211207.sql: Wrote only 1536 of 10240 bytes
tar: Exiting with failure status due to previous errors
常用参数解析
-c :建立打包文件,可搭配 -v 来查看过程中被打包的档名
-x :解打包或解压缩的功能,可以搭配 -C (大写) 在特定目录解开
-z :透过 gzip 的支持进行压缩/解压缩:此时文件名最好为 *.tar.gz
-j :透过 bzip2 的支持进行压缩/解压缩:此时文件名最好为 *.tar.bz2
-J :透过 xz 的支持进行压缩/解压缩:此时文件名最好为 *.tar.xz
-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来
-f filename:-f 后面要立刻接要被处理的文件
-C 目录 :这个选项用在解压缩,若要在特定目录解压缩
不常用参数解析
--exclude=FILE:在压缩的过程中,不要将 FILE 打包
--newer-mtime="2015/06/17" 压缩修改时间比这个晚的文件
-p(小写) :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
-P(大写) :保留绝对路径,亦即允许备份数据中含有根目录存在之意,尽量不要用
注意事项:
- 打包参数:-c, -t, -x 不可同时出现
- 解压参数:-z, -j, -J 不可以同时出现
- 如果只是打包,生成的文件叫tarfile
- 如果是打包压缩,生成的文件叫tarball
三、文件查找
find
日志清理:
查找文件,并挨个提示是否删除
find /var/log/ -type f -name "messages-20*" -mtime +200 -exec rm -i {} \;
下面方式会直接删除检索到的结果,没有返回信息(比较危险)
find /var/log/ -type f -name "messages-20*" -mtime +200 -delete
参数解析:
/var/log/ 指定查找目录
-type f 指定查找文件类型,d 是目录
-o 或者
-maxdepth 2 表示最大搜索深度为2,这个参数最好放在前面不要放在末尾
-newer file 查找比file文件修改时间更晚的文件,类似的还有 -anewer and -cnewer,
-name "messages-20*" 文件名正则匹配
-mtime +200 修改日期据今200天以上的
1) 另外如果是 0 则是表示目前时间
2) 4 表示4天前的那一天内修改过的文件
3) +4 4天以前修改过的文件
4) -4 4天内修改过的文件
-mmin +60 修改时间是60分钟以前的,类似mtime
-exec commond {} \; 要执行的操作,'{}'后的空格不能少,符号不能少,末尾的'\;'不能多空格
-exec 一直到 \; 是关键词,因为;是特殊字符需要转义
{} 代替前面返回的参数
commond 不用放进引号里面,直接写就是,不支持别名*
-exec + 与 \; 的区别
find -type f
./A
./B
./C
./D
find -type f -exec echo {} +
./A ./B ./C ./D
等价于 echo ./A ./B ./C ./D
find -type f -exec echo {} \;
./A
./B
./C
./D
等价于:
echo ./A
echo ./B
echo ./C
echo ./D
locate
参数:
-i :忽略大小写的差异;
-c :不输出文件名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等
-r :后面可接正则表示法的显示方式
描述:
1、locate:依据 /var/lib/mlocate 内的数据库记载,找出用户输入的关键词文件名
2、updatedb:根据 /etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库文件