zoukankan      html  css  js  c++  java
  • Linux系统文件和目录的属性及权限

    1 文件属性概述

    Linux系统中的文件或目录的属性主要包括:索引节点(inode)、文件类型、权限属性、硬链接数、所归属的用户和用户组、最近修改时间等内容(文件名严格来说不属于文件的属性):

             下面是我们执行ls –lih命令显示的结果:

    文字解释
    第一列:inode索引节点编号(如人的身份证全国唯一)
        系统读取文件是首先通过文件名找到inode(全称:index node),然后才能读取文件到内容
    第二列:文件类型及权限
        共有10个字符,第一个字符代表为文件类型(-代表file,d代表directory),后九个字符代表为文件的权限(读、写、执行)
    第三列:文件的硬链接个数
        硬链接的个数好比对源文件的备份,对同一个文件的访问提供多个不同的入口,即使源文件删除了,我们依然可以访问文件本身的内容。
       例如:一个超市有多个进出口,即使其中任何一个进出口封闭,我们依然可以去购物买到我们想要得东西 第四列:文件或目录所属的用户  属主,即创建文件的用户(文件的拥有者),当然我们也可以通过chown修改文件的拥有者 第五列:文件或目录所属的组  这里文件的所属用户组不是用户默认的用户组,我们可以授权给不同的用户组使其文件属于其组 第六列:文件或目录的大小 第七、八、九列:文件或目录的修改时间  查看文件属性里面的时间就是文件的修改时间mtime(全称:modify
    time) 第十列:实际的文件名或目录名  文件名是不属于文件的属性列表,文件名实际是属于它上一级目录的block块的内容

    2 索引节点inode

    2.1 inode概述

    硬盘要存储数据(房子住人),首先要分区(隔断),然后要格式化创建文件系统(装修),最后存储数据(住人)。

             Inode中文意思是索引节点(全称:index node)。在每个linux存储设备或存储设备的分区(存储设备可以是硬盘、软盘、U盘……)被格式化为ext4(Centos6.7)文件系统后,一般会生成两部分:第一部分是Inode索引节点(很多个),第二部分是Block(很多个)

             Block是用来存储实际数据用的,例如:照片、视频、音乐等普通文件数据。

             Inode是用来存储这些数据的属性信息(也就是ls –l的结果),inode包含的属性信息包括文件的大小、属主、归属的用户组、读写执行权限、文件类型、修改时间,还包含指向文件实体(block块)的指针功能(inode节点—block块的对应关系)等,inode里面唯独不包含文件名。

             Inode除了记录文件属性的信息外,还会为每个文件进行信息索引(指向文件实体的指针),所以就有了inode的数值。Linux操作系统根据指令,即可通过inode的值最快的找到相对应的文件实体。

    文件—inode—block之间的关系图:

    举例说明:
        学校教室门口贴一张纸(inode),上面有学生的位置信息,以及学生的身高,体重等信息,座位就相当于block。

    当我们使用ls查看某个文件或目录时,如果加上-i参数,就可以看到inode节点了,也可以使用stat查看inode以及其他的文件属性;比如文件—inode—block之间的关系图对应的例子:

    方法一:ls –li 查看文件属性
    [root@oldboy ~]# ls -li Wolf_File
    410472 -rw-r--r-- 1 root root 12 Apr 13 23:08 Wolf_File
    方法二:stat查看文件属性:
    [root@oldboy ~]# stat Wolf_File 
      File: `Wolf_File'
      Size: 12              Blocks: 8          IO Block: 4096   regular file
    Device: 803h/2051d      Inode: 410472      Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2018-04-13 23:08:56.841301484 +0800  #文件的查看时间
    Modify: 2018-04-13 23:08:51.633299332 +0800  #文件的修改时间
    Change: 2018-04-13 23:08:51.633299332 +0800  #文件权限改变的时间
    [root@oldboy ~]#

     第一列inode值是410472;查看一个文件或目录的inode,通过ls命令的-i参数即可。

             因为inode要存放文件的属性信息及指向文件实体的指针索引信息,所以每个inode本身是有大小的,Centos5 系列inode的默认大小是128字节(byte),

    Centos6系列 inode的默认大小是256字节(byte),inode的大小在分区被格式化创建文件系统之后定下来的,格式化以后就无法更改inode的大小了,格式化前可以通过参数指定inode的大小,

    但是一般企业工作环境没有这个需求。

             不同Centos版本inode大小不同:

    Centos6系列查看inode大小:
    [root@oldboy ~]# dumpe2fs /dev/sda1 | grep -i "inode size"  ##/boot分区默认为128byte
    dumpe2fs 1.41.12 (17-May-2010)
    Inode size:               128
    [root@oldboy ~]# dumpe2fs /dev/sda3 | grep -i "inode size"
    dumpe2fs 1.41.12 (17-May-2010)
    Inode size:               256
    Centos5系列查看inode大小:
    由于我这里没有Centos5系统版本,想验证的可自行安装Centos5系统,使用dumpe2fs /dev/sda3 | grep -i "inode size"命令去查看。

    2.2 inode总结

    ################学会给阶段性的知识做小结是学好linux运维的好习惯################

    u  硬盘被分区并格式化为ext4文件系统后会生成一定数量的inodeblock

    u  inode称为索引节点,它的作用是存放文件的属性信息以及作为文件的索引(指向文件的实体)

    u  ext3/ext4文件系统的block存放的是文件的实际内容

    u  inode是磁盘上的一块存储空间,Centos6系列版本非启动分区inode默认大小为256byteCentos5系列版本inode默认大小为128byte

    u  inode的表现形式是一串数字,不同的文件对应的inode(一串数字)在文件系统里是唯一的

    u  linux文件系统中,inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口

    u  ext3/ext4文件系统下,一个文件被创建后至少要占用一个inode和一个block

    u  ext3/ext4文件系统下,正常情况一个文件占用且只能占用一个inode(人和身份证)

    u  block是用来存储实际数据的,每个block的大小一般有1k,2k,4k几种;其中引导分区等为1k,其他普通分区多为4kCentos6

    u  如果一个文件很大(高清大片4G),需要占多个block,如果文件很小(0.01k),至少占一个block,并且这个block的剩余空间就浪费了,即无法再存储其他数据了

    u  查看inode大小和总量

    [root@oldboy ~]# dumpe2fs /dev/sda3 | grep -iE "block size|inode size"
    dumpe2fs 1.41.12 (17-May-2010)
    Block size:               4096
    Inode size:               256
    [root@oldboy ~]# dumpe2fs /dev/sda3 | grep -iE "block count|inode count"
    dumpe2fs 1.41.12 (17-May-2010)
    Inode count:              577088
    Block count:              2307840
    Reserved block count:      115392
    注意:默认block count一般会大于inode count的数量

       u  查看inode的总量是使用量(df -i

    [root@oldboy ~]# df -i
    Filesystem     Inodes IUsed  IFree IUse% Mounted on
    /dev/sda3      577088 52769 524319   10% /
    tmpfs           60785     1  60784    1% /dev/shm
    /dev/sda1       51200    38  51162    1% /boot
    /dev/sr0            0     0      0     - /mnt

       u  查看文件的inode信息

    方法一:ls –li文件inode
    [root@oldboy ~]# ls -li /etc/hosts
    40 -rw-r--r--. 2 root root 158 Jan 12  2010 /etc/hosts
    方法二:stat查看文件inode
    [root@oldboy ~]# stat /etc/hosts
      File: `/etc/hosts'
      Size: 158             Blocks: 8          IO Block: 4096   regular file
    Device: 803h/2051d      Inode: 40          Links: 2
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2018-04-20 00:00:50.701998104 +0800
    Modify: 2010-01-12 21:28:22.000000000 +0800
    Change: 2018-03-24 22:24:01.221267767 +0800

    u  如何生成及指定inode大小

    格式化/dev/sdb1分区时指定inode大小为256byte,block大小为2048字节即2k:
    [root@oldboy ~]# mkfs.ext4 -b 2048 -I 256 /dev/sdb1
    mke2fs 1.41.12 (17-May-2010)
    文件系统标签=
    操作系统:Linux
    块大小=2048 (log=1)
    分块大小=2048 (log=1)
    Stride=0 blocks, Stripe width=0 blocks
    66528 inodes, 530128 blocks
    26506 blocks (5.00%) reserved for the super user
    第一个数据块=0
    Maximum filesystem blocks=537919488
    33 block groups
    16384 blocks per group, 16384 fragments per group
    2016 inodes per group
    Superblock backups stored on blocks: 
            16384, 49152, 81920, 114688, 147456, 409600, 442368
    
    正在写入inode表: 完成                            
    Creating journal (16384 blocks): 完成
    Writing superblocks and filesystem accounting information: 完成
    
    This filesystem will be automatically checked every 20 mounts or
    180 days, whichever comes first.  Use tune2fs -c or -i to override.
    查看inode和block的大小:
    [root@oldboy ~]# dumpe2fs /dev/sdb1 | grep -iE "block size|inode size"
    dumpe2fs 1.41.12 (17-May-2010)
    Block size:               2048
    Inode size:               256
    查看inode和block总量:
    [root@oldboy ~]# dumpe2fs /dev/sdb1 | grep -iE "block count|inode count"
    dumpe2fs 1.41.12 (17-May-2010)
    Inode count:              66528
    Block count:              530128
    Reserved block count:     26506

    2.3 Block总结

    u  磁盘读取数据是按block为单位读取的

    u  一个文件可能占用多个block,同时每读取一个block就会消耗一次磁盘I/O

    u  如果要提升磁盘I/O性能,那就要尽可能一次性读取数据尽量的多

    u  一个block只能存放一个文件的内容,无论内容有多小,如果block默认是4K大小,那么存放一个1K的文件,剩余3K的就不能再存放别的文件,只能浪费了

    u  Block并非越大越好,block太大对于存放小文件就会浪费磁盘空间,例如:1000K的文件;block大小为4K,占用250block,如果block默认为1K,则需要占1000block

     访问效率谁更高?消耗I/O分别250次和1000次;当然是block大小为4K时访问效率更高

    u  根据业务需求,确定默认的block大小,如果是大文件(大于16K)一般设置block大一点,小文件(小于1K)一般设置block小一点

    u  Block太大,例如4K,文件都是0.1K的则会大量浪费磁盘空间,但是访问效率高

    u  Block太小,例如1K,文件都是1000K的则会消耗大量的磁盘I/O,访问效率比较低

    u  Block大小设置也是格式化分区时确定的,命令为mkfs.ext4 -b 2048 -I 256 /dev/sdb1

    u  企业里文件都会比较大(一般会大于4K),block设置大一些会提升磁盘访问效率

    u  ext3/ext4文件系统(Centos56),一般都设置为4KCentos7默认文件系统为xfs

    2.4 inode与block汇总

    u  磁盘被分区格式化文件系统后,会分为inodeblock两部分内容

    u  Inode存放文件的属性以及指向文件实体的指针,文件名不包含在inode里,一般是存放在上级目录的block

    u  访问文件过程原理:文件名àinodeàblocks

    u  Inode一般情况默认大小为256byteblock大小为1K2K4K,默认为4K,注意:引导分区/boot等特殊分区除外

    u  通过df –i查看inode的数量以及使用情况,dumpe2fs /dev/sda3查看inodeblock的大小及总数量

    u  一个文件至少要占用一个inode和一个block,多个文件可以占用同一个inode(硬链接),即相同文件

    u  一个block只能被一个文件使用,如果文件很小block很大,剩余空间浪费,无法继续被其他文件使用

    u  Block不是越大越好,要根据业务的文件大小进行选择,一般Centos6就是默认4K

    u  可以在格式化分区时指定inodeblock大小(mkfs.ext4 -b 2048 -I 256 /dev/sdb1

    3 文件类型

    3.1 Linux文件类型概述

    linux系统,可以说一切(包括目录、普通文件、设备等)皆文件。文件类型包含有普通文件、目录、字符设备文件、块设备文件、符号链接文件、管道文件等等

    图一 文件类型对应说明图

    文件类型标识

    文件类型说明

    ddirectory

    表示这是一个目录

    -regular file

    表示这是一个普通文件

    llink

    表示这个一个符号链接文件,实际上它指向另一个文件,即windows快捷方式

    bblock

    表示块设备和其他外围设备,是特殊类型的文件(/dev

    ccharacter

    表示字符设备文件(/dev

    s socket

    表示Socket文件,如:网络通信是产生的包

    pnamed pipe

    表示管道文件

    #####通过ls –l显示文件属性后,第一列的第一个字符就是用来区分文件类型#####

    find命令查看文件类型(-type参数)


    -type c File is of type c: b block (buffered) special c character (unbuffered) special d directory p named pipe (FIFO) f regular file l symbolic link; s socket D door (Solaris)

    3.2 普通文件(按照文件内容分类)

    • 纯文本文件(ASCII text):文件内容可以直接读取到文件数据,例如字母、数字等,可以使用cat命令读取文件,比如配置文件几乎都是纯文本文件
    file命令查看文件类型:
    [root@oldboy ~]# file Wolf_File 
    Wolf_File: ASCII text
    • 二进制文件(binary):linux系统中的命令程序属于这种格式,例如cat命令就是一个二进制文件
    file命令查看文件类型:
    [root@oldboy ~]# file /bin/cat 
    /bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
    • 数据格式文件(data):有些程序在运行的过程中就会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件;例如:linux在用户登录时,都会将登录信息记录在/var/log/wtmp(last命令的数据库文件)那个文件中,该文件是一个数据文件;通过last命令可以读取,使用cat命令读取会出现乱码;因为它属于一种特殊格式的文件。lastlog(/var/log/lastlog)查看linux系统所有用户的登录情况
    file命令查看文件类型:
    [root@oldboy ~]# file /var/log/wtmp
    /var/log/wtmp: data
    [root@oldboy ~]# file /var/log/lastlog
    /var/log/lastlog: data

    3.3 目录文件(directory)

    [root@oldboy ~]# ls -ld oldboy/
    drwxr-xr-x 2 root root 4096 Apr 14 20:00 oldboy/

    如上文所示,当我们执行ls –ld 目录名时,可以看到第一列内容为drwxr-xr-x,第一个字符带d的文件就表示是目录,目录在linux系统中是比较特殊的文件

    创建目录的命令可以用mkdir命令或者cp命令(带-r or –a参数),cp可以把一个目录复制为另一个目录;删除目录用rm –rrmdir(删除空目录)命令

    区别目录和文件:

    ls –F命令在目录后面加/来区分文件和目录:
    [root@oldboy ~]# ls -F
    1.py             copied.txt      install.log         stu1/  teacher1/
    Wolf_File        copied.txt.     install.log.syslog  stu2/  teacher2/
    anaconda-ks.cfg  copied.txt.bak  oldboy/             stu3/
    tree命令显示当前目录下所有的文件:
    [root@oldboy ~]# tree .      
    .
    |-- 1.py
    |-- Wolf_File
    |-- anaconda-ks.cfg
    |-- copied.txt
    |-- copied.txt.
    |-- copied.txt.bak
    |-- install.log
    |-- install.log.syslog
    |-- oldboy
    |-- stu1
    |-- stu2
    |-- stu3
    |-- teacher1
    |   |-- a
    |   `-- b
    `-- teacher2
        |-- a
        `-- b
    
    10 directories, 8 files
    tree命令只显示当前目录下的目录文件:
    [root@oldboy ~]# tree -d .   
    .
    |-- oldboy
    |-- stu1
    |-- stu2
    |-- stu3
    |-- teacher1
    |   |-- a
    |   `-- b
    `-- teacher2
        |-- a
        `-- b
    
    10 directories
    tree命令只显示当前目录下一级目录:
    [root@oldboy ~]# tree -Ld 1 . 
    .
    |-- oldboy
    |-- stu1
    |-- stu2
    |-- stu3
    |-- teacher1
    `-- teacher2
    
    6 directories

    3.4 文件类型实例

    1)    .tar、.tar.gz、.tgz、.zip、.tar.bz表示压缩文件,创建命令一般为tar,gzip,unzip等
    2)    .sh表示shell脚本文件,通过shell语言开发的程序
    3)    .pl表示perl语言文件,通过perl语言开发的程序
    4)    .py表示python语言文件,通过python语言开发的程序
    5)    .html、.htm、.php、.jsp、.do、.asp表示网页语言文件
    6)    .conf表示系统配置文件
    7)    .rpm表示rpm安装包文件

    4 文件权限

    4.1 文件权限概述

    Linux中每个文件或者目录都有一组共9个基础权限位,每三位字符被分为一组,他们分别是属主权限位(占三个字符)、用户组权限位(占三个字符)、其他用户权限位(占三个字符);比如rwxr-xr-x,在linux中正是这9个字符权限位来控制文件属主、用户组以及其他用户的权限

    文件权限示例图

     

    文字解释:
    r(read)代表读权限,用数字4表示
    wwrite)代表写权限,用数字2表示
    x(execute)代表执行权限,用数字1表示
    -代表没有权限,用数字0表示
    前三位:代表文件属主/用户(owner/user)
    中三位:代表文件用户组(group)
    后三位:代表其他用户(other)
    说明:特殊权限位:t T s S x X

    4.2 模拟演示环境

    4.2.1 用户测试准备

    [root@oldboy ~]# groupadd incahome  #一个家庭(oldboy的家)
    [root@oldboy home]# useradd -g incahome oldboy  #让家庭住人oldboy属于incahome这个家(模拟user)
    [root@oldboy home]# useradd -g incahome oldgril  #incahome这个家的家庭成员(模拟用户组group)
    [root@oldboy home]# useradd test   #外面的人,主人及家庭成员以外的人(other)
    [root@oldboy home]# id oldboy 
    uid=502(oldboy) gid=502(incahome) groups=502(incahome)
    [root@oldboy home]# id oldgril
    uid=503(oldgril) gid=502(incahome) groups=502(incahome)
    [root@oldboy home]# id test   
    uid=501(test) gid=501(test) groups=501(test)

    如果oldboy用户存在的话就用下面修改用户组的命令进行修改

    [root@oldboy home]# usermod -g incahome oldboy

    4.2.2 创建文件的测试准备

    [root@oldboy ~]# mkdir /oldboy -p
    [root@oldboy ~]# echo "echo oldboylinux" > /oldboy/test.sh  
    [root@oldboy ~]# chmod +x /oldboy/test.sh 
    [root@oldboy ~]# cat /oldboy/test.sh 
    echo oldboylinux
    [root@oldboy ~]# ls -lh /oldboy/test.sh 
    -rwxr-xr-x 1 root root 17 Apr 27 21:14 /oldboy/test.sh

    4.2.3 范例:实操体会文件权限

    模拟演练环境:

    打开四个窗口分别用root、oldboy、oldgril、test用户登录

    分别测试oldboy、oldgril、test用户对上述test.sh文件的权限

    实操一:

    [root@oldboy ~]# ls -lh /oldboy/test.sh 
    -rwxr-xr-x 1 root root 17 Apr 27 21:14 /oldboy/test.sh

    结论1:

    oldboy、oldgril、test三个用户拥有同样的其他用户的权限,即读和执行,没有写的权限

    实操二:

    [root@oldboy ~]# chown oldboy.incahome /oldboy/test.sh 
    [root@oldboy ~]# ls -l /oldboy/test.sh
    -rwxr-xr-x 1 oldboy incahome 17 Apr 27 21:14 /oldboy/test.sh

    结论2:

    oldboy用户拥有对应用户的权限,即读、写和执行的权限
    oldgril用户拥有对应用户组(incahome)的权限,即读和执行的权限,没有写的权限
    test用户拥有对应其他用户的权限,即读和执行的权限,没有写的权限

    实操三:

    [root@oldboy ~]# chmod g+w,o-x /oldboy/test.sh 
    [root@oldboy ~]# ls -l /oldboy/test.sh
    -rwxrwxr-- 1 oldboy incahome 25 Apr 27 21:26 /oldboy/test.sh

    总结文件测试结论:linux普通文件的读、写、执行权限说明:

    1.    可读r:表示具有读取阅读文件内容的权限
    2.    可写w:表示具有新增、修改文件内容的权限
        如果没有r配合,那么vi编辑文件会提示无法编辑(但可强制编辑),echo可以重定向或追加
        特别提示:删除文件(修改文件名等)的权限是受父目录(即上一级目录)的权限控制,和文件本身(即文件名)权限无关
    3.    可执行x:表示具有执行文件的权限
        文件本身要能够执行
        普通用户同时还需要具备r的权限才能执行
        root只要有x的权限就能执行
    win32下可执行文件:*.exe,*.bat,*.com
    linux下可执行文件:*.sh,*.py,*.perl等

    4.2.4 企业面试题:请从linux文件系统的角度详细描述读取/oldboy/test.sh文件的过程

    有关文件删除的说明:

    Linux中的文件名是存在于父目录的block里面,并指向这个文件的inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块。
    我们删除一个文件,实际上并不清楚inode节点和block的数据。只是在这个文件的父目录里面的block中,删除这个文件的名字和这个文件inode的对应关系,使这个文件名消失,并且无法指向这个文件的inode节点,
    当没有文件名指向这个inode节点的时候,系统会同时释放inode节点和存放这个文件的数据块,并更新inode MAP和block MAP,让这些位置可以用于放置其他新的文件数据。

    图一 详细描述读取/oldboy/test.sh文件的流程图

    因此,修改和删除文件名都是在操作文件的上级目录的block,修改或删除的是文件名和inode的关联数据,所以删除文件是和上级目录权限关联

    范例:实操体会目录权限

    开启两个窗口通过两个用户演示上面的权限。一个是root,一个是oldboy用户,一个是oldgril用户,一个是test用户

    演示环境准备:

    [root@oldboy ~]# mkdir /oldboy/test -p
    [root@oldboy ~]# ls -ld /oldboy/test
    drwxr-xr-x 2 root root 4096 Apr 27 23:39 /oldboy/test

    测试目录的rwx

    特别是文件的删除

    总结目录测试结论:linux目录的读、写、执行权限说明:

    1、可读r:表示具有浏览目录下面文件及子目录的权限,即ls dir
        如果没有x权限,不能进到目录里,即无法(cd dir)
        如果没有x权限,ls列表时可以看到所有文件名,但是会提示无权访问目录下文件
        如果ls -l列表,所有的属性会带有问号,也会提示无权访问目录下文件,但可以看到所有文件名
    2、可写w:表示具有增加、删除或修改目录内文件名(一般指文件名)的权限(需要x权限配合)
    3、可执行x:表示具有进入目录的权限,例如:cd dir;但是没有r无法列表文件及目录,没有w无法新建和删除

    4.3 文件权限更改命令

    4.3.1 改变文件权限属性命令chmod

    chmod - change file mode bits
    [root@oldboy ~]# which chmod 
    /bin/chmod

    chmod是用来改变文件和目录权限的命令,但只有文件的属主和超级用户root才有这种权限。通过chmod来改变文件或目录的权限有两种方法:一种是通过权限字母和操作符表达式的方法来设置权限;另一种是使用数字方法(常用)来设置权限。

    4.3.2 chmod数字权限方法(推荐)

    命令格式:

    chmod [数字组合] 文件名

    chmod [数字组合] 目录名 -R参数可递归生效(该目录下所有文件或子目录一起改变)

    数字意义说明:

    r    4
    w    2
    x    1
    -    0
    rwxr-xr-x 755 目录默认权限  rw-r--r--  644文件默认权限 

    每个三位的权限代码(分别是属主、属组、其它用户)组合,有8种可能:

    八进制                    权限
    0                        ---
    1                        --x
    2                        -w-
    3                        -wx
    4                        r--
    5                        r-x
    6                        rw-
    7                        rwx

    演示实例:

    [root@oldboy oldboy]# ls -l test.sh
    -rw-r--r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh
    [root@oldboy oldboy]# chmod 665 test.sh 
    [root@oldboy oldboy]# ls -l test.sh     
    -rw-rw-r-x 1 oldboy incahome 29 Apr 27 21:59 test.sh
    [root@oldboy oldboy]# chmod 715 test.sh 
    [root@oldboy oldboy]# ls -l test.sh     
    -rwx--xr-x 1 oldboy incahome 29 Apr 27 21:59 test.sh

    4.3.3 chmod字符式权限表示法

    命令格式:

    Chmod [用户类型] [+ | - | =] [权限字符] 文件名

    表一 详细说明表

    chmod

    用户类型

    操作字符

    权限字符

    文件和目录

    Uuser

    +(增加)

    r

    Ggroup

     

    -

    Oothers

    -(减少)

    w

    Aall

    =(设置)

    x

    文字说明:

    +:添加某个权限
    -:取消某个权限
    =:取消其他所有权限赋予给定的权限

    演示实例:

    [root@oldboy oldboy]# ls -l test.sh
    -rw-r--r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh
    [root@oldboy oldboy]# chmod u+x test.sh  
    [root@oldboy oldboy]# ls -l test.sh     
    -rwxr--r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh
    [root@oldboy oldboy]# chmod g+w test.sh 
    [root@oldboy oldboy]# ls -l test.sh
    -rwxrw-r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh
    [root@oldboy oldboy]# chmod u-x,g-w,o-r test.sh
    [root@oldboy oldboy]# ls -l test.sh            
    -rw-r----- 1 oldboy incahome 29 Apr 27 21:59 test.sh
    [root@oldboy oldboy]# chmod a=rw test.sh
    [root@oldboy oldboy]# ls -l test.sh     
    -rw-rw-rw- 1 oldboy incahome 29 Apr 27 21:59 test.sh
    [root@oldboy oldboy]#

    4.3.4 Umask默认文件或权限分配命令

    创建目录dir与创建文件file实例

    [root@oldboy test]# mkdir dir 
    [root@oldboy test]# touch file
    [root@oldboy test]# ls -lrt
    total 4
    drwxr-xr-x 2 root root 4096 Apr 29 15:12 dir  ->创建目录默认权限为755
    -rw-r--r-- 1 root root    0 Apr 29 15:12 file –>创建文件默认权限为644
    说明:root超级用户创建目录默认权限为755,文件默认权限为644

    问题:为什么默认权限目录是755,文件是644而不是其他的值呢?

    不管是操作系统还是网站站点目录,安全权限的临界点:
    1)目录755,文件644是相对安全的权限
    2)用户为root,用户组为root
    注意:生产工作中一定尽量要文件和目录达到以上默认权限,其用户和属组都是root
    Linux系统默认权限的方针:允许浏览、查看,但禁止创建文件、修改文件内容以及执行文件

    实际是由/etc/bashrc文件控制:

    [root@oldboy ~]# umask
    0022 ->root超级用户系统默认的umask值
    [root@oldboy ~]# sed -n '65,69p' /etc/bashrc
        if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
           umask 002
        else
           umask 022
    fi
    umask值为002,举例:
    [oldboy@oldboy ~]$ ls -l file1
    -rw-rw-r-- 1 oldboy oldboy 0 Apr 29 16:13 file1
    [oldboy@oldboy ~]$ id 
    uid=502(oldboy) gid=503(oldboy) groups=503(oldboy)
    [oldboy@oldboy ~]$ umask
    0002
    umask值为022,举例:
    [oldboy@oldboy ~]$ ls -l file
    -rw-r--r-- 1 oldboy incahome 0 Apr 29 16:07 file
    [oldboy@oldboy ~]$ id
    uid=502(oldboy) gid=502(incahome) groups=502(incahome)
    [oldboy@oldboy ~]$ umask
    0022

    文件权限计算方法:

    root用户下默认文件权限计算方法
    1)假设umask值为:022(所有位为偶数)
        6 6 6        ==>文件的起始权限值
        0 2 2 –    ==>umask值(采用减法)
        ----------
        6 4 4        ==>创建文件默认权限值
    2)假设umask值为:045(所有是奇数的位要加1)
        6 6 6        ==>文件的起始权限值
        0 4 5 –    ==>umask值(采用减法)
        ----------
        6 2 1        ==>计算出来的权限值
        0 0 1 +    ==>由于umask最后一位是5,在其他用户位再加1(采用加法)
        ---------
        6 2 2        ==>真实文件权限(即创建文件默认权限值)

    4.3.5 特殊权限位

    特殊权限位基本说明:

    Linux系统基本权限位为9位权限,但还有额外3位权限位,共12位权限
    suid        s(有x)    S    4    用户对应的权限位(用户对应的3位上)
    sgid        s(有x)    S    2    用户组对应的权限位(用户组对应的3位上)
    sticky    t(有x)    T    1    其他用户对应的权限位

    如何查找系统(/usr/bin)目录中设置suid的命令

    方法一:
    [root@oldboy oldboy]# find /usr/bin -type f -perm 4755 | xargs ls -l 
    -rwsr-xr-x. 1 0 root 54240 Jan 30  2012 /usr/bin/at
    -rwsr-xr-x. 1 0 root 66352 Dec  8  2011 /usr/bin/chage
    -rwsr-xr-x. 1 0 root 51784 Nov 23  2013 /usr/bin/crontab
    -rwsr-xr-x. 1 0 root 71480 Dec  8  2011 /usr/bin/gpasswd
    -rwsr-xr-x. 1 0 root 36144 Dec  8  2011 /usr/bin/newgrp
    -rwsr-xr-x. 1 0 root 30768 Feb 22  2012 /usr/bin/passwd
    -rwsr-xr-x. 1 0 root 27576 Sep 20  2013 /usr/bin/pkexec
    方法二:
    [root@oldboy oldboy]# find /usr/bin -type f -perm 4755 -exec ls -l {} ;
    取消suid设置命令:
    [root@oldboy oldboy]# find /usr/bin -type f -perm 4755 | xargs chmod u-s
    [root@oldboy oldboy]# find /usr/bin -type f -perm 4755 -exec chmod u-s {} ;

    如何查找系统(/usr/bin)目录中设置sgid的命令

    [root@oldboy oldboy]# find /usr/bin -type f -perm 2755 | xargs ls -l 
    -rwxr-sr-x. 1 0 nobody 125000 Nov 23  2013 /usr/bin/ssh-agent
    -rwxr-sr-x. 1 0 tty     12016 Nov 22  2013 /usr/bin/write

    特殊权限对应数字总结:

    suid 4000 权限字符s(S),用户位的x位上设置
    授权方法:chmod 4755 /bin/rm 或chmod u+s /bin/rm
    sgid 2000 权限字符s(S),用户组位的x位上设置
    授权方法:chmod 2755 /bin/rm 或chmod g+s /bin/rm
    粘滞位1000权限字符t(T),其他用户位的x位上设置
    授权方法:chmod 1777 /tmp 或chmod o+t /tmp
    如果对应位有x则字符权限表现为小写,否则表现为大写
    tmp经典的粘滞位目录案例,特点是谁都有写权限,因此安全成问题。常常是木马第一手跳板地点

    特殊权限总结:

    1)suid是什么、作用,passwd命令案例,如何设置使用rm案例
    2)sgid是什么、作用,文件locate案例。共享目录用户组案例
    3)粘滞位是什么、作用,/tmp目录案例
    4)以数字及字符方式更改权限,chmod命令
    5)更改文件用户和组,chown命令
    6)更改用户组,chgrp命令
    7)chattr更改文件属性(linux安全优化)
    命令格式:
    chattr - change file attributes on a Linux file system
    chattr [ -RVf ] [ -v version ] [ mode ] files...
    The format of a symbolic mode is +-=[acdeijstuADST].
    -R参数代表递归改变目录以及目录下面的文件的属性
    mode指定模式
    +    代表添加属性到已有其他属性的文件中
    -    代表从已有属性文件中删除指定的属性
    =    代表取消原有的属性设置成指定的属性
    i    代表锁定文件使其不可变(linux安全优化常用模式)[immutable 不可变]
    a    代表文件只有追加属性(append only)
    演示实例:
    [root@oldboy ~]# chattr +i /etc/{passwd,shadow,group,gshadow,inittab}  
    [root@oldboy ~]# lsattr /etc/{passwd,shadow,group,gshadow,inittab}   
    ----i--------e- /etc/passwd
    ----i--------e- /etc/shadow
    ----i--------e- /etc/group
    ----i--------e- /etc/gshadow
    ----i--------e- /etc/inittab
    [root@oldboy ~]# chattr -i /etc/{passwd,shadow,group,gshadow,inittab}  
    [root@oldboy ~]# lsattr /etc/{passwd,shadow,group,gshadow,inittab}   
    -------------e- /etc/passwd
    -------------e- /etc/shadow
    -------------e- /etc/group
    -------------e- /etc/gshadow
    -------------e- /etc/inittab
    8)lsattr查看文件属性
    命令格式:
    lsattr  - list file attributes on a Linux second extended file sys-tem
    lsattr [ -RVadv ] [ files...  ]
    参数:
    -R 代表递归列出目录以及目录下面的文件的属性
    -a 代表显示目录中所有文件,包含”.”与”..”隐藏文件
    -d 代表只显示目录本身的属性,而不显示目录下包含的文件属性
    演示实例:
    [root@oldboy ~]# lsattr /etc/{passwd,shadow,group,gshadow,inittab}
    -------------e- /etc/passwd
    -------------e- /etc/shadow
    -------------e- /etc/group
    -------------e- /etc/gshadow
    -------------e- /etc/inittab

    4.3.6 chown改变文件所属关系

    chown(change owner

    当我们要改变一个文件的属主,我们所使用的用户必须是该文件的属主而且同时是目标属组成员,或超级用户。只有超级用户才能改变文件的属主

    chown语法:

    chown [选项]…[所有者][:[用户组]] 文件……

    模拟环境:

    [root@oldboy oldboy]# ls -l test.sh
    -rw-rw-rw- 1 oldboy incahome 29 Apr 27 21:59 test.sh

    常用的更改方法:

    chown 用户 文件或目录 <==仅仅授权用户
    演示实例:
    [root@oldboy oldboy]# chown oldgril test.sh
    [root@oldboy oldboy]# ls -l test.sh        
    -rw-rw-rw- 1 oldgril incahome 29 Apr 27 21:59 test.sh
    chown :组 文件或目录 <==仅仅授权组 等同于“chgrp 组 文件或目录”
    演示实例:
    [root@oldboy oldboy]# chown :oldboy test.sh
    [root@oldboy oldboy]# ls -l test.sh        
    -rw-rw-rw- 1 oldgril oldboy 29 Apr 27 21:59 test.sh
    chown 用户:组 文件或目录 <==表示授权用户和组
    演示实例:
    [root@oldboy oldboy]# chown test:test test.sh
    [root@oldboy oldboy]# ls -l test.sh          
    -rw-rw-rw- 1 test test 29 Apr 27 21:59 test.sh
    chgrp 组 文件或目录
    演示实例:
    [root@oldboy oldboy]# chgrp incahome test.sh
    [root@oldboy oldboy]# ls -l test.sh         
    -rw-rw-rw- 1 test incahome 29 Apr 27 21:59 test.sh

    强调:

    1)其中的冒号”:”可以用点号”.”替代
    2)要授权的用户和组名,必须是linux系统中实际存在的

    5 软硬链接

    5.1 链接概述

      在linux系统中,链接可分为两种:一种为硬链接(Hard Link),另一种为软链接或符号链接(Symbolic Link or Soft Link);使用ln命令就是创建链接文件,在默认不带参数的情况下,执行ln命令创建的链接是硬链接

             如果使用ln –s创建链接则为软链接,前面文件类型为l(字母L)的是软链接

             软硬链接使用语法:

             硬链接:ln 源文件 目标文件

             软链接:ln –s 源文件 目标文件(目标文件事先不能存在)

    5.2 硬链接

    硬链接是指通过索引节点(Inode)来进行链接。在linux(ext2,ext3,ext4)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(Inode index)简称Inode,即在系统中文件的编号。

    在linux文件系统中,多个文件指向同一个索引节点(Inode)是正常允许的。这种情况的文件称为硬链接。提示:硬链接文件就相当于文件的另外一个入口。硬链接的作用之一是允许一个文件拥有多个有效路径名(多个入口),这样用户就可以建立硬链接到重要的文件,以防止“误删”源数据(很多硬件存储,如netapp存储中的快照功能就应用了这个原理,增加一个快照就多了一个硬链接)。为什么一个文件建立了硬链接就会防止数据误删呢?

    因为文件系统(ext2)的原理是只要文件的索引节点(inode)还有一个以上的硬链接。只删除其中一个硬链接(即仅仅删除了该文件的链接指向)并不影响索引节点本身和其他的链接(即数据文件实体并未被删除),只有当文件的最后一个链接被删除后,此时如果有新数据要存储到硬盘上时或者系统通过类似fsck做磁盘检查的时候。被删除文件的数据块及目录的链接才会被释放,空间被新数据占用并覆盖。此时,数据就再也无法找回了。也就是说,在linux系统中,删除静态文件(没有进程调用)(目录也是文件)的条件是与之相关的所有硬链接文件均被删除

    硬链接原理图:

    硬链接示意图:

     5.3 硬链接总结

    1)    具有相同inode节点号的多个文件是互为硬链接文件
    2)    删除硬链接文件或者删除源文件任意之一,文件实体并未被删除
    3)    只有删除了源文件及所有对应的硬链接文件,文件实体才会被删除
    4)    当所有的硬链接文件及源文件被删除后,再存放新的数据就会占用这个文件的空间,或者磁盘fsck检查的时候,删除的数据也会被系统回收(养成删除及多套环境测试的好习惯)
    5)    硬链接文件就是文件的另一个入口(相当于超市的前后门)
    6)    可以通过给文件设置硬链接文件,来防止重要文件被误删
    7)    通过执行命令“ln 源文件 硬链接文件”,即可完成硬链接的创建
    8)    硬链接文件是普通文件,因此可以使用rm命令删除
    9)    对于静态文件(没有进程调用的文件)来讲,当对应硬链接数为0(i_link),文件就会被删除。i_link的查看方法(ls –l结果的第三列)

    5.4 软链接

      软链接(Soft Link)也称为符号链接(Symbolic link)。Linux里的软链接文件就类似于Windows系统中的快捷方式。Linux里的软链接文件实际上是一个特殊的文件,文件类型为l。软链接文件实际上可以理解为一个文本文件,这个文件中包含有软链接指向另一源文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接所指向的源文件实体

    软链接原理图:

    查看软链接的value(源文件)值的方法:

    readlink - print value of a symbolic link or canonical file name ##查看软链接value(源文件)
    [root@oldboy ~]# ls -ld /application/apache
    lrwxrwxrwx 1 root root 25 Mar 15 01:02 /application/apache -> /application/apache2.2.17
    [root@oldboy ~]# readlink /application/apache
    /application/apache2.2.17
    [root@oldboy ~]#

    软链接的创建:

             执行命令“ln –s 源文件 软链接文件”,即可完成软链接的创建

    误区:创建软链接源文件是需要存在的,要创建的软链接文件是不能事先存在的

    5.5 软链接总结

    1)       软链接类似windows系统的快捷方式(readlink查看其指向)

    2)       软链接类似一个文本文件,里面存放的是源文件的路径,指向源文件实体

    3)       删除源文件,软链接文件依然存在,但是无法访问指向的源文件路径内容了

    4)       失效的时候一般是白字红底闪烁提示soft_link_c -> a

    5)       执行命令“ln –s 源文件 软链接文件”,即可完成创建(目标文件不能存在)

    6)       软链接和源文件是不同类型的文件,也是不同的文件,inode也不相同

    7)       软链接文件的文件类型为(l),是普通文件,可以使用rm命令删除

    5.6 示例演示

    文件示例(创建软硬链接)

    [root@oldboy ~]# mkdir /test/oldboy -p
    [root@oldboy ~]# cd /test/oldboy/
    [root@oldboy oldboy]# touch oldboyfile #创建一个测试文件oldboyfile
    [root@oldboy oldboy]# ln oldboyfile oldboyfile_hard_link #创建硬链接
    [root@oldboy oldboy]# ln -s oldboyfile oldboyfile_soft_link #创建软链接
    [root@oldboy oldboy]# ls -li 
    total 0
    142211 -rw-r--r-- 2 root root  0 Apr 16 05:36 oldboyfile
    142211 -rw-r--r-- 2 root root  0 Apr 16 05:36 oldboyfile_hard_link
    142212 lrwxrwxrwx 1 root root 10 Apr 16 05:37 oldboyfile_soft_link -> oldboyfile
    [root@oldboy oldboy]# readlink oldboyfile_soft_link #查看软链接value
    oldboyfile

    目录示例(软硬链接)

    [root@oldboy oldboy]# mkdir oldboydir #创建一个测试文件oldboydir
    [root@oldboy oldboy]# ln oldboydir oldboydir_hard_link
    ln: `oldboydir': hard link not allowed for directory
    #为什么目录不允许创建硬链接?原因是创建目录硬链接不能够跨文件系统,如果不同的分区上面有相同的inode所以节点导致系统数据存储混乱,故不能创建硬链接(目录)
    [root@oldboy oldboy]# ln -s oldboydir oldboydir_soft_link #创建软链接,目录软链接在生产环境经常用到,硬链接用的不多
    [root@oldboy oldboy]# ls -litr
    total 4
    142211 -rw-r--r-- 2 root root    0 Apr 16 05:36 oldboyfile_hard_link
    142211 -rw-r--r-- 2 root root    0 Apr 16 05:36 oldboyfile
    142212 lrwxrwxrwx 1 root root   10 Apr 16 05:37 oldboyfile_soft_link -> oldboyfile
    142215 drwxr-xr-x 2 root root 4096 Apr 16 05:43 oldboydir
    142216 lrwxrwxrwx 1 root root    9 Apr 16 05:44 oldboydir_soft_link -> oldboydir

    删除实例(软硬链接)

    [root@oldboy oldboy]# echo "this is oldboyfile" >> oldboyfile #往创建的测试文件源文件
    [root@oldboy oldboy]# cat oldboyfile
    this is oldboyfile
    [root@oldboy oldboy]# cat oldboyfile_hard_link 
    this is oldboyfile
    [root@oldboy oldboy]# cat oldboyfile_soft_link 
    this is oldboyfile
    [root@oldboy oldboy]#
    结论:往源文件oldboyfile里写入内容后,它的软硬链接文件同样都有相同的内容

    通过以上测试,我们可以得出以下几个结论:

    • 删除软链接文件,对源文件和硬链接文件无任何影响
    • 删除硬链接文件,对源文件和软链接文件无任何影响
    • 删除源文件,对硬链接文件没有影响,但是会导致软链接文件失效,白字红底闪烁
    • 同时删除源文件和硬链接文件,整个文件会真正的被删除
    • 源文件和硬链接文件具有相同的索引节点号(inode),可以认为是同一个文件或一个文件的多个入口
    • 源文件和软链接文件索引节点号(inode)不同,是不同的文件,软链接相当于源文件的快捷方式,包含源文件的位置指向

    5.7 目录链接总结

    1)    对于目录,是不可以创建硬链接,但可以创建软链接
    2)    对于目录的软链接是生产环境运维中常用的技巧
    3)    目录的硬链接是不能跨文件系统的(从硬链接的原理方面理解)
    4)    每个目录下面都有一个硬链接“.”号和对应上级目录的硬链接“..”
    5)    在父目录里创建一个子目录,父目录的链接数增加1(子目录里都有“..”来指向父目录)但是再在父目录里创建文件,父目录的链接数是不会增加了

    请问下面的目录(oldboy)的链接数为什么为3?

    [root@oldboy oldboy]# ls -lid ../oldboy/ -a
    410473 drwxr-xr-x 3 root root 4096 4月  15 01:01 ../oldboy/
    原因如下:(oldboy目录本身,oldboy目录下的“.”,oldboy目录下test子目录的“..”)
    [root@oldboy oldboy]# ls -lid ../oldboy/
    410473 drwxr-xr-x 3 root root 4096 4月  15 01:01 ../oldboy/
    [root@oldboy oldboy]# ls -lid ../oldboy/.
    410473 drwxr-xr-x 3 root root 4096 4月  15 01:01 ../oldboy/.
    [root@oldboy oldboy]# ls -lid ../oldboy/test/..
    410473 drwxr-xr-x 3 root root 4096 4月  15 01:01 ../oldboy/test/..
    [root@oldboy oldboy]#

    6 Linux系统用户角色和组

    6.1 用户角色划分介绍

    首先,我们先说明Linux系统是一个多用户、多任务的操作系统。在linux系统中,由于角色的不同,权限和所完成的任务也是不同的;对于linux系统来说,用户的角色是通过UID和GID识别的:特别是UID,在linux系统运维工作中,一个UID是唯一标识一个系统的用户账号(相当于我们的身份证),linux系统仅能够识别的是UID和GID这样的数字。

    用户的UID就相当于我们的身份证一样,用户名就相当于我们的名字。

    UID(User Identify)中文用户ID,相当于各位的身份证,在系统中是唯一的

    GID(Group Identify)中文用户组ID,相当于各位的家庭或者学校ID

    Linux系统中用户角色划分为:超级用户(root)、普通用户(自建的用户,UID在500之后,如日常ssh远程登录管理linux操作系统)、虚拟用户(供系统服务进程调用的,如ngnix、apache、ntp等)

    有关UID限制说明类比表

    UID整数范围

    UID用户角色

    具备UID用户特性

    0

    超级用户(root皇帝)

    当用户的UID为0时,表示这个账号为超级管理员账号,如果要增加一个系统管理员账号的话,只需将该账号的UID改成0即可。生产环境不建议这么做,使用sudo替代即可。

    1-499

    虚拟用户(傀儡)

    这个范围是保留给系统使用的UID,之所以这样划分,是为了防止人为简历账户的UID和系统的UID之间冲突。并没有其他特殊的含义。在/etc/passwd文件中的虚拟用户的UID都会在这个范围内。除了0之外,所有的UID在使用上没有任何区别。安装系统后默认就会存在,且默认情况大多数不能登录系统shell为/sbin/nologin

    满足条件:每个文件和进程,都需要对应一个用户和用户组

    500-65535

    普通用户(百姓)

    普通账户UID,当使用useradd gandalf建立账户时,默认情况下UID就是从500开始的。当然,我们也可以指定UID来创建或修改账户的UID

    6.2 用户和组的对应关系

    用户和组的对应关系有:一对一、一对多、多对一和多对多,方便理解,我们通过图形的方式来展示这种对应关系

    文字说明:

    1)    一对一:即一个用户可以存在一个组中,也可以是组中唯一的成员。如:root
    2)    一对多:即一个用户可以存在于多个用户组中。比如,上图中普通用户oldboy可以是sa组成员,也可以是java用户组成员,还可以是tech用户组成员,这里的oldboy用户具有sa、java、tech多个组的共同权限
    3)    多对一:即多个用户可以存在于一个组中,这些用户具有和组相同的权限
    4)    多对多:即多个用户可以存在多个组中,并且几个用户可以归属相同的组;其实多对多的关系是前面三条的扩展

    6.3 用户和用户组涉及配置文件说明

    新用户创建涉及到四个配置文件包括:/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow,每创建一个新用户都会向这四个配置文件中追加一行用户内容信息

    用户/etc/passwd配置文件7列说明:

    root

    :x

    :0

    :0

    :root

    :/root

    :/bin/bash

    账户名称

    :账户密码

    :账户UID

    :账号组GID

    :用户说明

    :用户家目录

    :shell解释器

    用户密码/etc/shadow配置文件说明:

    小结论

        useradd创建用户会更改/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow
        passwd设置用户密码会更改/etc/shadow

    用户组/etc/group配置文件说明

    字段名称

    注释说明

    用户组名

    该组的名称

    用户组密码

    通常不需要设置该密码,由于安全原因,该密码被记录在/etc/gshadow中,因此显示为“x”,类似用户密码被记录在/etc/shadow

    GID

    用户组ID

    用户组成员

    加入这个组的所有用户账号

    [root@oldboy ~]# grep "wheel" /etc/group

    wheel:x:10:gandalf

  • 相关阅读:
    JSP版LCX:端口转发神器 KPortTran
    使用 JavaScript 实现对 PDF 的全文索引
    伙伴分配器的一个极简实现
    java创建线程的三种方式及其对照
    【版本号公布】Jeecg-P3 1.0 公布,J2EE微服务框架(插件开发)
    linux c 获取当前执行进程总数
    C++入门学习——模板
    GSON学习笔记之初识GSON
    Python学习笔记_Python对象
    怎样在OTN站点高速找到asm包并下载 (Oracle RAC)
  • 原文地址:https://www.cnblogs.com/Wolf-Dreams/p/10692835.html
Copyright © 2011-2022 走看看