Linux杂记 查找与特殊权限位
let i=$[$i+1]
let i+=1
let i++
let sum=$[$sum+$i]
let sum+=$i
-= i--
++i --i
*=
/=
%=
[root@localhost ~]# i=14
[root@localhost ~]# let i%=3
计算100以内所有能被3整除的正整数的和(就是 number%3=0)
sum=0
for i in {1..100}; do
let j=$[$i%3]
[ $j -eq 0 ] && echo $i && let sum+=$i
done
echo "-------------"
echo $sum
计算100以内所有奇数的和,以及所有偶数的和,分别显示之;
declare -i evensum=0
declare -i oddsum=0
for i in {1..100}; do
if [ $[$i%2] -eq 0 ]; then
let evensum+=$i
else
let oddsum+=$i
fi
done
echo "Odd sum is: $oddsum."
echo "Even sum is: $evensum."
文件查找:
find:实时查找,精确,通过遍历指定目录中的所有文件完成查找,速度慢
find [path] 查找标准 action
[查找路径] : 可省略,默认表示当前目录
查找标准(匹配标准) : 默认为指定路径下的所有文件(及其子目录的)
查找到后的处理动作 : action,默认为显示到屏幕上
查找标准(匹配标准):
-name 'filename' : 对文件名做精确匹配
文件名通配:
* 任意长度,任意字符
? 任意单个字符
[] 范围内的单个字符
find /etc -name 'passwd'
/etc下以passwd开头的所有文件 find /etc -name "passwd*"
/etc下以passwd结尾的所有文件 find /etc -name "*passwd"
/etc下包含passwd的所有文件 find /etc -name "*passwd*"
注意:
-name 'filename' : 是严格区分大小写的
-iname 'filename':文件名匹配时不区分大小写
-regex pattern : 基于正则,进行文件名匹配
-user username :根据文件属主查找
find /tmp -user hadoop
find /tmp -user student
-group groupname : 根据文件属组查找
-uid UID :根据uid查找
-gid GID : 根据gid查找
注意:一个用户被删除后,假如还有之前他创建的文件存在,则该文件的属主,同名称的属组,都变为数字的uid,gid了;
所以可以通过上面的-uid,-gid查找;
find /tmp -uid 2003
-nouser : 查找没有属主的文件
find /tmp -nouser
-nogroup : 查找没有属组的文件
-type f(common file)/d(directory)/c(character)/b(block)/l(link)/p(pipe)/s(socket):根据文件类型查找
find /tmp -type d
find /tmp -type s
-size [+|-]#k/M/G : 按大小查找,默认单位为字节;
+10k : 大于10k
10k : 9k~10k的
-10k :所有小于10k的
find /etc -size 10k -ls
组合条件查找:
-a : and ;默认
-o :or
-not :!
默认就是与条件
find /tmp -nouser -a -type d -ls
find /tmp -nouser -o -type d -ls
非目录的文件:
find /tmp -not -type d
不是目录并且也不是套接字?
find /tmp -not -type d -a -not -type s
/tmp/test目录下,属主不是user1,也不是user2的文件?
find /tmp/test -not -user user1 -a -not -user user2
find /tmp/test -not \( -user user1 -o -user user2 \)
/tmp/test目录下,属主不是user1,或者类型不是目录的文件?
find /tmp/test -not -user user1 -o -not -type d
find /tmp/test -not \( -user user1 -a -type d \)
根据时间查找:
-mtime [+|-]# 修改的 单位是天
-ctime [+|-]# 改变的
-atime [+|-]# 访问的
-atime 5 :离现在为止,刚好5天
-atime -5 :5天内访问过
-atime +5 :5天前访问过
-mmin [+|-]# 分钟
-cmin [+|-]#
-amin [+|-]#
find ./ -amin -5 5分钟之内
find ./ -admin 5 刚好过去5分钟
find ./ -admin +5 5分钟之前
find /tmp -atime +7
find /tmp -atime +30
find /usr -atime +30
根据文件权限查找:
-perm mode 精确匹配
find ./ -perm 644
-perm /mode 只要有一位匹配即可
find ./ -perm /644
任意一位匹配即满足条件
-perm -mode 每一位都必须匹配才行;包含关系;文件的权限能完全包含此mode
如:755---644(755包含644即可匹配到)
对应的位必须完全包含
find ./ -perm -001 查找其它人有x权限的
find ./ -perm -022 组和其他人有w权限的
find ./ -perm /022 组或其他人有w权限的
find ./ -perm -007
动作:匹配查找到后的执行动作
-print 显示 ; 默认
-ls 类似ls -l 显示每一个文件的详细信息
-ok command {} \; 每一次操作都需要用户确认
-exec command {} \; 不需要确认
xargs
{} : 引用查找匹配到的文件
find ./ -perm -006 -exec chmod o-w {} \;
找到类型是目录的,把属主,属组,其它人都加上x权限?
find ./ -type d -ok chmod +x {} \;
查找属组有w权限的,改名为 "原名称.new"
find ./ -perm -020 -exec mv {} {}.new \;
查找/tmp目录下,.sh结尾的文件,且所有用户都有x权限的,然后去掉其他人的x权限?
find ./ -name "*.sh" -a -perm -111 -exec chmod o-x {} \;
1、查找/var目录下属主为root并且属组为mail的所有文件;
find /var -user root -group 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 -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不需要占位符{}, \;结尾了
6、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
find /etc -not -perm /222 -ls
特殊权限:
SUID
SGID
Sticky
进程的安全上下文
1. 用户启动进程,先看是否有权限执行进程的二进制程序文件;
2. 进程启动后,属主,属组是启动该进程的用户,及其基本组
3. 假如进程想要访问系统资源,如访问某个目录的内容,则要看该进程的属主,属组权限是否能访问了;
SUID :启动进程的属主不再是当前启动该进程的用户了,而是该程序文件本身的属主;
[root@localhost ~]# ll /bin/cat
-rwxr-xr-x 1 root root 25216 2011-07-22 /bin/cat
[root@localhost ~]# ll /etc/shadow
-r-------- 1 root root 1347 04-04 00:58 /etc/shadow
如果其他用户cat /etc/shadow是没有权限查看的,假如给 -rwsr-xr-x /bin/cat,其它用户能否查看?
chmod u+s file
chmod u-s file
如果file本身原来就有执行权限,则SUID显示为s,否则显示S;
SGID :启动进程的属组不再是当前启动该进程的用户的基本组了,而是该程序文件本身的属组;
chmod g+s file
chmod g-s file
特殊场景:开发团队。有用户 hadoop, hbase , hive;
开发目录:/tmp/project/
希望三个用户在/tmp/project/下都能创建文件;三个用户能彼此编辑查看对方的文件;
甚至管理员在这里创建文件,这三个用户也都能编辑;
但是不能删除别人的文件?---Sticky
Sticky :在一个公共目录,每个用户都可以创建文件,删除自己的文件,但不能删除别人的文件;
通常是对目录而言;
chmod o+t Dir
chmod o-t Dir
如果原文件有x权限---t,否则T
000 0
001 1 t
010 2 SGID
011 3 SGID,t
100 4 SUID
101 5 SUID,t
110 6 SUID,SGID
111 7 SUID,SGID,t
4:SUID
2:SGID
1:t
chmod 1755 /backup/test
1:Sticky
755
chmod 2755 /backup/test
2: SGID
chmod 3755 /backup/test
3: SGID , Sticky
chmod 5755 /backup/test
5: SUID, Sticky
umask 0022 第一位就是指特殊权限位
SUID:运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者;
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
练习:写一个脚本
写一个脚本,显示当前系统上shell为-s指定类型的用户,并统计其用户总数。-s选项后面跟的参数必须是/etc/shells文件中存在的shell类型,否则不执行此脚本。另外,此脚本还可以接受--help选项,以显示帮助信息。脚本执行形如:
./showshells.sh -s bash
显示结果形如:
BASH,3users,they are:
root,redhat,gentoo
#!/bin/bash
#
if [ $1 == '-s' ]; then
! grep "${2}$" /etc/shells &> /dev/null && echo "Invalid shell." && exit 7
elif [ $1 == '--help' ];then
echo "Usage: showshells.sh -s SHELL | --help"
exit 0
else
echo "Unknown Options."
exit 8
fi
NUMOFUSER=`grep "${2}$" /etc/passwd | wc -l`
SHELLUSERS=`grep "${2}$" /etc/passwd | cut -d: -f1`
SHELLUSERS=`echo $SHELLUSERS | sed 's@[[:space:]]@,@g'`
echo -e "$2, $NUMOFUSER users, they are: \n$SHELLUSERS"
${变量名}
本作品采用《CC 协议》,转载必须注明作者和本文链接