find命令,文件的特殊权限,if语句,linux磁盘管理和文件系统管理(第7天)

1:文件查找
在文件系统上查找符合条件的文件;
文件查找的工具有locate和find
      非实时查找(数据库查找):locate
      实时查找:find

locate:
依赖于事先构建的索引;索引的构建是在系统较为空闲时自动进行(周期性任务);手动更新数据库可以使用updatedb命令;
索引构建过程需要遍历整个根文件系统,极消耗资源;
工作特点:查找速度快;模糊查找;非实时查找;
locate KEYWORD  locate后面跟上关键字就可以搜索文件

find:
实时查找工具,通过遍历指定路径下的文件系统完成文件查找;
工作特点:查找速度略慢;精确查找;实时查找;
语法:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录;
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件;
处理动作:对符合条件的文件做什么操作;默认输出至屏幕;

查找条件:
根据文件名查找:
-name "文件名称"   其中文件名称支持使用glob,比如*, ?, [], [^]
-iname "文件名称"  不区分字母大小写
-regex "PATTERN"  以PATTERN正则表达式匹配整个文件路径字符串,而不仅仅是文件名称;

根据属主、属组查找:
-user USERNAME    查找属主为指定用户的文件;
-group GRPNAME   查找属组为指定组的文件;
-uid UserID      查找属主为指定的UID号的文件;
-gid GroupID   查找属组为指定的GID号的文件;
-nouser      查找没有属主的文件,如果此前用户创建了这些文件,之后该用户被删除,那么就会产生这种文件;
-nogroup   查找没有属组的文件;

根据文件类型查找:
-type TYPE:
      f: 普通文件
      d: 目录文件
      l: 符号链接文件
      s:套接字文件
      b: 块设备文件
      c: 字符设备文件
      p: 管道文件

组合条件:
与:-a
或:-o
非:-not, !
!A -a !B 相当于 !(A -o B)
A -o !B 相当于 !(A -a B)

例子:找出/tmp目录下,属主不是root,且文件名不是fstab的文件;
find /tmp \( -not -user root -a -not -name 'fstab' \) -ls
find /tmp -not \( -user root -o -name 'fstab' \) -ls

根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G
         #UNIT  表示(#-1, #]之内的文件
         -#UNIT 表示[0,#-1]之内的文件
        +#UNIT  表示(#,oo)的文件

根据时间戳,分为如下两种:
以“天”为单位;
-atime [+|-]#
      #     表示[#,#+1)天,比如#如果假设为3,表示从过去的第4天到第3天这一天的时间
      +#  表示 [#+1,oo],比如#如果假设为3,表示过去4天之前的
      -#   表示 [0,#),比如#如果假设为3,表示过去3天之内的
-mtime
-ctime
以“分钟”为单位:  同天为单位的
-amin
-mmin
-cmin

根据权限查找:
-perm [/|-]MODE
      MODE     精确权限匹配   例如  -perm  600
      /MODE   任何一类(u,g,o)对象的权限中只要能一位匹配即可;
      -MODE   每一类对象都必须同时拥有为其指定的权限标准;

处理动作:
-print  默认的处理动作,显示至屏幕;
-ls   类似于对查找到的文件执行“ls -l”命令;
-delete   删除查找到的文件;
-fls /path/to/somefile  查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \;  对查找到的每个文件执行由COMMAND指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认;
-exec COMMAND {} \;  对查找到的每个文件执行由COMMAND指定的命令; {}: 用于引用查找到的文件名称自身;

注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;
有些命令不能接受过多参数,此时命令执行可能会失败;另一种方式可规避此问题:
find | xargs COMMAND

练习:
1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
# find /var -user root -group mail

2、查找/usr目录下不属于root、bin或hadoop的所有文件或目录;
# find /usr -not -user root -a -not -user bin -a -not -user hadoop
# find /usr -not \( -user root -o -user bin -o -user hadoop \)

3、查找/etc目录下最周一周内其内容修改过,同时属主不为root,也不是hadoop的文件或目录;
# find /etc -mtime -7 -a -not -user root -a -not -user hadoop
# find /etc/ -mtime -7 -a -not \( -user root -o -user hadoop \)

4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件或目录;
# find / -nouser -a -nogroup -a -atime -7

5、查找/etc目录下大于1M且类型为普通文件的所有文件;
# find /etc -size +1M -type f

6、查找/etc目录下所有用户都没有写权限的文件;
# find /etc -not -perm /222

7、查找/etc目录下至少有一类用户没有执行权限的文件;
# find /etc -not -perm -111

8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件;
# find /etc/init.d -perm -111 -a -perm -002
# find /etc/init.d -perm -113

2:Linux文件系统上的特殊权限
SUID, SGID, Sticky

1)每个文件对于属主,属组,其他用户都有不同的访问权限,r,w,x

2)安全上下文:
      前提:进程有属主和属组,进程的属主就是进程的发起者,文件有属主和属组;
      任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
      启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组;
      进程访问文件时的权限,取决于进程的发起者:如果进程的发起者是文件的属主,则应用文件属主权限;如果进程的发起者,属于文件的属组,则应用文件属组权限;如果进程的发起者属于其他用户,应用文件“其它”权限。

