Linux07 文件查找(locate、find )及特殊权限(SUID、SGID、Sticky)
文件查找
locate
locate:非实时,模糊匹配,查找是根据全系统文件数据库进行的;速度快。
# updatedb,手动生成文件数据库
安装locate命令:
更新locate数据库:
find
find:实时查找,精确,遍历指定目录中的所有文件完成查找,速度慢;支持众多查找标准(文件名、文件权限、文件类型、基于正则表达式对文件名做匹配的查找),很强大。
# 用法
find 查找路径 查找标准 查找到以后的处理运作
查找路径: 默认为当前路径
查找标准:默认为指定路径下的所有文件,包括隐藏文件
处理运作:默认为显示
匹配标准:
-name 'FILENAME':对文件名做精确查找
find /etc -name 'passwd'
文件名通配:
*:任意长度的任意字符
find /etc -name 'passwd*' # 以passwd开头的文件
find /etc -name '*passwd' # 以passwd结尾的文件
find /etc -name '*passwd*' # 文件名中包含passwd的文件
?:
[]:
-iname 'FILENAME':文件名匹配时不区分大小写
-regex PATTERN: 基于正则表达式进行为文件名匹配
-user USERNAME:根据属主查找
find /tmp -user user1
-group GROUPNAME:根据属组查找
-uid UID:根据UID查找
如果用户被删除(userdel -r 用户名),用户在/tmp下创建的文件的属主的名称就会变成当初创建用户时的uid,所以这时如果再查找这个被删除用户/tmp下的文件时,只能根据uid查找;
find /tmp -uid 1000
-gid GID:根据GID查找
find /tmp -gid 1000
-nouser:查找没有属主的文件
find /tmp -nouser
-nogroup:查找没有属组的文件
find /tmp -nogroup
-type 要查找的类型
f:普通文件
d:目录
c:字符设备
b:块设备
l:连接文件
p:管道设备
s:套接字设备
find /tmp -type d
find /tmp -type s
-size: 文件尺寸
K,M,G 文件大小单位
+nK,+nM,+nG # 表示查找大于n k、M、G的文件
find /etc -size 1k # 所有小于1K的文件
find /etc/ -size 10M # 显示所有在9~10M之间的文件,或者略大于10M的文件,都默认是10M的文件
find /etc/ -size 10k -ls # 查找/etc下9k~10k之间,或略大于10k的文件,并显示文件尺寸
find /etc -size +10k -ls # 查找大于10k的文件按
find /etc -size -10k -ls # 查找小于10k的文件
组合查找条件:
-a:与关系
-o:或关系
-not:非关系
find /tmp/ -nouser -a -type d -ls
find /tmp -uid 1000 -a -nouser -ls
find /tmp -nouser -o -type d -ls
find /tmp -not -type d
/tmp目录,不是目录,并且还不是套接字类型的文件
find /tmp -not -type d -a -not-type s || find /tmp -not \( -type d -o -type s\ )
属主不是user1,或者类型(-type)不是目录:
find ./ -not -user user1 -o -not -type d
find ./ -not \( -user user1 -a -type d \)
根据时间查找:
-mtime:在这个时间修改了
-ctime:在这个时间改变了
-atime:在这个时间访问了
find /tmp -atime +30 # 30天内没访问
[+|-]#
eg:
+7:表示至少有7天没访问了
-7:表示在七天内有访问
7:在
-mmin
-cmin
-amin
[+|-]#
find /tmp -admin 5
find /tmp -admin +5
eg:
+7:表示至少有7分钟没访问了
-7:表示在7分钟内有访问
7:刚好在第5分钟的时候访问了
-perm MODE: 精确匹配
/MODE:任意一位匹配即满足条件,每一位之间是或关系
-MODE: 文件权限能完全包含此MODE时才能显示,每一位之间是与关系
-644: rw-r--r--
644:
755: rwxr-xr-x # 可以
750: rwxr-x--- #
find ./ -perm -644 # 文件权限是644、755的完全包含644,所以会被显示出来
动作:
-print: 默认是print,显示出来
-ls:类似ls -l的形式显示每一个文件的详细信息
-ok COMMAND {} \; # 每一次操作都需要用户确认
-exec COMMAND {} \; # 不需要用户确认 使用时需要{}占位符
find ./ -prem -006 -exec chmod o-w {} \; # {}表示find命令找到的符合的文件名,\;固定格式
find ./ -type d -ok chmod +x {} \;
查找属组有写权限的文件并给文件名添加后缀.new
find ./ -perm -020 -exec mv {} {}.new \;
找到当前文件夹下的.sh结尾的文件,并将other用户的执行权限去掉;
find ./ -name '*.sh' -exec chmod o-x {} \;
找到当前文件夹下以.sh结尾的文件,并且所有角色(u,g,o)都有执行权限的文件的other执行权限去掉
find ./ -name '*.sh' -a -perm -111 -exec chomod o-x {} \;
用户被删除,根据用户的UID查找用户之前再/tmp下创建的文件:
查看某个文件夹中没有属主和属组的文件,在没有属主和属组的文件,为了防止普通用户也能访问,最好时把权限收回,防止这种漏洞导致其他用户也能操作此文件。
根据类型查找:
根据文件尺寸查找文件:
组合条件查找:
find练习
1.查找/var目录下属主为root并且属主为mail的所有文件;
find /var -user root -a -group mail
2.查找/usr目录下不属于root,bin,或student的文件;
find /usr -not -user root -a -not -user bin -a -not -user student
find /usr -not \( -user root -o -user bin -o -user student \)
3.查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;
find /etc -mtime -7 -a -not \( -user root -o -user -student \)
find /etc -mtime -7 -not -user root -a -not -user student
4.查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;
find \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;
5.查找/etc目录下大于1M 的文件,并将其文件名写入/tmp/etc.largefiles文件中;
find /etc -size +1M >> /tmp/etc.largefiles
find /etc -size +1M exec echo {} >> /tmp/etc.largefiles \;
find /etc -size +1M | xargs echo >> /tmp/etc.largefiles # xargs比exec要强大,不需要占位符,也不需要结束符\; 但是需要管道 | 将执行后的命令传给xargs,xargs后跟要执行的命令
6.查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
find /etc -not -prem -222 -ls
特殊权限(SUID、SGID、Sticky)
SUID:运行某程序时,相应进程的属主是程序文件自身的属主,而不是这个进程的发起者(启动者);
管理员账户的属主添加s权限,之后其他用户也将拥有执行权限:
比如:
chmod u+s /bin/cat # 在管理员账户下添加属主权限s
本来只有管理员才有的查看/etc/shadow的权限,现在普通用户也将能查看这个文件了,这回带来极大安全隐患;所以这个s权限不要随意添加。
su - 普通用户
cat /etc/shadow # 添加s权限之前没权限,现在也能查看这个文件了。
那为什么我们的 passwd命令有s权限呢?因为普通用户也有自己修改密码的需求
去掉s权限:
su - root
chmod u-s /bin/cat
SGID:运行某程序时,相应进程的属组是程序文件自身的属组,而不是这个进程的发起者所属的属组(启动者);
chmod g+s FILE
chmod g-s FILE
现有如下场景:
有以下用户,develop team hadoop hbase hive,建立一个临时文件,这些用户都可以往 /tmp/project这个文件中写,甚至root用户建立一个文件,其他用户也都能往这个文件按中写,如何实现?
useradd hbase
useradd hadoop
useradd hive
mkdir /tmp/project
groupadd developteam
chown -R :developteam /tmp/project # 递归的方式将project文件夹及其下的文件和文件夹的属组都修改为developteam
usermod -a -G developteam hadoop # 修改附加组,在原有的附加组基础之上添加新的组 -a -G 联用
usermod -a -G developteam hbase
usermod -a -G developteam hive
su - hadoop
cd /tmp/project
touch a.hadoop # 没有写权限,创建不了;需要给project添加一个写权限,这个权限只能root用户可以添加,所以要切换到root用户。
su - root
chmod g+w /tmp/project
su - hadoop
touch /tmp/project/a.hadoop
su - hbase
touch /tmp/project/a.hbase
此时,hadoop用户所创建的的文件的属组是hadoop,hbase用户创建的文件的属组是hbase,hadoop不能编辑hbase用户创建的文件,hbase也不能编辑hadoop创建的文件;怎么办?
su - root
chmod g+s /tmp/project/ # 组加上s全限
ls -ld /tmp/project
drwxrwsr-x 2 root developteam 4096 Mar 7 17:58 /tmp/project .
su - hadoop
cd /tmp/project
touch b.hadoop
ls -l
-rw-rw-r-- 1 hadoop developteam 0 Mar 7 17:21 b.hadoop # 在project目录下创建的文件或文件夹不再是用户的基本组,而是目录的基本组。当访问某个目录或者某个文件的时候,不再以自己的属主和基本组为身份,而以这个文件自身的属主和基本组作为其身份。
su - hbase
cd /tmp/project
touch b.hbase
ls -l
-rw-rw-r-- 1 hbase debelopteam 0 Mar 7 17:58 b.hbase # 在project目录下创建的文件或文件夹不再是用户的基本组,而是目录的基本组。当访问某个目录或者某个文件的时候,不再以自己的属主和基本组为身份,而以这个文件自身的属主和基本组作为其身份。
此时,hbase 和 hadoop 两个用户在project文件夹下创建文件和文件夹都可以相互访问和编辑了。但是,有一个坏处,就是当前用户还可以删除别人创建的目录和文件,需要用下面的Sticky做进一步处理。
Sticky:在一个公共目录,每个人都能创建文件,删除自己的文件,但是不能删除别人创建的文件。
chmod o+t DIR
chmod o-t DIR
root用户下:
chmod o+t /tmp/project
ls -ld /tmp/project
drwxrwsr-t 2 root debelopteam 4096 Mar 7 18:02 /tmp/project # 在o上有t了,原有执行权限小写t,否则大写T
切换到普通用户hadoop,删除hbase在/tmp/project创建的文件:
rm b.hbase
rm: cannot remove 'b.hbase':Operation not permitted.
rm b.hadoop # 可以删除自己在/tmp/project创建的b.hadoop
000:0
001: 1 #有Sticky
010: 2 # GUID
011: 3 # SGID和Sticky
100: 4 # SUID
101: 5 # # SUID和Sticky
110: 6 # 有SUID、SGID,没有Sticky
111: 7 # 有SUID、SGID、Sticky
chmod 1755 /backup/test # 表示test目录的权限是1755,1表示Sticky
chmod 2755 /backup/test # 带SGID
chmod 3755 /backup/test # 带SGID和Sticky
chmod 5755 /backup/test # SUID+Sticky
所以,
umask 0022 的第一位0对应的就是SUID、SGID、Sticky