Linux从零学习记录(四)

目录

第六章:Linux文件与目录管理

6.1 目录与路径

1.相对目录与绝对路径

2.目录的相关操作

3.关于执行文件路径的变量:$PATH

6.2 文件与目录管理

1.文件与目录的查看:ls

2.复制、删除与移动:cp、rm、mv

3.获取路径的文件名与目录名称

6.3 文件内容查看

1.直接查看文件内容

2.可翻页查看

3.数据截取

4.非纯文本文件:od

5.修改文件时间或创建新文件:touch

6.4 文件与目录的默认权限与隐藏权限

1.文件默认权限:umask

2.文件隐藏属性

3.文件特殊权限:SUID、SGID、SBIT

4.观察文件类型:file

6.5 命令与文件的查找

1.脚本文件的查找

2.文件的查找

6.6 极重要的复习,权限与命令间的关系


第六章:Linux文件与目录管理

6.1 目录与路径

1.相对目录与绝对路径

Linux 系统中所有的文件(目录)都被组织成以根目录“/”开始的倒置的树状结构

Linux从零学习记录(四)_第1张图片

绝对路径一定是由根目录 / 开始写起。例如,使用绝对路径的表示方式指明 bin 文件所在的位置,该路径应写为 ../bin

可以看到,如果仅传递给 Linux 系统一个文件名,它无法找到指定文件;而当将 bin 文件的绝对路径传递 Linux 系统时,它就可以成功找到。
和绝对路径不同,相对路径不是从根目录 / 开始写起,而是从当前所在的工作目录开始写起。使用相对路径表明某文件的存储位置时,经常会用到前面讲到的 2 个特殊目录,即当前目录(用 . 表示)和父目录(用 .. 表示)。
举个例子,当我们使用 root 身份登录 Linux 系统时,当前工作目录默认为 /root,如果此时需要将当前工作目录调整到 root 的子目录 Desktop 中,当然可以使用绝对路径。

对于文件名的正确性来说,绝对路径的正确度要比较好

2.目录的相关操作

常用的特殊目录

.    当前目录
..    上一层目录
-    前一个工作目录
~    当前【用户】所在的家目录

注意:在根目录下查询目录结构,可以发现存在 ... 两个目录,但可以发现两个目录的属性权限完全一致,代表根目录的上级目录与自身是同一个目录。

常见的处理目录的命令:

  • cd:切换目录
  • pwd:显示当前目录
  • mkdir:建立一个新目录
  • rmdir:删除一个空目录

cd(change directory,切换目录)

Linux从零学习记录(四)_第2张图片

cd- 表示切换到刚才的目录。

 

pwd(显示目前所在的目录)

Linux从零学习记录(四)_第3张图片

pwd单独使用时显示出实际的工作目录,而非链接文本本身的目录名而已;

pwd -P 时,不会显示链接文件的路径,而是显示正确的完整路径。

 

mkdir(建立新目录)

命令格式: mkdir [-mp] 目录名称

选项与参数:

-m:设置文件的权限,直接设置,不使用默认权限(umask)

-p:帮助你直接将所需要的目录(包含上层目录)递归创建

范例1:利用-p递归建立目录(没有加 -p 时会报告路径错误)

Linux从零学习记录(四)_第4张图片

范例2:设置新建目录权限

Linux从零学习记录(四)_第5张图片

若没有加上 -m 强制设置属性,系统会使用默认属性。

 

rmdir(删除“空”的目录)

Linux从零学习记录(四)_第6张图片

有内容的文件夹无法直接删除,如果需要全部删除目录下文件必须使用【rm -r test】

 

3.关于执行文件路径的变量:$PATH

执行【echo $PATH】可以看到哪些

Linux从零学习记录(四)_第7张图片

PATH这个变量的内容是由一堆目录所组成,每个目录中间用冒号(:)来隔开,每个目录有顺序之分。

  • 不同身份用户默认的PATH不同,默认能够随意执行的命令也不同(如root与neos);
  • PATH 是可以修改的;
  • 使用绝对路径或相对路径直接指定某个命令的文件名来执行,会比查找PATH来的正确;
  • 命令应该要放置到正确的目录下,执行才会比较方便;
  • 本目录(.)最好不要放到PATH当中。

