【7.1】目录与路径
【7.1.2】目录相关操作
1)特殊目录列表:
(1)
2)目录操作命令,底下我们就来谈一谈几个常见的处理目录的命令吧:
cd:变换目录
pwd:显示目前的目录
mkdir:创建一个新的目录
rmdir:删除一个空的目录
【荔枝】pwd 显示当前目录 == print working directory
pwd [-P] 显示当前路径,而非使用连接link路径;
(2)
因为 /var/mail 是连结档,连结到 /var/spool/mail
# 所以,加上 pwd -P 的选项后,会不以连结档的数据显示,而是显示正确的完整路径啊!
【荔枝】mkdir [mp] 目录名称
-m :配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~
-p :帮助你直接将所需要的目录(包含上一级目录)递归创建起来!
(3)
(4)
【荔枝】rmdir [-p] 目录名称, 删除目录
-p 连同上层的空目录一起删除;
(5)
rmdir 仅能删除空的目录;
【7.1.3】关于执行文件路径的变量: $PATH
1)打印$PATH 变量
(6)
2)一般身份用户无法使用 ifconfig eth0;但使用 /sbin/ifconfig eth0 可以执行;
3)把 ls 移动到 /root 目录下,ls 无法执行了,因为ls文件不在 $PATH 路径下: ls是 root目录下的可执行文件;故 /root/ls 可以执行;
(7)
如果想要 root 目录下ls可以执行, 那就将 /root 目录加入到 PATH 中;
PATH="$PATH":/root
(8)
【总结】
不同身份使用者默认的PATH不同,默认能够随意运行的命令也不同(如root与vbird);
PATH是可以修改的,所以一般使用者还是可以透过修改PATH来运行某些位於/sbin或/usr/sbin下的命令来查询;
使用绝对路径或相对路径直接指定某个命令的档名来运行,会比搜寻PATH来的正确;
命令应该要放置到正确的目录下,运行才会比较方便;
本目录(.)最好不要放到PATH当中。
【7.2】文件与目录管理
【7.2.1】查看文件与目录: ls
(9)
【荔枝1】将主文件夹下的所有文件列出来
(10)
(11)
【荔枝3】完整的呈现文件的修改时间 *(modification time)
(12)
【7.2.2】复制,删除与移动: cp, rm , mv
【荔枝1】cp-复制文件或目录
(13)
1)-i: 若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
(14)
2)-a:相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用) 把文件的整个属性复制过来;
(15)
(16)
3)复制 /etc/ 目录下的所有内容到 /tmp 下面
(17)
4)利用cp 创建一个符号链接文件和硬链接文件
(18)
补充1)符号链接 == 快捷方式;
补充2)硬链接和软链接:(https://blog.csdn.net/qq_32907349/article/details/51510593)
硬链接:若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名(见 图 2.hard link 就是 file 的一个别名,他们有共同的 inode)。硬链接可由命令 link 或 ln 创建。
软连接:若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块
5)若~/.bashrc 比 /tmp/bashrc 新才复制过来;(cp -u 参数 常用于备份)
(19)
6)-d 若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;
(20)
cp复制的是源文件,而非链接文件的属性;-d参数可以复制链接文件的属性;
7)将多个文件复制到一个目录下
(21)
8)-a :相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用)
-a可以复制完整权限;
(22)
【cp复制指令总结】在复制时,你必须要清楚的了解到:
是否需要完整的保留来源文件的资讯?
来源文件是否为连结档 (symbolic link file)?
来源档是否为特殊的文件,例如 FIFO, socket 等?
来源档是否为目录?
【荔枝2】rm-移除文件或目录
(23)
1)-i 询问是否删除:
(24)
2)-r删除目录, rmdir仅能删除空目录(没有文件的目录)
(25)
(26)
3)\rm 可以忽略掉 alias的指定参数;在命令前加上反斜线,可以忽略掉 alias 的指定选项喔!
(27)
4)删除一个带有 - 开头的文件
【荔枝3】mv-移动文件(1804022214)
(28)
(29)
【荔枝】通过 rename来更改文件名
经试验,rename根本就不起任何作用;
【7.2.3】取得路径的文件名与目录名称
(30)
(31)
【7.3】文件内容查阅
1)文件内容查阅命令列表:
cat:由第一行开始显示文件内容;
tac:从最后一行开始显示,可以看出 tac 是 cat 的倒著写;
nl:显示的时候,顺道输出行号;
more:一页一页的显示文件内容;
less 与 more 类似:但是比 more 更好的是,他可以往前翻页;
head:只看头几行;
tail:只看尾巴几行;
od:以二进位的方式读取文件内容;
【7.3.1】直接查看文件内容
1)直接查阅一个文件的内容可以使用 cat/tac/nl 这几个命令啊!
(32)
(33)
【荔枝】cat -A :可列出一些特殊字符而不是空白而已;
(34)
补充1)如果加上 -n 或 -b的话,每一行前面还会加上行号;
补充2)鸟哥很少用cat:毕竟当文件内容行数超过40行时,屏幕根本无法显示完全;
【荔枝】tac:反向显示
(35)
【荔枝】nl:添加行号打印
(36)
(37)
【7.3.2】可翻页查看
1)nl, cat, tac 都是一次性打印出文本内容;
2)翻页查看:more 或 less
3)more命令:一页一页翻动(空白键)或一行一行翻动(回车)
空白键 (space):代表向下翻一页;
Enter :代表向下翻『一行』;
/字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
:f :立刻显示出档名以及目前显示的行数;
q :代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
(38)
补充)/输入查询的字符;重复查询同一个字符串,可以直接按 n 即可;
【荔枝】less(一页一页翻动,可前向(空白键或pagedown键)也可后向翻页(pageup键))
空白键 :向下翻动一页;
[pagedown]:向下翻动一页;
[pageup] :向上翻动一页;
/字串 :向下搜寻『字串』的功能;
?字串 :向上搜寻『字串』的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
q :离开 less 这个程序;
(39)
【7.3.3】数据选取
1)head:取出前面几行;
选项与参数:
-n :后面接数字,代表显示几行的意思
(40)
(41)
补充) head -n 负数:不显示后面的负数行;如 head -n -100 不显示第100行到最后的内容;
(42)
2)tail:取出后面几行;
(43)
(44)
补充)-n +正整数 文件名: 列出正整数之后的数据行;tail -n +100 /etc/man.config 列出100行以后的数据;
(45)
【补充】tail -f /var/log/messages: 持续监测 /var/log/messages 的内容;直到输入 ctrl + c 之后才会离开 tail这个命令的执行;
(46)
假如我想要显示 /etc/man.config 的第 11 到第 20 行呢?
答:这个应该不算难,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以结果就是:『 head -n 20 /etc/man.config | tail -n 10 』,这样就可以得到第 11 到第 20 行之间的内容了! 但是里面涉及到管线命令,需要在第三篇的时候才讲的到!
(47)
【7.3.4】纯文本文件:od 查看二进制文件
(48)
荔枝1)将/usr/bin/passwd的内容使用ASCII方式来展现!
(49)
荔枝2)将/etc/issue这个文件的内容以8进位列出储存值与ASCII的对照表
(50)
【7.3.5】修改文件时间或创建新文件:touch
1)每个文件在linux底下都会记录许多的时间参数, 其实是有三个主要的变动时间,那么三个时间的意义是什么呢?
(51)
【荔枝】touch参数列表
(52)
选项与参数:
(53)
荔枝2)将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期
(54)
补充1)ll == ls -l ;其中 ll 是 ls -l 的命令别名;
补充2)分号; : 代表连续命令的下达啦!你可以在一行命令当中写入多重命令, 这些命令可以『依序』运行。
补充3)至於运行的结果当中,我们可以发现数据的内容与属性是被复制过来的,因此文件内容时间(mtime)与原本文件相同。 但是由於这个文件是刚刚被创建的,因此状态(ctime)与读取时间就便呈现在的时间啦! 那如果你想要变更这个文件的时间呢?可以这样做:
【荔枝】修改文件的时间;
(55)
补充)atime mtime 改变了, 但ctime没有改变;
【荔枝2】将bashrc的日期改为 2017/09/15 0202 如下:
(56)
补充)日期在 atime 与 mtime 都改变了,但是 ctime 则是记录目前的时间!
【总结1】touch命令总结:
透过 touch 这个命令,我们可以轻易的修订文件的日期与时间。并且也可以创建一个空的文件喔! 不过,要注意的是,即使我们复制一个文件时,复制所有的属性,但也没有办法复制 ctime 这个属性的。 ctime 可以记录这个文件最近的状态 (status)(即属性和权限) 被改变的时间。无论如何,还是要告知大家, 我们平时看的文件属性中,比较重要的还是属於那个 mtime 啊!我们关心的常常是这个文件的『内容』 是什么时候被更动的说~了乎?
【总结2】touch 这个命令最常被使用的情况是:
创建一个空的文件;
将某个文件日期修订为目前 (mtime 与 atime)
【7.4】文件与目录的默认权限与隐藏权限
1)配置文件的隐藏属性:除了基本r, w, x权限外,在Linux的Ext2/Ext3文件系统下,我们还可以配置其他的系统隐藏属性, 这部份可使用 chattr 来配置,而以 lsattr 来查看,最重要的属性就是可以配置其不可修改的特性!
例题1)root 虽然可以将这个文件复制给 dmtsai,不过这个文件在 dmtsai 的家目录中却可能让 dmtsai 没有办法读写(因为该文件属於 root 的嘛!而 dmtsai 又不能使用 chown 之故)。 此外,我们又担心覆盖掉 dmtsai 自己的 .bashrc 配置档,因此,我们可以进行如下的动作喔:
复制文件: cp ~/.bashrc ~dmtsai/bashrc
修改属性: chown dmtsai:users ~dmtsai/bashrc
例题2)因为除了 dmtsai 之外,其他人不能修改该目录下的文件,所以整个目录的权限应该是 drwxr-xr-x 才对! 因此你应该这样做:
创建目录: mkdir /tmp/chapter7_1
修改属性: chown -R dmtsai:users /tmp/chapter7_1
修改权限: chmod -R 755 /tmp/chapter7_1
【7.4.1】文件默认权限:umask
1)umask 就是:指定 『目前使用者在创建文件或目录时候的权限默认值』, 那么如何得知或配置 umask 呢?他的指定条件以底下的方式来指定:
2)umask表示的是:该默认值需要减掉的权限;(干货——umask)
(57)
-S == Symbolic(符号的)
补充1)怎么 umask 会有四组数字啊?不是只有三组吗?是没错啦。第一组是特殊权限用的,我们先不要理他,所以先看后面三组即可。
补充2)默认的情况如下:
若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下: -rw-rw-rw-;又由于需要减去的权限umask=0022 == 022 == ----w--w- ,所以新建文件最后得到的权限是 -rw-r--r-- ;如上例所示;
若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下:drwxrwxrwx;又由于需要减去的权限umask=0022 == 022 == ----w--w- ,所以新建文件最后得到的权限是 drwxr-xr-x ;如上例所示;
总结如下)
创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
3)如何设置umask?直接在 umask 后面输入 002 就好了!
(58)
例题)假设你的 umask 为 003 ,请问该 umask 情况下,创建的文件与目录权限为?
答:
umask 为 003 ,所以拿掉的权限为 --------wx,因此:
文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目录: (drwxrwxrwx) - (--------wx) = drwxrwxr--
umask总结)在默认的情况中, root 的 umask 会拿掉比较多的属性,root 的 umask 默认是 022 , 这是基於安全的考量啦~至於一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力!
【7.4.2】文件隐藏属性 chattr lsattr
1)不过要先强调的是:底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了。
2)底下我们就来谈一谈如何配置与检查这些隐藏的属性吧!
(59)
补充)注意:属性配置常见的是 a 与 i 的配置值,而且很多配置值必须要身为 root 才能配置;
a :当配置 a 之后,这个文件将只能添加数据,而不能删除也不能修改数据,只有root
才能配置这个属性。
i :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、配置连结也无法
写入或新增数据!』对於系统安全性有相当大的助益!只有 root 能配置此属性;
(60)
3)lsattr (显示文件隐藏属性)
(61)
(62)
怎么会是 -rwsr-xr-x; s 表示什么?
1)Set UID == SUID(针对文件的权限)
当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。 1.1)那么SUID的权限对於一个文件的特殊功能是什么呢?基本上SUID有这样的限制与功能:
● SUID 权限仅对二进位程序(binary program)有效;
● 运行者对於该程序需要具有 x 的可运行权限;
● 本权限仅在运行该程序的过程中有效 (run-time);
● 运行者将具有该程序拥有者 (owner) 的权限。
1.2)SUID荔枝(非常重要的荔枝):我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:『-r-------- 1 root root』,意思是这个文件仅有root可读且仅有root可以强制写入而已。 既然这个文件仅有 root 可以修改,那么鸟哥的 vbird 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入『passwd』这个命令来看看,嘿嘿!一般使用者当然可以修改自己的密码了!
1.3)藉由上述的功能说明,我们可以知道:
● vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd;
● passwd 的拥有者是 root 这个帐号;
● vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限;
● /etc/shadow 就可以被 vbird 所运行的 passwd 所修改。
2.0)当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 罗!是这样没错!^_^。 举例来说,你可以用底下的命令来观察到具有 SGID 权限的文件喔:
(64)
2.1)如果是对文件来说, SGID 有如下的功能:
● SGID 对二进位程序有用;
● 程序运行者对於该程序来说,需具备 x 的权限;
● 运行者在运行的过程中将会获得该程序群组的支持!
【荔枝】举例来说,你可以用底下的命令来观察到具有 SGID 权限的文件喔:
(65)
2.2)当一个目录配置了 SGID 的权限后,他将具有如下的功能:
● 使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
● 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
● 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。
3)Sticky Bit: 这个 Sticky Bit, SBIT 目前只针对目录有效,对於文件已经没有效果了。 SBIT 对於目录的作用是:
● 当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
● 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件;
4)换句话说:当甲这个使用者於 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示『甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。』 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。
【荔枝】举例来说,我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。这个特性也是挺重要的啊!你可以这样做个简单的测试:
● 以 root 登陆系统,并且进入 /tmp 当中;
● touch test,并且更改 test 权限成为 777 ;
● 以一般使用者登陆,并进入 /tmp;
● 尝试删除 test 这个文件!
5)SUID/SGID/SBIT 权限配置:如何配置文件使成为具有 SUID 与 SGID 的权限呢?
那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!
4 为 SUID
2 为 SGID
1 为 SBIT
【荔枝】 假设要将一个文件权限改为『-rwsr-xr-x』时,由於 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来配置!此外,还有大 S 与大 T 的产生喔!参考底下的范例啦!
注意:你必须了解 SUID 不是用在目录上,而 SBIT 不是用在文件上的喔!
【荔枝】SUID SGID权限操作
(66)
补充1)chmod 7666 test; ls -l test : user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是『空的』啦!怎么说? SUID 是表示『该文件在运行的时候,具有文件拥有者的权限』,但是文件 拥有者都无法运行了,哪里来的权限给其他人使用?当然就是空的啦! ^_^
补充2)s 和 t 权限 是基于 x 权限的;如果文件的 user, group 或 others 没有x权限,则其对应的s和t权限是空的,即大S 或 大T;
6)以透过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 罗!来看看如下的范例:
(67)
(68)
【7.4.4】查看文件类型:file
1)如果你想要知道某个文件的基本数据,例如是属於 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的资讯,就可以利用 file 这个命令来检阅喔!
(69)
【7.5】命令与文件的查询
【7.5.1】脚本文件名的查询
1)命令的完整文件名放置在哪里? 通过 which 或 type来查找;
2)which:寻找执行文件;
(70)
【荔枝】如下:
(71)
补充1)which命令是根据『PATH』这个环境变量所规范的路径,去搜寻『运行档』的档名~ 所以,重点是找出『运行档』而已!且 which 后面接的是『完整档名』喔!若加上 -a 选项,则可以列出所有的可以找到的同名运行档,而非仅显示第一个而已!
补充2)怎么 cd 这个常用的命令竟然找不到啊!为什么呢? 这是因为 cd 是『bash 内建的命令』啦! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的啊!那怎办?没关系!我们可以透过 type 这个命令喔!
【7.5.2】文件名的查找
1)通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦!
2)文件名查找命令列表:
(72)
【荔枝】如下:
(73)
(74)
补充) 因为 Linux 系统会将系统内的所有文件都记录在一个数据库文件里面, 而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库文件的内容为准, 因此,有的时后你还会发现使用这两个运行档时,会找到已经被杀掉的文件! 而且也找不到最新的刚刚创建的文件呢!这就是因为这两个命令是由数据库当中的结果去搜寻文件的所在啊! 数据库中的文件记录 与 实际磁盘的文件记录信息不一致。
2.2)locate(搜索速度快,利用数据库来搜寻数据)
(75)
● (76)
● 补充1)因为 locate 寻找的数据是由『已创建的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速罗!
● 补充2)那么有什么限制呢? 就是因为他是经由数据库来搜寻的,而数据库的创建默认是在每天运行一次 (每个 distribution 都不同,CentOS 5.x 是每天升级数据库一次!),所以当你新创建起来的文件, 却还在数据库升级之前搜寻该文件,那么 locate 会告诉你『找不到!』呵呵!因为必须要升级数据库呀!
● 补充3)那能否手动升级数据库哪? 升级 locate 数据库的方法非常简单,直接输入『 updatedb 』就可以了!
● 补充4)updatedb:根据 /etc/updatedb.conf 的配置去搜寻系统硬盘内的档名,并升级 /var/lib/mlocate 内的数据库文件;
● 补充5)locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字档名。
2.3)find(搜索速度慢,直接搜索硬盘)
(77)
荔枝1)将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出:
(78)
荔枝2)寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出:
(79)
+4代表大於等於5天前的档名:ex> find /var -mtime +4
-4代表小於等於4天内的文件档名:ex> find /var -mtime -4
4则是代表4-5那一天的文件档名:ex> find /var -mtime 4
2.3.1)find的其他用法:
(81)
(82)
荔枝1)搜寻 /home 底下属於 pacoson 的文件:
(83)
荔枝2)搜寻系统中不属於任何人的文件:
(84)
荔枝1)找出档名为 passwd 这个文件
(86)
荔枝2)找出 /var 目录下,文件类型为 Socket 的档名有哪些?
(87)
荔枝3)搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性;
(88)
荔枝4)我想要找出来 /bin, /sbin 这两个目录下, 只要具有 SUID 或 SGID 就列出来该文件,你可以这样做:
(89)
补充)因为 SUID 是 4 分,SGID 2 分,总共为 6 分,因此可用 +6000 来处理这个权限! 至於 find 后面可以接多个目录来进行搜寻!
2.3.3)find的其他用法3:
(90)
(91)
荔枝1)将上个范例找到的文件使用 ls -l 列出来~
(92)
荔枝2)找出系统中,大於 1MB 的文件
(93)
补充1)find 的特殊功能就是能够进行额外的动作(action):图解如下:
(94)
补充2)该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键字,这些东西的意义为:
● {} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
● -exec 一直到 \; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 命令内的额外动作。 在本例中就是『 ls -l {} 』罗!
● 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。
补充3)如果你要找的文件是具有特殊属性的,例如 SUID 、文件拥有者、文件大小等等, 那么利用 locate 是没有办法达成你的搜寻的!此时 find 就显的很重要啦! 另外,find 还可以利用通配符来找文件名呢!
荔枝)举例来说,你想要找出 /etc 底下档名包含 httpd 的文件, 那么你就可以这样做:
(95)
一、让使用者能进入某目录成为『可工作目录』的基本权限为何:
● 可使用的命令:例如 cd 等变换工作目录的命令;
● 目录所需权限:使用者对这个目录至少需要具有 x 的权限;
● 额外需求:如果使用者想要在这个目录内利用 ls 查阅档名,则使用者对此目录还需要 r 的权限。
二、使用者在某个目录内读取一个文件的基本权限为何?
● 可使用的命令:例如本章谈到的 cat, more, less等等;
● 目录所需权限:使用者对这个目录至少需要具有 x 权限;
● 文件所需权限:使用者对文件至少需要具有 r 的权限才行!
三、让使用者可以修改一个文件的基本权限为何?
● 可使用的命令:例如 nano 或未来要介绍的 vi 编辑器等;
● 目录所需权限:使用者在该文件所在的目录至少要有 x 权限;
● 文件所需权限:使用者对该文件至少要有 r, w 权限。
四、让一个使用者可以创建一个文件的基本权限为何?
● 目录所需权限:使用者在该目录要具有 w,x 的权限,重点在 w 啦!
五、让使用者进入某目录并运行该目录下的某个命令之基本权限为何?
● 目录所需权限:使用者在该目录至少要有 x 的权限;
● 文件所需权限:使用者在该文件至少需要有 x 的权限。
例题)让一个使用者 pacoson 能够进行『cp /dir1/file1 /dir2』的命令时,请说明 dir1, file1, dir2 的最小所需权限为何?
答:
运行 cp 时, pacoson 要『能够读取来源档,并且写入目标档!』 因此各文件/目录的最小权限应该是:
dir1 :至少需要有 x 权限;
file1:至少需要有 r 权限;
dir2 :至少需要有 w, x 权限。
【7.7】linux文件与目录管理重点回顾
● 绝对路径:『一定由根目录 / 写起』;相对路径:『不是由 / 写起』
● 特殊目录有:., .., -, ~, ~account需要注意;
● 与目录相关的命令有:cd, mkdir, rmdir, pwd 等重要命令;
● rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』命令;
● 使用者能使用的命令是依据 PATH 变量所规定的目录去搜寻的;
● 不同的身份(root 与一般用户)系统默认的 PATH 并不相同。差异较大的地方在於 /sbin, /usr/sbin ;
● ls 可以检视文件的属性,尤其 -d, -a, -l 等选项特别重要!
● 文件的复制、删除、移动可以分别使用:cp, rm , mv等命令来操作;
● 检查文件的内容(读档)可使用的命令包括有:cat, tac, nl, more, less, head, tail, od 等
● cat -n 与 nl 均可显示行号,但默认的情况下,空白行会不会编号并不相同;
● touch 的目的在修改文件的时间参数,但亦可用来创建空文件;
● 一个文件记录的时间参数有三种,分别是 access time(atime), status time (ctime), modification time(mtime),ls 默认显示的是 mtime。
● 除了传统的rwx权限之外,在Ext2/Ext3文件系统中,还可以使用chattr与lsattr配置及观察隐藏属性。 常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性。
● 新建文件/目录时,新文件的默认权限使用 umask 来规范。默认目录完全权限为drwxrwxrwx, 文件则为-rw-rw-rw-。
● 文件具有SUID的特殊权限时,代表当使用者运行此一binary程序时,在运行过程中使用者会暂时具有程序拥有者的权限
● 目录具有SGID的特殊权限时,代表使用者在这个目录底下新建的文件之群组都会与该目录的群组名称相同。
● 目录具有SBIT的特殊权限时,代表在该目录下使用者创建的文件只有自己与root能够删除!
● 观察文件的类型可以使用 file 命令来观察;
● 搜寻命令的完整档名可用 which 或 type ,这两个命令都是透过 PATH 变量来搜寻档名;
● 搜寻文件的完整档名可以使用 whereis 或 locate 到数据库文件去搜寻,而不实际搜寻文件系统;
● 利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的档名。
【7.1.2】目录相关操作
1)特殊目录列表:
![](https://i-blog.csdnimg.cn/blog_migrate/237e1c4ea68fc3f927cbe18b43e34357.png)
(1)
2)目录操作命令,底下我们就来谈一谈几个常见的处理目录的命令吧:
cd:变换目录
pwd:显示目前的目录
mkdir:创建一个新的目录
rmdir:删除一个空的目录
【荔枝】pwd 显示当前目录 == print working directory
pwd [-P] 显示当前路径,而非使用连接link路径;
![](https://i-blog.csdnimg.cn/blog_migrate/2b84fc3552073638472453f3a0f21b62.png)
(2)
因为 /var/mail 是连结档,连结到 /var/spool/mail
# 所以,加上 pwd -P 的选项后,会不以连结档的数据显示,而是显示正确的完整路径啊!
【荔枝】mkdir [mp] 目录名称
-m :配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~
-p :帮助你直接将所需要的目录(包含上一级目录)递归创建起来!
![](https://i-blog.csdnimg.cn/blog_migrate/a946806d24a2bc9a6484444f53345a4c.png)
(3)
![](https://i-blog.csdnimg.cn/blog_migrate/a0e8088ce1c4b543c59489312949a3c2.png)
(4)
【荔枝】rmdir [-p] 目录名称, 删除目录
-p 连同上层的空目录一起删除;
![](https://i-blog.csdnimg.cn/blog_migrate/7f4b47d8c454b1533336c523eb116d34.png)
(5)
rmdir 仅能删除空的目录;
【7.1.3】关于执行文件路径的变量: $PATH
1)打印$PATH 变量
![](https://i-blog.csdnimg.cn/blog_migrate/3f250281fe1924434c908d5c262fe55e.png)
(6)
2)一般身份用户无法使用 ifconfig eth0;但使用 /sbin/ifconfig eth0 可以执行;
3)把 ls 移动到 /root 目录下,ls 无法执行了,因为ls文件不在 $PATH 路径下: ls是 root目录下的可执行文件;故 /root/ls 可以执行;
![](https://i-blog.csdnimg.cn/blog_migrate/28f9d0e939a41dccb92758d4156d3b75.png)
(7)
如果想要 root 目录下ls可以执行, 那就将 /root 目录加入到 PATH 中;
PATH="$PATH":/root
![](https://i-blog.csdnimg.cn/blog_migrate/44efe329c95d4274be0aeb0b11ea0ebc.png)
(8)
【总结】
不同身份使用者默认的PATH不同,默认能够随意运行的命令也不同(如root与vbird);
PATH是可以修改的,所以一般使用者还是可以透过修改PATH来运行某些位於/sbin或/usr/sbin下的命令来查询;
使用绝对路径或相对路径直接指定某个命令的档名来运行,会比搜寻PATH来的正确;
命令应该要放置到正确的目录下,运行才会比较方便;
本目录(.)最好不要放到PATH当中。
【7.2】文件与目录管理
【7.2.1】查看文件与目录: ls
![](https://i-blog.csdnimg.cn/blog_migrate/76e9f61b3ef18fe0a77a2be8dd22ebfa.png)
(9)
【荔枝1】将主文件夹下的所有文件列出来
![](https://i-blog.csdnimg.cn/blog_migrate/24458bae1f3403d51e51bfd9a1b29ecb.png)
(10)
【荔枝2】承上题,不显示颜色,但在档名末显示出该档名代表的类型(type)
![](https://i-blog.csdnimg.cn/blog_migrate/608db647892f48658fd16a5ce6bda1bf.png)
(11)
【荔枝3】完整的呈现文件的修改时间 *(modification time)
![](https://i-blog.csdnimg.cn/blog_migrate/cbac20a678d4e7524974b2f9cafa558f.png)
(12)
【7.2.2】复制,删除与移动: cp, rm , mv
【荔枝1】cp-复制文件或目录
![](https://i-blog.csdnimg.cn/blog_migrate/46a04caa555e27ecc93042dc1206f03b.png)
(13)
1)-i: 若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
![](https://i-blog.csdnimg.cn/blog_migrate/ca7f00ce47b3f80fadfda3b01e12a04d.png)
(14)
2)-a:相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用) 把文件的整个属性复制过来;
![](https://i-blog.csdnimg.cn/blog_migrate/71740aef789904172735daad99b502cd.png)
(15)
![](https://i-blog.csdnimg.cn/blog_migrate/86f548f213332c623a222b0ce4b7048c.png)
(16)
3)复制 /etc/ 目录下的所有内容到 /tmp 下面
![](https://i-blog.csdnimg.cn/blog_migrate/cf6218601424e9600e0d64e6d5f9e281.png)
(17)
4)利用cp 创建一个符号链接文件和硬链接文件
![](https://i-blog.csdnimg.cn/blog_migrate/3101767bb39662fe54f864993f35635b.png)
(18)
补充1)符号链接 == 快捷方式;
补充2)硬链接和软链接:(https://blog.csdn.net/qq_32907349/article/details/51510593)
硬链接:若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名(见 图 2.hard link 就是 file 的一个别名,他们有共同的 inode)。硬链接可由命令 link 或 ln 创建。
软连接:若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块
5)若~/.bashrc 比 /tmp/bashrc 新才复制过来;(cp -u 参数 常用于备份)
![](https://i-blog.csdnimg.cn/blog_migrate/a927c1f2756c507fea897fde95dbfdf0.png)
(19)
6)-d 若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;
![](https://i-blog.csdnimg.cn/blog_migrate/47e9b9a36bfdbafbfcaac4094bd75dd8.png)
(20)
cp复制的是源文件,而非链接文件的属性;-d参数可以复制链接文件的属性;
7)将多个文件复制到一个目录下
![](https://i-blog.csdnimg.cn/blog_migrate/535bbb6470abff37c7cdcde6f21f8202.png)
(21)
8)-a :相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用)
-a可以复制完整权限;
![](https://i-blog.csdnimg.cn/blog_migrate/c83d569c817de04a452ebeeb994f9591.png)
(22)
【cp复制指令总结】在复制时,你必须要清楚的了解到:
是否需要完整的保留来源文件的资讯?
来源文件是否为连结档 (symbolic link file)?
来源档是否为特殊的文件,例如 FIFO, socket 等?
来源档是否为目录?
【荔枝2】rm-移除文件或目录
![](https://i-blog.csdnimg.cn/blog_migrate/b776dc80d1f91ae1d4f1c54eab03d955.png)
(23)
1)-i 询问是否删除:
![](https://i-blog.csdnimg.cn/blog_migrate/662d104827dcdce424b5a2dc0fa0f289.png)
(24)
2)-r删除目录, rmdir仅能删除空目录(没有文件的目录)
![](https://i-blog.csdnimg.cn/blog_migrate/acd0f30cb3abc1baa2fea128bdfc6a46.png)
(25)
![](https://i-blog.csdnimg.cn/blog_migrate/518d4b46f0f52943fe72cd6eed65528e.png)
(26)
3)\rm 可以忽略掉 alias的指定参数;在命令前加上反斜线,可以忽略掉 alias 的指定选项喔!
![](https://i-blog.csdnimg.cn/blog_migrate/c90cc4c609e2a0f9210911c1b754827a.png)
(27)
4)删除一个带有 - 开头的文件
【荔枝3】mv-移动文件(1804022214)
![](https://i-blog.csdnimg.cn/blog_migrate/eb348cc70682b89af5e1d6f64b4c0187.png)
(28)
![](https://i-blog.csdnimg.cn/blog_migrate/0d67c767d9dd4cbb2452e7091bc1c594.png)
(29)
【荔枝】通过 rename来更改文件名
经试验,rename根本就不起任何作用;
【7.2.3】取得路径的文件名与目录名称
![](https://i-blog.csdnimg.cn/blog_migrate/a29b38c20921f21e72888cb66e4f186b.png)
(30)
![](https://i-blog.csdnimg.cn/blog_migrate/bbe60f33ad4b588c43d0878f2882aee2.png)
(31)
【7.3】文件内容查阅
1)文件内容查阅命令列表:
cat:由第一行开始显示文件内容;
tac:从最后一行开始显示,可以看出 tac 是 cat 的倒著写;
nl:显示的时候,顺道输出行号;
more:一页一页的显示文件内容;
less 与 more 类似:但是比 more 更好的是,他可以往前翻页;
head:只看头几行;
tail:只看尾巴几行;
od:以二进位的方式读取文件内容;
【7.3.1】直接查看文件内容
1)直接查阅一个文件的内容可以使用 cat/tac/nl 这几个命令啊!
![](https://i-blog.csdnimg.cn/blog_migrate/7b429ff39688a7bfc98e9db0b66058a5.png)
(32)
![](https://i-blog.csdnimg.cn/blog_migrate/9bc7ba4695780d8e5dc271b8f539b9a6.png)
(33)
【荔枝】cat -A :可列出一些特殊字符而不是空白而已;
![](https://i-blog.csdnimg.cn/blog_migrate/536afc7fd4ad67f598e943d856cb0255.png)
(34)
补充1)如果加上 -n 或 -b的话,每一行前面还会加上行号;
补充2)鸟哥很少用cat:毕竟当文件内容行数超过40行时,屏幕根本无法显示完全;
【荔枝】tac:反向显示
![](https://i-blog.csdnimg.cn/blog_migrate/1b55369da8017be52b4b4782f3beecde.png)
(35)
【荔枝】nl:添加行号打印
![](https://i-blog.csdnimg.cn/blog_migrate/613853e54d156d8fbc8b3651971d3f17.png)
(36)
![](https://i-blog.csdnimg.cn/blog_migrate/34bcaa9c3182631a0e3c25aa13037e80.png)
(37)
【7.3.2】可翻页查看
1)nl, cat, tac 都是一次性打印出文本内容;
2)翻页查看:more 或 less
3)more命令:一页一页翻动(空白键)或一行一行翻动(回车)
空白键 (space):代表向下翻一页;
Enter :代表向下翻『一行』;
/字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
:f :立刻显示出档名以及目前显示的行数;
q :代表立刻离开 more ,不再显示该文件内容。
b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
![](https://i-blog.csdnimg.cn/blog_migrate/c7e5fca9a22acea4a9f0a45a9cd6da39.png)
(38)
补充)/输入查询的字符;重复查询同一个字符串,可以直接按 n 即可;
【荔枝】less(一页一页翻动,可前向(空白键或pagedown键)也可后向翻页(pageup键))
空白键 :向下翻动一页;
[pagedown]:向下翻动一页;
[pageup] :向上翻动一页;
/字串 :向下搜寻『字串』的功能;
?字串 :向上搜寻『字串』的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
q :离开 less 这个程序;
![](https://i-blog.csdnimg.cn/blog_migrate/94b1291a84adb86f892c5bd36a7d795e.png)
(39)
【7.3.3】数据选取
1)head:取出前面几行;
选项与参数:
-n :后面接数字,代表显示几行的意思
![](https://i-blog.csdnimg.cn/blog_migrate/684e5d615eac93479d0c4ad3546240bd.png)
(40)
![](https://i-blog.csdnimg.cn/blog_migrate/7570be12f6788c1f378853b8b36c4167.png)
(41)
补充) head -n 负数:不显示后面的负数行;如 head -n -100 不显示第100行到最后的内容;
![](https://i-blog.csdnimg.cn/blog_migrate/4ce33c3879f4eb33f69d57080ec799d5.png)
(42)
2)tail:取出后面几行;
![](https://i-blog.csdnimg.cn/blog_migrate/e8c257e278eae1b5de7fe59c66546344.png)
(43)
![](https://i-blog.csdnimg.cn/blog_migrate/8545d2852feb6bfd2cbf170fa34a24a4.png)
(44)
补充)-n +正整数 文件名: 列出正整数之后的数据行;tail -n +100 /etc/man.config 列出100行以后的数据;
![](https://i-blog.csdnimg.cn/blog_migrate/c9c93d5be38a8b36b16f8a529c9a4792.png)
(45)
【补充】tail -f /var/log/messages: 持续监测 /var/log/messages 的内容;直到输入 ctrl + c 之后才会离开 tail这个命令的执行;
![](https://i-blog.csdnimg.cn/blog_migrate/94f3becfd4e047cda3f4ac4f86cfd602.png)
(46)
- 补充1)当下达『tail -n +100 /etc/man.config』 代表该文件从100行以后都会被列出来,同样的,在man.config共有141行,因此第100~141行就会被列出来啦! 前面的99行都不会被显示出来喔!
- 补充2) 至於范例二中,由於/var/log/messages随时会有数据写入,你想要让该文件有数据写入时就立刻显示到萤幕上, 就利用 -f 这个选项,他可以一直侦测/var/log/messages这个文件,新加入的数据都会被显示到萤幕上。 直到你按下[crtl]-c才会离开tail的侦测喔!
假如我想要显示 /etc/man.config 的第 11 到第 20 行呢?
答:这个应该不算难,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以结果就是:『 head -n 20 /etc/man.config | tail -n 10 』,这样就可以得到第 11 到第 20 行之间的内容了! 但是里面涉及到管线命令,需要在第三篇的时候才讲的到!
![](https://i-blog.csdnimg.cn/blog_migrate/6b675df621018a700a1ed44d09ad865f.png)
(47)
【7.3.4】纯文本文件:od 查看二进制文件
![](https://i-blog.csdnimg.cn/blog_migrate/aff8b3468d6fd76697f2484e939bd999.png)
(48)
荔枝1)将/usr/bin/passwd的内容使用ASCII方式来展现!
![](https://i-blog.csdnimg.cn/blog_migrate/b155f295e6d54f5a37d53a364290ebc4.png)
(49)
荔枝2)将/etc/issue这个文件的内容以8进位列出储存值与ASCII的对照表
![](https://i-blog.csdnimg.cn/blog_migrate/964464577b1cdd929c7fee31cd1d805c.png)
(50)
【7.3.5】修改文件时间或创建新文件:touch
1)每个文件在linux底下都会记录许多的时间参数, 其实是有三个主要的变动时间,那么三个时间的意义是什么呢?
- modification time (mtime):当该文件的『内容数据』变更时,就会升级这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!
- status time (ctime):当该文件的『状态 (status)』改变时,就会升级这个时间,举例来说,像是权限与属性被更改了,都会升级这个时间啊。
- access time (atime):当『该文件的内容被取用』时,就会升级这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会升级该文件的 atime 了。
![](https://i-blog.csdnimg.cn/blog_migrate/ec7e8e0b9ef0710bd27fff0b79f770e5.png)
(51)
【荔枝】touch参数列表
![](https://i-blog.csdnimg.cn/blog_migrate/fded65c0c7da466cba4f4e250102eb3b.png)
(52)
选项与参数:
- -a :仅修订 access time;
- -c :仅修改文件的时间,若该文件不存在则不创建新文件;
- -d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
- -m :仅修改 mtime ;
- -t :后面可以接欲修订的时间而不用目前的时间,格式为[YYMMDDhhmm]
![](https://i-blog.csdnimg.cn/blog_migrate/828ec5c08207a9e0c034aca71882831e.png)
(53)
荔枝2)将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期
![](https://i-blog.csdnimg.cn/blog_migrate/50b3e28fa88025659a97d7ed27d2396f.png)
(54)
补充1)ll == ls -l ;其中 ll 是 ls -l 的命令别名;
补充2)分号; : 代表连续命令的下达啦!你可以在一行命令当中写入多重命令, 这些命令可以『依序』运行。
补充3)至於运行的结果当中,我们可以发现数据的内容与属性是被复制过来的,因此文件内容时间(mtime)与原本文件相同。 但是由於这个文件是刚刚被创建的,因此状态(ctime)与读取时间就便呈现在的时间啦! 那如果你想要变更这个文件的时间呢?可以这样做:
【荔枝】修改文件的时间;
![](https://i-blog.csdnimg.cn/blog_migrate/19862576bb5857f364d966be207f4934.png)
(55)
补充)atime mtime 改变了, 但ctime没有改变;
【荔枝2】将bashrc的日期改为 2017/09/15 0202 如下:
![](https://i-blog.csdnimg.cn/blog_migrate/e8e61728513c4f55fa1aae1d0076efca.png)
(56)
补充)日期在 atime 与 mtime 都改变了,但是 ctime 则是记录目前的时间!
【总结1】touch命令总结:
透过 touch 这个命令,我们可以轻易的修订文件的日期与时间。并且也可以创建一个空的文件喔! 不过,要注意的是,即使我们复制一个文件时,复制所有的属性,但也没有办法复制 ctime 这个属性的。 ctime 可以记录这个文件最近的状态 (status)(即属性和权限) 被改变的时间。无论如何,还是要告知大家, 我们平时看的文件属性中,比较重要的还是属於那个 mtime 啊!我们关心的常常是这个文件的『内容』 是什么时候被更动的说~了乎?
【总结2】touch 这个命令最常被使用的情况是:
创建一个空的文件;
将某个文件日期修订为目前 (mtime 与 atime)
【7.4】文件与目录的默认权限与隐藏权限
1)配置文件的隐藏属性:除了基本r, w, x权限外,在Linux的Ext2/Ext3文件系统下,我们还可以配置其他的系统隐藏属性, 这部份可使用 chattr 来配置,而以 lsattr 来查看,最重要的属性就是可以配置其不可修改的特性!
例题1)root 虽然可以将这个文件复制给 dmtsai,不过这个文件在 dmtsai 的家目录中却可能让 dmtsai 没有办法读写(因为该文件属於 root 的嘛!而 dmtsai 又不能使用 chown 之故)。 此外,我们又担心覆盖掉 dmtsai 自己的 .bashrc 配置档,因此,我们可以进行如下的动作喔:
复制文件: cp ~/.bashrc ~dmtsai/bashrc
修改属性: chown dmtsai:users ~dmtsai/bashrc
例题2)因为除了 dmtsai 之外,其他人不能修改该目录下的文件,所以整个目录的权限应该是 drwxr-xr-x 才对! 因此你应该这样做:
创建目录: mkdir /tmp/chapter7_1
修改属性: chown -R dmtsai:users /tmp/chapter7_1
修改权限: chmod -R 755 /tmp/chapter7_1
【7.4.1】文件默认权限:umask
1)umask 就是:指定 『目前使用者在创建文件或目录时候的权限默认值』, 那么如何得知或配置 umask 呢?他的指定条件以底下的方式来指定:
2)umask表示的是:该默认值需要减掉的权限;(干货——umask)
![](https://i-blog.csdnimg.cn/blog_migrate/43bb72863c9bfb1884235868b33551f8.png)
(57)
-S == Symbolic(符号的)
补充1)怎么 umask 会有四组数字啊?不是只有三组吗?是没错啦。第一组是特殊权限用的,我们先不要理他,所以先看后面三组即可。
补充2)默认的情况如下:
若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下: -rw-rw-rw-;又由于需要减去的权限umask=0022 == 022 == ----w--w- ,所以新建文件最后得到的权限是 -rw-r--r-- ;如上例所示;
若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下:drwxrwxrwx;又由于需要减去的权限umask=0022 == 022 == ----w--w- ,所以新建文件最后得到的权限是 drwxr-xr-x ;如上例所示;
总结如下)
创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
3)如何设置umask?直接在 umask 后面输入 002 就好了!
![](https://i-blog.csdnimg.cn/blog_migrate/7e144aca3148556283a9edebbdf081a4.png)
(58)
例题)假设你的 umask 为 003 ,请问该 umask 情况下,创建的文件与目录权限为?
答:
umask 为 003 ,所以拿掉的权限为 --------wx,因此:
文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目录: (drwxrwxrwx) - (--------wx) = drwxrwxr--
umask总结)在默认的情况中, root 的 umask 会拿掉比较多的属性,root 的 umask 默认是 022 , 这是基於安全的考量啦~至於一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力!
【7.4.2】文件隐藏属性 chattr lsattr
1)不过要先强调的是:底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了。
2)底下我们就来谈一谈如何配置与检查这些隐藏的属性吧!
![](https://i-blog.csdnimg.cn/blog_migrate/55db5dd2c181c847b8b92d3b44c3c172.png)
(59)
补充)注意:属性配置常见的是 a 与 i 的配置值,而且很多配置值必须要身为 root 才能配置;
a :当配置 a 之后,这个文件将只能添加数据,而不能删除也不能修改数据,只有root
才能配置这个属性。
i :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、配置连结也无法
写入或新增数据!』对於系统安全性有相当大的助益!只有 root 能配置此属性;
![](https://i-blog.csdnimg.cn/blog_migrate/a7ee92336e809a9987ac171fd1d0b8d0.png)
(60)
3)lsattr (显示文件隐藏属性)
(61)
(62)
【7.4.3】文件特殊权限:SUID, SGID, SBIT
【荔枝】看看 那个 /usr/bin/passwd 的隐藏权限, 如下:
怎么会是 -rwsr-xr-x; s 表示什么?
1)Set UID == SUID(针对文件的权限)
当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。 1.1)那么SUID的权限对於一个文件的特殊功能是什么呢?基本上SUID有这样的限制与功能:
● SUID 权限仅对二进位程序(binary program)有效;
● 运行者对於该程序需要具有 x 的可运行权限;
● 本权限仅在运行该程序的过程中有效 (run-time);
● 运行者将具有该程序拥有者 (owner) 的权限。
1.2)SUID荔枝(非常重要的荔枝):我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:『-r-------- 1 root root』,意思是这个文件仅有root可读且仅有root可以强制写入而已。 既然这个文件仅有 root 可以修改,那么鸟哥的 vbird 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入『passwd』这个命令来看看,嘿嘿!一般使用者当然可以修改自己的密码了!
1.3)藉由上述的功能说明,我们可以知道:
● vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd;
● passwd 的拥有者是 root 这个帐号;
● vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限;
● /etc/shadow 就可以被 vbird 所运行的 passwd 所修改。
【注意】SUID 仅可用在binary program 上, 不能够用在 shell script 上面!SUID权限对于目录也是无效的;
2.0)当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 罗!是这样没错!^_^。 举例来说,你可以用底下的命令来观察到具有 SGID 权限的文件喔:
(64)
2.1)如果是对文件来说, SGID 有如下的功能:
● SGID 对二进位程序有用;
● 程序运行者对於该程序来说,需具备 x 的权限;
● 运行者在运行的过程中将会获得该程序群组的支持!
【荔枝】举例来说,你可以用底下的命令来观察到具有 SGID 权限的文件喔:
(65)
2.2)当一个目录配置了 SGID 的权限后,他将具有如下的功能:
● 使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
● 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
● 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。
3)Sticky Bit: 这个 Sticky Bit, SBIT 目前只针对目录有效,对於文件已经没有效果了。 SBIT 对於目录的作用是:
● 当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
● 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件;
4)换句话说:当甲这个使用者於 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示『甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。』 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。
【荔枝】举例来说,我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。这个特性也是挺重要的啊!你可以这样做个简单的测试:
● 以 root 登陆系统,并且进入 /tmp 当中;
● touch test,并且更改 test 权限成为 777 ;
● 以一般使用者登陆,并进入 /tmp;
● 尝试删除 test 这个文件!
5)SUID/SGID/SBIT 权限配置:如何配置文件使成为具有 SUID 与 SGID 的权限呢?
那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!
4 为 SUID
2 为 SGID
1 为 SBIT
【荔枝】 假设要将一个文件权限改为『-rwsr-xr-x』时,由於 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来配置!此外,还有大 S 与大 T 的产生喔!参考底下的范例啦!
注意:你必须了解 SUID 不是用在目录上,而 SBIT 不是用在文件上的喔!
【荔枝】SUID SGID权限操作
(66)
补充1)chmod 7666 test; ls -l test : user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是『空的』啦!怎么说? SUID 是表示『该文件在运行的时候,具有文件拥有者的权限』,但是文件 拥有者都无法运行了,哪里来的权限给其他人使用?当然就是空的啦! ^_^
补充2)s 和 t 权限 是基于 x 权限的;如果文件的 user, group 或 others 没有x权限,则其对应的s和t权限是空的,即大S 或 大T;
6)以透过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 罗!来看看如下的范例:
(67)
(68)
【7.4.4】查看文件类型:file
1)如果你想要知道某个文件的基本数据,例如是属於 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的资讯,就可以利用 file 这个命令来检阅喔!
(69)
【7.5】命令与文件的查询
【7.5.1】脚本文件名的查询
1)命令的完整文件名放置在哪里? 通过 which 或 type来查找;
2)which:寻找执行文件;
(70)
【荔枝】如下:
(71)
补充1)which命令是根据『PATH』这个环境变量所规范的路径,去搜寻『运行档』的档名~ 所以,重点是找出『运行档』而已!且 which 后面接的是『完整档名』喔!若加上 -a 选项,则可以列出所有的可以找到的同名运行档,而非仅显示第一个而已!
补充2)怎么 cd 这个常用的命令竟然找不到啊!为什么呢? 这是因为 cd 是『bash 内建的命令』啦! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的啊!那怎办?没关系!我们可以透过 type 这个命令喔!
【7.5.2】文件名的查找
1)通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦!
2)文件名查找命令列表:
- whereis:搜索速度快,利用数据库来搜寻数据;
- locate:搜索速度快,利用数据库来搜寻数据;
- find:搜索速度慢,直接搜索硬盘;
(72)
【荔枝】如下:
(73)
(74)
补充) 因为 Linux 系统会将系统内的所有文件都记录在一个数据库文件里面, 而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库文件的内容为准, 因此,有的时后你还会发现使用这两个运行档时,会找到已经被杀掉的文件! 而且也找不到最新的刚刚创建的文件呢!这就是因为这两个命令是由数据库当中的结果去搜寻文件的所在啊! 数据库中的文件记录 与 实际磁盘的文件记录信息不一致。
2.2)locate(搜索速度快,利用数据库来搜寻数据)
(75)
● (76)
● 补充1)因为 locate 寻找的数据是由『已创建的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速罗!
● 补充2)那么有什么限制呢? 就是因为他是经由数据库来搜寻的,而数据库的创建默认是在每天运行一次 (每个 distribution 都不同,CentOS 5.x 是每天升级数据库一次!),所以当你新创建起来的文件, 却还在数据库升级之前搜寻该文件,那么 locate 会告诉你『找不到!』呵呵!因为必须要升级数据库呀!
● 补充3)那能否手动升级数据库哪? 升级 locate 数据库的方法非常简单,直接输入『 updatedb 』就可以了!
● 补充4)updatedb:根据 /etc/updatedb.conf 的配置去搜寻系统硬盘内的档名,并升级 /var/lib/mlocate 内的数据库文件;
● 补充5)locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字档名。
2.3)find(搜索速度慢,直接搜索硬盘)
(77)
荔枝1)将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出:
(78)
荔枝2)寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出:
(79)
【补充】find 相关的时间参数意义:
+4代表大於等於5天前的档名:ex> find /var -mtime +4
-4代表小於等於4天内的文件档名:ex> find /var -mtime -4
4则是代表4-5那一天的文件档名:ex> find /var -mtime 4
2.3.1)find的其他用法:
(81)
(82)
荔枝1)搜寻 /home 底下属於 pacoson 的文件:
(83)
荔枝2)搜寻系统中不属於任何人的文件:
(84)
2.3.2)find的其他用法2:
荔枝1)找出档名为 passwd 这个文件
(86)
荔枝2)找出 /var 目录下,文件类型为 Socket 的档名有哪些?
(87)
荔枝3)搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性;
(88)
荔枝4)我想要找出来 /bin, /sbin 这两个目录下, 只要具有 SUID 或 SGID 就列出来该文件,你可以这样做:
(89)
补充)因为 SUID 是 4 分,SGID 2 分,总共为 6 分,因此可用 +6000 来处理这个权限! 至於 find 后面可以接多个目录来进行搜寻!
2.3.3)find的其他用法3:
(90)
(91)
荔枝1)将上个范例找到的文件使用 ls -l 列出来~
(92)
荔枝2)找出系统中,大於 1MB 的文件
(93)
补充1)find 的特殊功能就是能够进行额外的动作(action):图解如下:
(94)
补充2)该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键字,这些东西的意义为:
● {} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
● -exec 一直到 \; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 命令内的额外动作。 在本例中就是『 ls -l {} 』罗!
● 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。
补充3)如果你要找的文件是具有特殊属性的,例如 SUID 、文件拥有者、文件大小等等, 那么利用 locate 是没有办法达成你的搜寻的!此时 find 就显的很重要啦! 另外,find 还可以利用通配符来找文件名呢!
荔枝)举例来说,你想要找出 /etc 底下档名包含 httpd 的文件, 那么你就可以这样做:
(95)
【7.6】权限与命令间的关系(非常重要)(1804040012)
说明一下什么命令在什么样的权限下才能够运行吧!^_^一、让使用者能进入某目录成为『可工作目录』的基本权限为何:
● 可使用的命令:例如 cd 等变换工作目录的命令;
● 目录所需权限:使用者对这个目录至少需要具有 x 的权限;
● 额外需求:如果使用者想要在这个目录内利用 ls 查阅档名,则使用者对此目录还需要 r 的权限。
二、使用者在某个目录内读取一个文件的基本权限为何?
● 可使用的命令:例如本章谈到的 cat, more, less等等;
● 目录所需权限:使用者对这个目录至少需要具有 x 权限;
● 文件所需权限:使用者对文件至少需要具有 r 的权限才行!
三、让使用者可以修改一个文件的基本权限为何?
● 可使用的命令:例如 nano 或未来要介绍的 vi 编辑器等;
● 目录所需权限:使用者在该文件所在的目录至少要有 x 权限;
● 文件所需权限:使用者对该文件至少要有 r, w 权限。
四、让一个使用者可以创建一个文件的基本权限为何?
● 目录所需权限:使用者在该目录要具有 w,x 的权限,重点在 w 啦!
五、让使用者进入某目录并运行该目录下的某个命令之基本权限为何?
● 目录所需权限:使用者在该目录至少要有 x 的权限;
● 文件所需权限:使用者在该文件至少需要有 x 的权限。
例题)让一个使用者 pacoson 能够进行『cp /dir1/file1 /dir2』的命令时,请说明 dir1, file1, dir2 的最小所需权限为何?
答:
运行 cp 时, pacoson 要『能够读取来源档,并且写入目标档!』 因此各文件/目录的最小权限应该是:
dir1 :至少需要有 x 权限;
file1:至少需要有 r 权限;
dir2 :至少需要有 w, x 权限。
【7.7】linux文件与目录管理重点回顾
● 绝对路径:『一定由根目录 / 写起』;相对路径:『不是由 / 写起』
● 特殊目录有:., .., -, ~, ~account需要注意;
● 与目录相关的命令有:cd, mkdir, rmdir, pwd 等重要命令;
● rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』命令;
● 使用者能使用的命令是依据 PATH 变量所规定的目录去搜寻的;
● 不同的身份(root 与一般用户)系统默认的 PATH 并不相同。差异较大的地方在於 /sbin, /usr/sbin ;
● ls 可以检视文件的属性,尤其 -d, -a, -l 等选项特别重要!
● 文件的复制、删除、移动可以分别使用:cp, rm , mv等命令来操作;
● 检查文件的内容(读档)可使用的命令包括有:cat, tac, nl, more, less, head, tail, od 等
● cat -n 与 nl 均可显示行号,但默认的情况下,空白行会不会编号并不相同;
● touch 的目的在修改文件的时间参数,但亦可用来创建空文件;
● 一个文件记录的时间参数有三种,分别是 access time(atime), status time (ctime), modification time(mtime),ls 默认显示的是 mtime。
● 除了传统的rwx权限之外,在Ext2/Ext3文件系统中,还可以使用chattr与lsattr配置及观察隐藏属性。 常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性。
● 新建文件/目录时,新文件的默认权限使用 umask 来规范。默认目录完全权限为drwxrwxrwx, 文件则为-rw-rw-rw-。
● 文件具有SUID的特殊权限时,代表当使用者运行此一binary程序时,在运行过程中使用者会暂时具有程序拥有者的权限
● 目录具有SGID的特殊权限时,代表使用者在这个目录底下新建的文件之群组都会与该目录的群组名称相同。
● 目录具有SBIT的特殊权限时,代表在该目录下使用者创建的文件只有自己与root能够删除!
● 观察文件的类型可以使用 file 命令来观察;
● 搜寻命令的完整档名可用 which 或 type ,这两个命令都是透过 PATH 变量来搜寻档名;
● 搜寻文件的完整档名可以使用 whereis 或 locate 到数据库文件去搜寻,而不实际搜寻文件系统;
● 利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的档名。