3)SUID
      任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限;
      启动为进程之后,其进程的属主为原程序文件的属主;
      权限设定:
            chmod u+s FILE...
            chmod u-s FILE...
      举个例子:
      比如程序/usr/bin/passwd的权限为rwsr-xr-x,有了s权限,也就是SUID权限,假设系统上有centos用户,其他用户对/usr/bin/passwd是有执行权限的,所有centos也有执行权限,一旦centos执行了这个程序,则进程的属主不是centos这个发起者,而是程序/usr/bin/passwd的属主,也就是root,如此一来才能够通过这种方式修改/etc/shadow文件,因为/etc/shadow文件的权限为只有root用户可写。

4)SGID
      默认情况下,用户创建文件时,其属组为此用户所属的基本组;
      一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组;
      权限设定:
            chmod g+s DIR...
            chmod g-s DIR...
      例如:在/tmp目录下创建一个test目录,将该目录的属组改为mygrp,并且将该目录设置为chmod g+w test 使得mygrp组对test目录有写的权限,创建两个用户分别是centos和gentoo,并且将mygrp设置为这两个用户的附加组(usermod -a -G mygrp centos和usermod -a -G mygrp gentoo)。然后以centos的身份进入/tmp/test 目录下创建a.centos,以gentoo的身份进入/tmp/test 目录下创建a.gentoo,可以看到a.gentoo和a.centos文件的属主和属组都是各自的。然后更改/tmp/test目录使之有SGID权限,再分别以centos和gentoo的身份进入/tmp/test目录下创建b.centos和b.gentoo,可以看到此时b.centos和b.gentoo的属组为mygrp了。

5)Sticky
对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除自己的文件;
权限设定:
      chmod o+t DIR...
      chmod o-t DIR...
note:/var/tmp和/tmp/目录就是这样的目录

SUID    GUID    STICK
0          0           0          表示0
0          0           1          表示1
0          1           0          表示2
0          1           1          表示3
1          0           0          表示4
1          0           1          表示5
1          1           0          表示6
1          1           1          表示7

chmod 4777 /tmp/a.txt  4就表示上面的权限

几个权限位映射:
SUID: user, 占据属主的执行权限位;
      s: 显示为小写s,表示属主原来拥有x权限
      S:显示为大写S,表示属主原来没有x权限
SGID: group,  占据group的执行权限位;
      s: group拥有x权限
      S:group没有x权限
Sticky: other, 占据ohter的执行权限位;
      t: other拥有x权限
      T:other没有x权限

3:bash脚本编程
过程式编程语言:
      顺序执行
      选择执行
      循环执行

选择执行:
if 判断条件
then
条件为真的分支代码
fi

if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi

例子:写脚本判断给定的用户是否存在