6.2 文件与目录管理

1.文件与目录的查看:ls

选项 功能
-a 显示全部的文件,包括隐藏文件(开头为 . 的文件)也一起罗列出来,这是最常用的选项之一。
-A 显示全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录。
-d 仅列出目录本身,而不是列出目录内的文件数据。
-f ls 默认会以文件名排序,使用 -f 选项会直接列出结果,而不进行排序。
-F 在文件或目录名后加上文件类型的指示符号,例如,* 代表可运行文件,/ 代表目录,= 代表 socket 文件,| 代表 FIFO 文件。
-h 以人们易读的方式显示文件或目录大小,如 1KB、234MB、2GB 等。
-i 显示 inode 节点信息。
-l 使用长格式列出文件和目录信息。
-n 以 UID 和 GID 分别代替文件用户名和群组名显示出来。
-r 将排序结果反向输出,比如,若原本文件名由小到大,反向则为由大到小。
-R 连同子目录内容一起列出来,等於将该目录下的所有文件都显示出来。
-S 以文件容量大小排序,而不是以文件名排序。
-t 以时间排序,而不是以文件名排序。
--color=never
--color=always
--color=auto
never 表示不依据文件特性给予颜色显示。
always 表示显示颜色,ls 默认采用这种方式。
auto 表示让系统自行依据配置来判断是否给予颜色。
--full-time 以完整时间模式 (包含年、月、日、时、分)输出
--time={atime,ctime} 输出 access 时间或改变权限属性时间(ctime),而不是内容变更时间。

2.复制、删除与移动:cp、rm、mv

cp(复制文件或目录)

命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination)
cp [option] source1 source2 source3 … directory
参数说明:

  • -a:是指archive的意思,也说是指复制所有的目录
  • -d:若源文件为连接文件(link file),则复制连接文件属性而非文件本身
  • -f:强制(force),若有重复或其它疑问时,不会询问用户,而强制复制
  • -i:若目标文件(destination)已存在,在覆盖时会先询问是否真的操作
  • -l:建立硬连接(hard link)的连接文件,而非复制文件本身
  • -p:与文件的属性一起复制,而非使用默认属性
  • -r:递归复制,用于目录的复制操作
  • -s:复制成符号连接文件(symbolic link),即“快捷方式”文件
  • -u:若目标文件比源文件旧,更新目标文件

如将/test1目录下的file1复制到/test3目录,并将文件名改为file2,可输入以下命令:
cp /test1/file1 /test3/file2

 在默认的条件中,cp的源文件与目标文件的权限是不同的,目标文件的拥有者通常会是命令操作者本身。

Linux从零学习记录(四)_第8张图片

注:使用 -l 及 -s 都会建立所谓的链接文件(link file),但是这两种链接文件却有不一样的情况。

-l 是硬链接(hard link),-s 是符号链接(symbolic link),简单来说,bashrc_link 是一个快捷方式,这个快捷方式会链接到bashrc;

而 bashrc_slink 的文件与 bashrc 的属性与权限完全一模一样。

例:用neos的身份将/var/log/wtmp 文件复制到 /tmp 下面,并更名为 neos_wtmp

可以看到neos的身份不能随意修改文件的拥有者与用户组,虽然能复制wtmp的相关权限与时间等属性,但是与拥有者、用户组相关,即使加上-a 也无法完成完整权限的复制。

 

rm(删除文件或目录)

用户可以用rm命令删除不需要的文件。该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是断开了链接,原文件保持不变。

rm命令的一般形式为:rm [选项]... 目录... 删除指定的<文件>(即解除链接)。

  • -d      --directory    删除可能仍有数据的目录 (只限超级用户)
  • -f      --force          略过不存在的文件,不显示任何信息,强制删除
  • -i      --interactive 进行任何删除操作前必须先确认
  • -r/R --recursive    同时删除该目录下的所有目录层
  • -v      --verbose     详细显示进行的步骤

 

