学习资源来自:www.magedu.com
学习记录过程中难免出现错误,如有发现,还望大神们指出。
示例操作部分有的与历史操作有关,如果先前的示例操作没有执行过的话,可能会有部分示例的操作无法执行。示例仅供参考(练习题在附录)。
文件查找:
locate(不常用):非实时,模糊匹配,根据全系统文件数据库进行查找,速度快;
# updatedb, 手动生成文件数据库(非常耗时)
find:实时,精确,支持众多查找标准,遍历指定目录中的所有文件完成查找,速度慢;
命令格式:find 查找路径 查找标准 查找到以后的处理运作
查找路径:默认为当前目录
查找标准:默认为指定路径下的所有文件
处理运作:默认为显示
匹配标准:
-name 'FILENAME':对文件名作精确匹配(严格区分大小写)
-iname 'FILENAME': 文件名匹配时不区分大小写
-regex PATTERN:基于正则表达式进行文件名匹配
-user USERNAME: 根据属主查找
-group GROUPNAME: 根据属组查找
文件名通配:
*:任意长度的任意字符
?
[]
示例:
find /etc -name 'passwd' ―― 在etc下精确匹配文件名是passwd的文件
find /etc -name 'passwd*' ―― 匹配文件名以passwd开头的文件
find /etc -name '*passwd' ―― 匹配文件名以passwd结尾的文件
find /etc -name '*passwd*' ―― 匹配文件名含有passwd字符串的文件
find /tmp -user hadoop ―― 根据属主查找
find /tmp -user student
(用户被删除后,此前该用户创建的文件属主就会修改为该用户的UID)
-uid UID: 根据UID查找
-gid GID: 根据GID查找
-nouser:查找没有属主的文件
-nogroup: 查找没有属组的文件
示例:
su - user1
cd /tmp
touch userone
ls -l
exit
ls -l /tmp
userdel -r user1
ls -l /tmp ―― userone文件的属主、属组显示为UID、GID
find /tmp -uid 5001 ―― 我的系统上UID显示的是5001
/tmp/userone
find /tmp -nouser
/tmp/userone
find /tmp -nogroup
/tmp/userone
-type (根据文件类型进行查找)
f: 普通文件
d:目录
c:字符
b:块
l:链接字
p:管道
s:套接字
示例:
find /tmp -type d ―― 查找tmp下文件类型为目录的文件
find /tmp -type s ―― 查找tmp下文件类型为套接字的文件
find /tmp -type s -ls ―― 进行验证(动作部分在下文)
-size [+|-] ―― 根据文件大小进行查找(不跟单位默认字节)(“+-” 相当于 “大于小于”)
#k:kb
#M:mb
#G:gb
示例:
find /etc -size 10k -ls (查找etc下大小在9-10k之间的文件)
find /etc -size -10k -ls (查找所有小于10k的文件)
组合条件查找:
-a:与
-o:或
-not :非
示例:
1、
find /tmp -nouser -a -type d -ls ―― 查找tmp目录下没有属主并且类型为目录的文件
find /tmp -nouser -o -type d ―― 查找没有属主或者类型为目录的文件
find /tmp -not -type d -ls ―― 查找非目录类型文件
find /tmp -not \( -type d -o -type s \) -ls―― 查找既不是目录类型也不是套接字类型的文件
2、
rm -rf /tmp/test
cd /tmp
mkdir /tmp/test
cd /tmp/test
touch a b c d
useradd user1
useradd user2
chown user1 a ―― 修改a的属主为user1
chown user2 b ―― 修改b的属主为user2
find ./ -user user1
find ./ -user user2
find ./ -not \( -user user1 -o -user user2 \) ―― 查找属主不是user1,也不是user2的文件
mkdir hello
mkdir hi
chown user1 hi
ls -l
find ./ -not \(-user user1 -a -type d\) 属主不是user1或者不是目录的文件――摩根定律
-mtime #:查找最近一次修改时间距现在#天的文件
-ctime #:查找最近一次改变时间距现在#天的文件
-atime #:查找最近一次访问时间距现在#天的文件
[+|-]#:距离现在[大于|小于]#天
-mmin #:查找最近一次修改时间距现在#分钟的文件
-cmin #:查找最近一次改变时间距现在#分钟的文件
-amin #:查找最近一次访问时间距现在#分钟的文件
[+|-]#:距离现在[大于|小于]#分钟
示例:(在/tmp/test下)
find ./ -amin -5 ―― 查找当前目录下最近一次修改时间距现在小于5分钟的文件
stat hi
stat hello
find ./ -amin +5 ―― 查找当前目录下最近一次修改时间距现在大于5分钟的文件
-perm MODE:通过精确匹配文件的权限查找文件
/MODE: 查找文件权限任意一位与MODE相匹配的文件
-MODE: 查找文件权限能完全包含此MODE的文件
例如:
匹配条件:-644(MODE)
644: rw-r--r--
755: rwxr-xr-x ―― MODE不匹配(只有同样是644才匹配),/MODE匹配,
―― -MODE匹配(rwxr-xr-x包含rw-r--r--)
750: rwxr-x--- MODE不匹配,/MODE匹配,-MODE不匹配
示例:(在/tmp/test下)
find ./ -perm 644
chmod 0-r a
find ./ -perm /644 -ls
find ./ -perm -644 -ls
chmod 006 b
ls -l
find ./ -perm /640
find ./ -perm -001 ―― 查找其他用户有执行权限的文件
动作:
-print: 显示(默认)
-ls:类似ls -l的形式显示每一个文件的详细
-ok COMMAND {} \; 每一次操作都需要用户确认 ―― {}代表前面已经查找到的文件集
-exec COMMAND {} \; 对查找到的文件执行指定命令(不需要确认)
示例:(示例中省略部分ls -l,操作中自行添加检验操作结果)
在当前目录下查找其他用户有wr权限的文件,并撤销其他用户这些文件的w权限:
find ./ -perm -006 -exec chmod o-w {} \;
find ./ -type d -ok chmod +x {} \; ―― 对目录文件添加所有用户的x权限
ls -l
chmod 666 b
chmod 664 d
ls -l
find ./ -perm -020 -exec mv {} {}.new \;对查找到的文件,在其文件名后面添加.new
cd
ls -l
find ./ -name "*.sh" -a -perm -111 -exec chmod o-x {} \; ―― 组合查找+修改权限
ls -l
特殊权限SUID等讲解
SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者;
chmod u+s FILE
chmod u-s FILE
如果FILE本身原来就有执行权限,则SUID显示为s;否则显示S;
SGID: 运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组;
chmod g+s FILE
chmod g-s FILE
Sticky: 在一个公共目录,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件;
chmod o+t DIR
chmod o-t DIR
示例:
1、SUID
ls -l /bin/cat ―― 查看cat的权限设置
ls -l /etc/shadow ―― 查看shadow的权限设置
useradd hadoop
su - hadoop
cat /etc/shadow ―― hadoop没有访问权限
exit
chmod u+s /bin/cat ―― 添加SUID权限给cat
ls -l /bin/cat
su - hadoop
whoami
cat /etc/shadow ―― 此时cat的属主是管理员而不是hadoop,具有管理员权限
exit
chmod u-s /bin/cat
2、
说明:有一个开发团队(develop team),有三个成员(hadoop,hbase,hive),
现希望三个成员可以互相访问、使用同一文件,每个人都可以创建文件、
删除自己的文件,但不能删除别人的文件。
useradd hbase
useradd hive
mkdir /tmp/project ―― 创建项目目录
groupadd developteam ―― 添加开发团队组
chown -R :developteam /tmp/project ―― 修改project的属组
usermod -a -G developteam hadoop ―― 向hadoop追加新的附组developteam
usermod -a -G developteam hbase
usermod -a -G developteam hive
su - hadoop
cd /tmp/project ―― project没有写权限
ls -ld
touch a.hadoop ―― 拒绝执行
exit
chmod g+w /tmp/project ―― 管理员给project添加写权限
su - hadoop
cd /tmp/project
touch a.hadoop ―― hadoop在project下创建文件a.hadoop
exit
su - hbase
cd /tmp/project
touch a.hbase ―― hbase在project下创建文件a.hbase
ls -l ―― a.hadoop、a.hbase的属主属组分别都是是hadoop和hbase
exit
SGID:
chmod g+s /tmp/project/ ―― 给project添加SGID权限
ls -ld /tmp/project/
su - hadoop
cd /tmp/project
touch b.hadoop ―― hadoop在project下创建文件b.hadoop
exit
su - hbase
cd /tmp/project
touch b.hbase ―― hbase在project下创建文件b.hbase
ls -l ―― 在project中创建的文件属组不再是创建文件的用户基本组而是目录的属组
―― b.hadoop、b.hbase的属组都是developteam
exit
su - hadoop
rm /tmp/project/b.hbase ―― hadoop可以删除b.hbase
ls -l /tmp/project/
exit
Sticky:
su - hbase
cd /tmp/project
touch b.hbase
exit
chmod o+t /tmp/project/ ―― 给project添加Sticky权限
ls -ld /tmp/project/
rm /tmp/project/b.hbase ―― hadoop不能删除b.hbase
rm /tmp/project/b.hadoop ―― 但是可以删除b.hadoop
由SUID、SGID、Strcky又组成了一组权限
000:
001:
...
110:
111:
例如:chmod 7755 /backup/test 最前面的权限7代表的是权限sst
遮罩码的MODE第一位就是特殊权限组
umask 0022
umask 0002