#!/bin/bash
if [ $# -lt 1 ] ;then  #参数个数小于1,直接退出
    echo "at least one argument!"
    exit 1
fi
if id $1 &> /dev/null ; then   #用户给出的用户名已经存在,直接退出
    echo "$1 exists"
    echo 0
else      #用户给出的用户名不存在,则创建用户
    useradd $1
    [ $? -eq 0 ] &&  echo "$1" | passwd --stdin $1 &> /dev/null
fi

4:linux磁盘管理

CPU如何知道设备需要读写数据?

I/O Ports:也被称为I/O设备地址;

一切皆文件:
      open(), read(), write(), close()
      块设备:block,存取单位“块”,磁盘
      字符设备:char,存取单位“字符”,键盘

      设备文件:关联至一个设备驱动程序,进而能够跟与之对应的硬件设备进行通信;

      设备文件的设备号码:主设备号和次设备号,设备文件只有元数据,没有数据
      主设备号:major number, 标识设备类型
      次设备号:minor number, 标识同一类型下的不同设备

硬盘接口类型:
并行:
      IDE:133MB/s
      SCSI:640MB/s
串口:
      SATA:6Gbps
      SAS:6Gbps
      USB:480MB/s
      rpm: rotations per minute

磁盘设备的设备文件命名:/dev/DEV_FILE
IDE类型: /dev/hd
SCSI, SATA, SAS, USB类型: /dev/sd
不同设备:a-z
/dev/sda, /dev/sdb, ...
同一设备上的不同分区:1,2, ...
/dev/sda1, /dev/sda5

机械式硬盘的工作机制:
track:盘片上的同心圆就是磁道
cylinder: 相同编号的磁道称为柱面
secotr: 扇区,每个扇区512bytes

如何分区:
按柱面

0磁道0扇区存放MBR:512bytes

MBR: Master Boot Record,主引导记录由446bytes的 boot loader和 64bytes的分区表组成,并且16bytes标识一个分区,最后的2bytes是55AA,是一个标识。
一个硬盘最多只能有4个主分区或者3主分区+1扩展(N个逻辑分区)

问题:UEFI, GPT?

分区管理工具:fdisk, parted, sfdisk
fdisk:对于一块硬盘来讲,fdisk最多只能管理15分区;

# fdisk -l [-u] [device...]  显示设备的分区信息,例如fdisk -l /dev/sda

# fdisk device    fdisk后面跟上设备,直接进入分区
子命令:管理功能
      p: print, 显示已有分区;
      n: new, 创建
      d: delete, 删除
      w: write, 写入磁盘并退出
      q: quit, 放弃更新并退出
      m: 获取帮助
      l: 列表所有分区id
      t: 调整分区id

分区完成之后,查看内核是否已经识别新的分区:
# cat /proc/partitions

如果内核尚未识别新添加的分区,可以使用partx和kpartx通知内核重新读取硬盘分区表:
partx -a   /dev/DEVICE
partx -n M:N   /dev/DEVICE   这里的M和N表示分区编号

kpartx -a /dev/DEVICE
           -f: force

CentOS 5: 使用partprobe通知内核重新读取硬盘分区表
      partprobe [/dev/DEVICE]

练习:通过VMWare虚拟机添加一个硬盘,用来练习硬盘分区
新添加的硬盘对应于/dev/sdb,3个主分区和1扩展分区,扩展分区里分2个逻辑分区。

5:Linux文件系统管理
硬盘分区之后,在分区上安装文件系统,可以用来管理操作文件

Linux文件系统: ext2, ext3, ext4, xfs, btrfs, reiserfs, jfs, swap
swap: 交换分区,用来将磁盘当作内存使用
光盘:iso9660

Windows文件系统:fat32, ntfs
Unix文件系统: FFS, UFS, JFS2
网络文件系统:NFS, CIFS
集群文件系统:GFS2, OCFS2
分布式文件系统:ceph, moosefs, mogilefs, GlusterFS, Lustre

根据其是否支持"journal"功能:
      日志型文件系统: ext3, ext4, xfs, ...
      非日志型文件系统: ext2, vfat

文件系统的组成部分有如下2个:
内核中的模块:ext4, xfs, vfat
用户空间的管理工具:mkfs.ext4, mkfs.xfs, mkfs.vfat

Linux的虚拟文件系统:VFS

cat /proc/filesystems  可以查看当前系统支持的文件系统

lsmod命令可以查看内核中当前已装载的模块

创建文件系统:
mkfs命令有如下2种格式:
(1) #  mkfs.FS_TYPE  /dev/DEVICE
         mkfs.ext4
         mkfs.xfs
         mkfs.btrfs
         mkfs.vfat
(2) # mkfs -t FS_TYPE /dev/DEVICE
                 -L 'LABEL'  设定卷标  例子 mkfs -t btrfs -L "MyData" /dev/sdb1
                 -f   表示强制

blkid命令可以查看分区上的文件系统信息,例如 blkid  /dev/sdb1

mke2fs命令:ext系列文件系统专用管理工具
      -t {ext2|ext3|ext4}
      -b {1024|2048|4096}  指定一块的大小,单位字节
      -L 'LABEL'
      -j: 相当于 -t ext3
            mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
      -i #: 为数据空间中每多少个字节创建一个inode;此大小不应该小于block的大小;
      -N #:为数据空间创建多少个inode;
      -m #: 为管理人员预留的空间占据的百分比;
      -O FEATURE[,...]:启用指定特性
      -O ^FEATURE:关闭指定特性

mkswap:创建交换分区,前提:调整其分区的ID为82;
mkswap [options] device
      -L 'LABEL'

其它常用工具:
blkid:块设备属性信息查看
blkid [OPTION]... [DEVICE]
      -U UUID: 根据指定的UUID来查找对应的设备
      -L LABEL:根据指定的LABEL来查找对应的设备

e2label:查看和设置ext系列文件系统的LABEL
# e2label DEVICE [LABEL]

tune2fs:重新设定ext系列文件系统可调整参数的值
      -l:查看指定文件系统超级块信息;super block
      -L 'LABEL':修改卷标
      -m #:修预留给管理员的空间百分比
      -j: 将ext2升级为ext3
      -O: 文件系统属性启用或禁用
      -o: 调整文件系统的默认挂载选项
      -U UUID: 修改UUID号;

dumpe2fs:
      -h:查看超级块信息

NOTE:数据区里将多个块组成一个组,可以便于管理,这样一来整个数据区就有多个块组,而超级块就是用来保存每个块组的信息的,保存的信息有总的块组数量,每个块组从哪个块开始到哪个块结束,每个块组有哪些块是空闲的等等。

文件系统检测:
fsck: File System ChecK 文件系统检测
fsck.FS_TYPE
fsck -t FS_TYPE
      -a: 自动修复错误
      -r: 交互式修复错误
Note: FS_TYPE一定要与分区上已经文件类型相同;

e2fsck:ext系列文件专用的检测修复工具
      -y:自动回答为yes;
      -f:强制修复;

评论

此博客中的热门博文

OAuth 2教程

网格策略

apt-get详细使用