mv(移动文件与目录,或重命名)

  • -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
  • -i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。
  • -f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
  • -n: 不要覆盖任何已存在的文件或目录。
  • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

 

将多个文件移动到一个目录下,则最后一个参数为指定目录。

3.获取路径的文件名与目录名称

前者获取最后的文件名;后者取得目录名。

 

6.3 文件内容查看

  • cat由第一行开始显示文件内容
  • tac 从最后一行开始开始显示,可以看出 tac 是 cat 的倒着写
  • nl 显示的时候,同时输出行号
  • more 一页一页地显示文件内容
  • less 与 more 类似,但是比 more 更好的是,它可以往前翻页
  • head 只看前面几行
  • tail 只看后面几行
  • od 以二进制的方式读取文件内容

1.直接查看文件内容

直接查看文件内容可以使用 cat/tac/nl 几个命令。

cat(concatenate)

命令格式:cat [-AbeEnstTuv] [--help] [--version] fileName

cat也可以用于创建文件、合并文件。

  • -n 或 --number:由 1 开始对所有输出的行数编号。
  • -b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
  • -s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
  • -v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
  • -E 或 --show-ends : 在每行结束处显示 $。
  • -T 或 --show-tabs: 将 TAB 字符显示为 ^I。
  • -A, --show-all:等价于 -vET。
  • -e:等价于"-vE"选项;
  • -t:等价于"-vT"选项; 

tac 

tac 与 cat 相反,相当于将命令反写打印出来。

nl(添加行号打印)

选项与参数:
-b  :指定行号指定的方式,主要有两种:
      -b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
      -b t :如果有空行,空的那一行不要列出行号(默认值);
-n  :列出行号表示的方法,主要有三种:
      -n ln :行号在萤幕的最左方显示;
      -n rn :行号在自己栏位的最右方显示,且不加 0 ;
      -n rz :行号在自己栏位的最右方显示,且加 0 ;
-w  :行号栏位的占用的位数。

2.可翻页查看

more(一页一页翻动)

Linux从零学习记录(四)_第9张图片

空白键 (space):代表向下翻一页;
Enter :代表向下翻『一行』;
/字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
:f :立刻显示出档名以及目前显示的行数;
q :代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

 

less

less的用法比起more更有弹性,在more的时候,我们并没有办法向前面翻,只能往后面看,但若使用了less时,就可以使用 [pageup]、[pagedown] 等按键的功能来往前往后翻看文件。

less里面可以拥有更多的查找功能。不止可以向下查找,也可以向上查找,基本命令有:

空白键 :向下翻动一页;
[pagedown]:向下翻动一页;
[pageup] :向上翻动一页;
/字串 :向下搜寻『字串』的功能;
?字串 :向上搜寻『字串』的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
q :离开 less 这个程序;

3.数据截取

我们可以将输出的数据作一个简单的截取,那就是取出文件前面几行(head)或取出后面几行(tail)文字的功能。不过要注意的是head与tail都是以“行”为单位来进行数据截取的。

head

[root@www ~]# head [-n number] 文件 
选项与参数:
-n  :后面接数字,代表显示几行的意思

[root@www ~]# head /etc/man.config
# 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样:
[root@www ~]# head -n 20 /etc/man.config

范例:如果后面100行的数据都不列印,只列印/etc/man.config的前面几行,该如何是好?

tail

[root@www ~]# tail [-n number] 文件 
选项与参数:
-n  :后面接数字,代表显示几行的意思
-f  :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测

[root@www ~]# tail /etc/man.config
# 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
[root@www ~]# tail -n 20 /etc/man.config

范例一:如果不知道/etc/man.config有几行,却只想列出100行以后的数据时?
[root@www ~]# tail -n +100 /etc/man.config

范例二:持续侦测/var/log/messages的内容

  <==要等到输入[crtl]-c之后才会离开tail这个命令的侦测!

