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 -55天内访问过
            -atime +55天前访问过

        -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---644755包含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,否则显示SSGID :启动进程的属组不再是当前启动该进程的用户的基本组了,而是该程序文件本身的属组;
    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
显示结果形如:
BASH3users,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 协议》,转载必须注明作者和本文链接
六月的风
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!