4.非纯文本文件:od

上面的都是查看纯文本文件的内容。如果想要查看非文本文件,举例   说/user/bin/passwd 这个执行文件的内容时,又该如何读出信息呢?

事实上由于执行文件通常都是二进制文件(binary file),使用以上命令读取内容时会产生类似乱码的数据。所以我们可以利用od这个命令来读取。

选项或参数:
-t  :后面可以接各种『类型 (TYPE)』的输出,例如:
      a       :利用默认的字节来输出;
      c       :使用 ASCII 字节来输出
      d[size] :利用十进位(decimal)来输出数据,每个整数占用 size bytes ;
      f[size] :利用浮点数值(floating)来输出数据,每个数占用 size bytes ;
      o[size] :利用八进位(octal)来输出数据,每个整数占用 size bytes ;
      x[size] :利用十六进位(hexadecimal)来输出数据,每个整数占用 size bytes ;
将/etc/issue这个文件的内容以8进位列出储存值与ASCII的对照表

5.修改文件时间或创建新文件:touch

选项与参数:
-a  :仅修订 access time;
-c  :仅修改文件的时间,若该文件不存在则不创建新文件;
-d  :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
-m  :仅修改 mtime ;
-t  :后面可以接欲修订的时间而不用目前的时间,格式为[YYMMDDhhmm]

修改时间 modification time (mtime):
当该文件的『内容数据』变更时,就会升级这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!

状态时间 status time (ctime):
当该文件的『状态 (status)』改变时,就会升级这个时间,举例来说,像是权限与属性被更改了,都会升级这个时间啊。

读取时间 access time (atime):
当『该文件的内容被取用』时,就会升级这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会升级该文件的 atime 了。

默认情况下,ls 显示出来的是文件的mtime,也就是该文件的内容上次被修改的时间。

例1:新建一个空白文件观察时间;

例2:将~/.bashrc 复制成为bashrc,假设复制完整的属性,检查其日期。

Linux从零学习记录(四)_第10张图片

可以观察例2的输出:

1.当前时间

2.mtime

3.atime

4.ctime

例3:修改例2的 bashrc 文件时间,将其调整为两天前。

可以看到日期从11月16日变为了11月14日。

例4:将上个例子的bashrc日期改为 2014/06/15 2:02。

 

6.4 文件与目录的默认权限与隐藏权限

前面已经了解了文件有若干个属性,包括读写执行(r、w、x)等基本权限以及是否为目录(d)与文件(-)或者链接文件(l)等属性。

除了基本权限外,在Linux传统的额ext2、ext3、ext4文件系统下,我们还可以设置其他的系统隐藏属性,这部分可以使用 chattr 来设置,而以 lsattr 来查看,最重要的属性就是可以设置其不可修改的特性,让文件的拥有者都不可以进行修改。这在安全功能上非常重要。

例:你的系统中有一个一般用户 neos,他的用户组属于 neos,他的根目录在 /home/neos,你是root,你想将你的~/.bashrc 复制给它,可以怎么做?

如下:

例:我想在/tmp下面建立一个目录,这个目录名称为诶chapter6_1,并且这个目录拥有者为neos,用户组为 neos,此外,任何人都可以进入该目录浏览文件,不过除了neos之外,其他人都不能修改该目录下的文件。

1.文件默认权限:umask

现在我们已经知道如何建立或是改变一个目录或文件的属性了,但当你建立一个新的文件或目录时,它的默认权限就和umask有关了。umask就是制定目前用户在建立文件或目录时候的权限默认值,它的指定条件以下面的方式来指定:

直接输入umask可以看到数字类型的权限设置值;加入-S(Symbolic)这个选项,就会以符号类型的方式来显示出权限。

其中四组数字中,第一组是特殊权限使用的。

在默认权限的属性上,目录与文件是不一样的。

  • 若用户建立为文件则默认没有可执行(x)权限,即只有rw这两个项目,也就是最大为666,默认权限如下:

-rw-rw-rw-

  • 若用户建立为目录,则由于x与是否可以进入此目录油管,因此默认为所有权限均开放,即777,默认权限如下:

drwxrwxrwx

要注意的是,umask 的数字指的是该默认值需要减掉的权限

因为umask的默认值为022,所以user并没有被拿掉任何权限,但group与others的权限被拿掉了2(也就是w这个权限),那么当游湖:

  • 建立文件时:(-rw-rw-rw)-(-----w--w-)==> -rw-r--r--
  • 建立目录时:(drwxrwxrwx)-(d----w--w-)==> drwxr-xr-x

但如果要使创建的额文件能够让同组用户共同编辑,那么umask的用户组就不能拿掉2这个w的权限,所以usmask应该设置为002才可以。要改变umask的值,只需直接在umask后面输入002就好。

2.文件隐藏属性

文件隐藏属性在系统安全上非常重要。但是下面的chattr命令只能在ext2、ext3、ext4的Linux传统文件系统上面完整生效,其他的文件系统可能就无法完整地支持这个命令了。

  • chattr(配置文件隐藏属性)

chattr命令的用法:chattr [ -RVf ] [ -v version ] [ mode ] files…
最关键的是在[mode]部分,[mode]部分是由+-=和[ASacDdIijsTtu]这些字符组合的,这部分是用来控制文件的
属性。

  • + :在原有参数设定基础上,追加参数。
  • - :在原有参数设定基础上,移除参数。
  • = :更新为指定参数设定。
  • A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
  • S(同步):硬盘I/O同步选项,功能类似sync。
  • a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
  • c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
  • d:即no dump,设定文件不能成为dump程序的备份目标。
  • i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
  • j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
  • s(secret):保密性地删除文件或目录,即硬盘空间被全部收回。
  • u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。

各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。

 以下示例为建立一个空文件给它加上隐藏属性->无法被删除,可以看到即使是root也无法将其删除,需要先将这个隐藏属性去除才能执行。

Linux从零学习记录(四)_第11张图片

这些隐藏属性中,最重要的当属+i+a。+i可以让一个文件无法被修改,对系统安全十分重要;+a可以针对logfile这样的日志文件设置可以增加但不能修改旧数据与删除的属性。

  • lsattr(显示文件隐藏属性)

lsattr命令的用法:lsattr [-adlRvV][文件或目录...]

  • -a  显示所有文件和目录,包括以"."为名称开头字符的额外内建,现行目录"."与上层目录".."。
  • -d  显示,目录名称,而非其内容。
  • -l  此参数目前没有任何作用。
  • -R  递归处理,将指定目录下的所有文件及子目录一并处理。
  • -v  显示文件或目录版本。
  • -V  显示版本信息。

3.文件特殊权限:SUID、SGID、SBIT

当我们查看/tmp、bin/passwd目录的权限时可以发现,除了通常的三大权限rwx以外,居然还有别的特殊权限(s、t)存在。

s与t这两个权限的意义与系统的账号及系统的进程管理较为相关。

s在之中称为SUID与SGID。

  • Set UID

       当s这个标志出现在文件拥有者的x权限上时,例如刚刚的/bin/passwd文件的权限状态【-rwsr-xr-x】,此时就被称为Set UID,简称为SUID的特殊权限。基本上SUID有这样的限制与功能:

  • SUID权限仅对二进制程序有效;
  • 执行者对于该程序需要具有x的可执行权限;
  • 本权限仅在执行程序的过程中有效(run-time);
  • 执行者将具有该程序拥有者(owner)的权限。

打个比方,系统中所有账号的密码都记录在/etc/shadow这个文件当中,这个文件的权限为【----------1 root root】,表示这个文件仅有root可读且有root可以强制写入而已。但一般用户虽然没有读写权限,却依然可以更改自己的密码。因为这是SUID的功能。由此可知:

  1. neos(一般用户)对于/bin/passwd这个程序来说是拥有x的权限,表示neos可以执行【passwd】;
  2. passwd的拥有者是root这个账号;
  3. neos执行passwd的过程中,会【暂时】获得root的权限;
  4. /etc/shadow就可以被neos所执行的passwd所修改。

注:这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在shell脚本上(script),因为脚本还是把很多的程序集合到一起来执行,而不是脚本自身在执行。同样,这个SUID也不能放到目录上,放上也是无效的。

  • Set GID

       当s标志在文件拥有者的x项为SUID,那s在用户组的x时则称为Set GID(SGID),举例来说,可以用下面的命令来观察到具有SGID权限的文件:

与SUID不同的是,SGID可以针对文件或目录来设置。如果是文件,SGID有如下功能:

  • SGID对二进制程序有用;
  • 程序执行者对于该程序来说,需具备x的权限;
  • 执行者在执行的过程中将会获得该程序用户组的支持。

 举例说上面的/bin/locate这个程序可以去查找/var/lib/mlocate/mlocate.db这个文件的内容,mlocate.db的权限如下:

与SUID类似,如果使用用户neos这个账号执行locate时,那neos将会祛痘的slocate用户组的支持,因此就能读取mlocate.db

除了二进制程序外,SGID也能够用在目录中,这也是非常常见的用途。当一个目录设置了SGID的权限后,将具有如下的功能:

  • 用户若对于此目录具有r与x的权限时,该用户能够进入此用户;
  • 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组;
  • 用途:若用户在此目录下具有w的权限(可以新建文件),则该用户建立的新文件,该新文件的用户组与此目录的用户组相同。
  • Sticky Bit

这个Sticky Bit(SBIT)目前只针对目录有效,对于文件已经没有效果了。作用是:

  • 当用户对于此目录具有w、x权限,即具有写入的权限;
  • 当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除该文件。

使只有文件或者目录的所有者才能删除文件或者目录。

可以用如下的范例解释:

本身/tmp具有的权限是【drwxrwxrwt】,这样任何人都可以在/tmp内新增、修改文件,但仅有该文件/目录建立者与root能够删除自己的目录或文件。

  • SUID/SGID/SBIT权限设置

可以用数字或字母方法:

  • 4 为 SUID = u+s

  • 2 为 SGID = g+s

  • 1 为 SBIT = o+t

假设要将一个文件权限改为【-rwsr-xr-x】时,由于s在用户权限中,所以是SUID,因此,在原先的755之前还要加上4,也就是【chmod 4755 filename】。

范例:

  1. 建立一个空文件test
  2. 加入具有SUID的权限
  3. 加入具有SUID/SGID的权限
  4. 加入具有SBIT的功能
  5. 具有空的SUID/SGID权限

最后一个例子出现的大写S和T,代表的是空权限。因为SUID是表示该文件在执行的时候具有文件拥有者的权限,但是文件的拥有者都无法执行了,权限就变成空的了。)

Linux从零学习记录(四)_第12张图片

注:必须了解SUID不是用在目录上,SBIT不是用在文件上。

4.观察文件类型:file

如果想要知道某个文件的基本信息,例如是属于ASCII或是数据文件或是二进制文件,且其中有没有使用到动态链接库(share library)等信息,就可以使用file来查看:

 

6.5 命令与文件的查找

1.脚本文件的查找

在命令行模式中,连续输入两次【tab】按键就能知道用户有多少命令可以执行。这些命令的完整文件名存放的位置可以通过which或者type来查找。

  • which(查找【执行文件】)

语法:which [文件...]

  • -n<文件名长度>  指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。

  • -p<文件名长度>  与-n参数相同,但此处的<文件名长度>包括了文件的路径。

  • -w  指定输出时栏位的宽度。

  • -V  显示版本信息。

Linux从零学习记录(四)_第13张图片

这里看到居然找不到history命令的路径。其实这个命令是根据【PATH】这个环境变量所规范的路径,去查找执行文件的文件名。因为history是bash内置的命令。但是which默认是找PATH内所设置的目录。所以我们可以使用type这个命令。

2.文件的查找

通常find不很常用(速度慢,影响硬盘性能)。

一般都是先使用whereis或是locate来检查,最后如果没有结果再使用find。

  • whereis:只找系统中某些特定目录下的文件而已(主要是针对/bin /sbin下面的执行文件,以及 /user/share/man 下面的 man page 文件);
  • locate:利用数据库来查找文件名。
  • find:直接查找硬盘。

 

  • whereis

语法:whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]

  • -b  只查找二进制文件。
  • -B<目录>  只在设置的目录下查找二进制文件。
  • -f  不显示文件名前的路径名称。
  • -m  只查找说明文件。
  • -M<目录>  只在设置的目录下查找说明文件。
  • -s  只查找原始代码文件。
  • -S<目录>  只在设置的目录下查找原始代码文件。
  • -u  查找不包含指定类型的文件。

例1:找出ifconfig这个文件名。

例2:只找出跟passwd有关的【说明文件】文件名(man page)

全部列出:

只有在man里面的文件名才显示:

 

  • locate/updatedb
语法:locate [-d ][--help][--version][范本样式...]
  • -b, --basename -- 仅匹配路径名的基本名称
  • -c, --count -- 只输出找到的数量
  • -d, --database DBPATH -- 使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
  • -e, --existing -- 仅打印当前现有文件的条目
  • -1 -- 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。
  • -0, --null -- 在输出上带有NUL的单独条目
  • -S, --statistics -- 不搜索条目,打印有关每个数据库的统计信息
  • -q -- 安静模式,不会显示任何错误讯息。
  • -P, --nofollow, -H -- 检查文件存在时不要遵循尾随的符号链接
  • -l, --limit, -n LIMIT -- 将输出(或计数)限制为LIMIT个条目
  • -n -- 至多显示 n个输出。
  • -m, --mmap -- 被忽略,为了向后兼容
  • -r, --regexp REGEXP -- 使用基本正则表达式
  • --regex -- 使用扩展正则表达式
  • -q, --quiet -- 安静模式,不会显示任何错误讯息
  • -s, --stdio -- 被忽略,为了向后兼容
  • -o -- 指定资料库存的名称。
  • -h, --help -- 显示帮助
  • -i, --ignore-case -- 忽略大小写
  • -V, --version -- 显示版本信息

例1:找出系统中所有与passwd相关的文件名,且只列出5个。

例2:列出locate查询所使用的数据库文件之文件名与各数据的数量。

locate直接在后面输入文件的部分名称后就能得到结果。

但是locate有使用上的限制,因为locate寻找的数据是由已建立的数据库 /var/lib/mlocate/ 里面的数据查找到的。但正因为它是由数据库来查找的,而数据库的建立默认是在每天执行一次(CentOS 7.x是每天更新一次数据库)。

要手动更新数据库直接输入【updatedb】。

 

  • find

语法:find path -option [ -print ] [ -exec -ok command ] {} \;

1.与时间有关的选项:共有-atime、-ctime、-mtime。

  • -mtime n:n为数字,意义为在n天之前的【一天之内】被修改过内容的文件;
  • -mtime +n
  • -mtime -n
  • -newer file:file为一个存在的文件,列出比file还要新的文件。

例1:将过去系统上面24小时内有修改过内容(mtime)的文件列出:

#0代表目前的时间。所以从现在开始到24小时前有变动过内容的额文件都会被显示。

#如果是三天前那一天的24小时内,就用 find / -mtime 3

 

例2:寻找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出

 

例1中列出了按时间参数来查找文件的范例。如果要找出4天内被修改过的文件,那可以使用【find /var -mtime -4】,如果是4天前的那一天就使用【find /var -mtime 4】。

  • +4代表大于等于5天前的文件:ex> find /var -mtime +4
  • -4代表小于等于4天内的文件:ex> find /var -mtime -4
  • 4则是代表4-5那一天的文件:ex> find /var -mtime 4

2.与使用者或用户组名称有关的参数:

  • -uid n:n为数字,这个数字是使用者的账号ID,即UID,这个UID是记录在 /etc/passwd 里面与账号名称对应的数字
  • -user name:name为使用者账号名称,例如neos
  • -group name:name为用户组名称,例如users
  • -nouser:查找文件的拥有者不在 /etc/passwd 中
  • -nogroup:查找文件的拥有用户组不存在于 /etc/group 中

例3:查找home下面属于neos的文件

Linux从零学习记录(四)_第14张图片

例4:查找系统中不属于任何人的文件

可以找出不正常的文件,或是曾经以源代码自行编译软件时的文件。

3.与文件权限及名称有关的参数:

  • -name filename:查找文件名称为filename的文件
  • -size [+ -] SIZE:查找比SIZE还要大(+)或小(-)的文件,这个SIZE的规格有:c代表Bytes,k代表1024Bytes
  • -type TYPE:查找文件的类型为TYPE的,类型主要有:一般正规文件(f),设备文件(b,c),目录(d),链接文件(l),socket(s),及FIFO(p)等属性。
  • -perm mode:精确匹配mode所表示的条件;
  • -perm /mode:任何一类用户(ugo)的权限中的任何一位(rwx)符合mode所表示的条件即可,9位权限之间存在“或”关系;
  • -perm -mode:任何一类用户(ugo)的权限中的每一位(rwx)都要同时符合mode所表示的条件,9位权限之间存在“与”关系;

例5:查找文件名,关键字可用*处理

Linux从零学习记录(四)_第15张图片

例5-1:找出文件名包含了passwd这个关键字的文件

Linux从零学习记录(四)_第16张图片

例6:找出/run目录下,文件类型为socket的文件名有哪些?

Linux从零学习记录(四)_第17张图片

例7:查找文件当中含有SGID,SUID或SBIT的属性。

Linux从零学习记录(四)_第18张图片

find的特殊功能:

  • -exec command:command为其他命令,-exec后面可再接额外的命令来处理查找到的结果。
  • -print:将结果打印到屏幕上,这是默认操作

例8:将例7中找到的文件使用ls -l列出来。

Linux从零学习记录(四)_第19张图片

# -exec后面的ls -l就是额外的命令,命令不支持命令别名

#所以仅能使用ls -l不可以使用ll

  • {}代表的是由find找到的内容,如例8所示,find的结果会被放置到{}位置中;
  • -exec一直到 \;是关键词,代表find额外操作的开始(-exec)到结束(\;),在这中间的就是find命令内的额外操作。在本例中就是【ls -l {}】;
  • 因为【;】在bash环境下是有特殊意义的,因此利用反斜杠来转义。

例9:找出系统中大于8MB的文件。

Linux从零学习记录(四)_第20张图片

fnd还可以用通配符来查找文件名。

 

6.6 极重要的复习,权限与命令间的关系

一、让用户能进入某目录成为可工作目录的基本权限是什么?

  • 可使用的命令:例如cd等变换工作目录的命令;
  • 目录所需权限:用户对这个目录至少需要具有x的权限;
  • 额外需求:如果用户想要在目录内利用ls查看文件名,则用户对此目录还需要r的权限;

二、用户在某个目录内读取一个文件的基本权限是什么?

  • 可使用的命令:例如本章谈到的cat,more,less等;
  • 目录所需权限:用户对这个目录至少需要x权限;
  • 文件所需权限:用户对文件至少需要具有r的权限才行。

三、让用户可以修改一个文件的基本权限是什么?

  • 可使用的命令:例如nano或未来要介绍的vi编辑器等;
  • 目录所需权限:用户在该文件所在的目录至少要有x权限;
  • 文件所需权限:用户对该文件至少要有r、w权限。

四、让一个用户可以建立一个文件的基本权限是什么?

  • 目录所需权限:用户在该目录要具有w、x的权限,重点在w;

五、让用户进入某目录并执行该目录下的某个命令之基本权限是什么?

  • 目录所需权限:用户在该目录至少要有x的权限;
  • 文件所需权限:用户在该文件至少需要有x的权限。

 

 

 

 

                                                                                                                     

 

你可能感兴趣的:(Linux学习,linux,centos)