第七章总结
Linux文件与目录管理包括:在不同的目录间切换、创建与删除目录、创建与删除文件,还有查找文件、查看文件内容等。
相对路径与绝对路径
绝对路径:路径的写法一定由根目录/写起,如/usr/share/doc这个目录
相对路径:路径的写法不是由/写起,如../man。相对路径意指相对于当前工作目录的路径。
相对路径的用途:方便切换路径等。
绝对路径的用途:对于文件名的正确性来说,绝对路径的正确度要比较好。建议:如果写程序(shell scripts)来管理系统的条件下,务必使用绝对路径的写法。因为绝对路径的写法比较麻烦,但是可以肯定这个写法绝对不会有问题。如果使用相对路径在程序当中,则可能由于你执行的工作环境不同,导致一些问题的发生。
目录的相关操作
特殊目录:
² .:代表此层目录
² ..:代表上一层目录
² -:代表前一个工作目录
² ~:代表“目前用户身份”所在的主文件夹
² ~account:代表account这个用户的主文件夹(account是个账户名称)
需要特别注意的是在所有目录下面都会存在的两个目录,分别是“.”与“..”,分别代表此层与上层目录的意思。
根目录中的上一层目录与根目录自己是同一个目录。
常见的处理目录的命令:
² cd:切换目录
cd [相对路径或绝对路径]
cd ~yzhang 切换到yzhang用户的主文件夹下
cd ~ 切换回自己的主文件夹下
cd .. 切换到目录的上层目录
cd – 回到刚才的那个目录
cd /var/spool/mail 切换到指定的完整路径中
cd是用来切换工作目录的命令。注意:目录名称和cd命令之间存在一个空格。一旦登录Linux系统后,root会在root的主文件夹中。那回到上一层目录可以用cd ..。利用相对路径的写法必须要确认你目前的路径才能正确去到想去的目录。cd ~ 可以回到个人的主文件夹里去。cd –回到刚才的那个目录。
注意:Linux的默认命令行模式(bash shell)具有文件补齐功能,要经常利用[Tab]按键来快速完整地输入目录。
² pwd:显示当前目录
pwd [-p]
参数:
-p 显示出当前的路径,而非使用链接(link)路径。
-p参数,可以让我们取得正确的目录名称,而不是链接文件的路径来显示的。
² mkdir:新建一个新的目录
mkdir [-mp] 目录名称
参数:
-m:配置文件案的权限。直接设置,不需要看默认权限(umask)
-p:帮助你直接将所需要的目录(包含上层目录)递归创建起来。
mkdir –m 711 test2 新建权限为rwx—x—x的目录。
-p参数不建议使用:原因是如果打错字,则目录名称就会变得乱七八糟的。
² rmdir:删除一个空的目录
rmdir [-p] 目录名称
参数:-p连同上层“空的“目录也一起删除。
注意:rmdir仅能删除空的目录。如果删除旧的目录时,被删除的目录里面必定不能存在其他的目录或文件。即空目录的意思。如果将所有目录下的东西都删掉,这个时候就必须使用rm –r test删除。
执行文件的路径的变量:$PATH
当我们在任何目录下输入ls就一定可以显示出一些信息而不会说找不到该/bin/ls命令,原因是环境变量PATH的帮助。
显示当前PATH路径:echo $PATH。root用户的PATH包含sbin,但普通用户的PATH包含bin
PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开,每个目录是有顺序之分的。无论是root还是普通用户都有/bin,这个目录在PATH变量内,所以当然就能够在任何地方执行ls来找到/bin/ls执行文件。
在PATH后面添加文件夹方法:PATH=“$PATH”:/root
为了安全起见,不建议将“.”,加入PATH的查询目录中。
² 不同身份用户默认的PATH不同,默认能够随意执行的命令也不同(如root与vbird);
² PATH是可以修改的,所以一般用户还是可以通过修改PATH来执行某些位于/sbin或/usr/sbin下的命令查询
² 使用绝对路径或相对路径直接指定某个命令的文件名来执行,会比查询PATH来得正确
² 命令应该要放置到正确的目录下,执行才会比较方便
² 本目录(.)最好不要放到PATH当中。
文件与目录管理
在文件与目录的管理上,不外乎“显示属性”,“复制”,“删除文件”及“移动文件或目录”等,由于文件与目录的管理在Linux当中很重要,尤其是每个人自己主文件夹的数据都需要注意管理。
查看文件与目录:
ls[-aAdfFhilnrRst] 目录名称
ls[--color={never,auto,always}] 目录名称
ls[--full-time] 目录名称
参数:
² -a:全部文件,连同隐藏文件(开头为 . 的文件)一起列出来(常用)
² -A:列出全部的文件(连同隐藏文件,但不包括 . 与 .. 这两个目录)
² -d:仅列出目录本身,而不是列出目录内的文件数据(常用)
² -f:直接列出结果,而不进行排序(ls默认会以文件名排序)
² -F:根据文件、目录等信息给予附加数据结构,如:*:代表可执行文件;/:代表目录;=:代表socket文件;|:代表FIFO文件
² -h:将文件容量以人类较易读的方式(如GB,KB等)列出来
² -i:列出inode号码
² -l:列出长数据串,包含文件的属性与权限等数据(常用)
² -n:列出UID与GID,而非用户与用户组的名称(UID与GID会在账号管理提到)
² -r:将排序结果反向输出,如:原本文件名由小到大,反向则为由大到小
² -R:连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来
² -S:以文件容量大小排序,而不是用文件名
² -t:依时间排序,而不是用文件名
² --color=never:不要依据文件特性给予颜色显示
² --color=always:显示颜色
² --color=auto:让系统自行依据设置来判断是否给予颜色
² --full-time:以完整时间模式(包含年、月、日、时、分)输出
² --time={atime,ctime}:输出访问时间(atime)或改变权限属性时间(ctime)而非内容更改时间(modification time)
当执行ls时,默认显示的只有非隐藏文件的文件名、以文件名进行排序及文件名代表的颜色显示。
ls –al ~ 将主文件夹下的所有文件列出来(含属性与隐藏文件)
ls –alF –color=never ~ 不显示颜色,但在文件名未显示出该文件名代表的类型(type)
ls –al –full-time ~ 完整呈现文件的修改时间
ls最常被用到的功能是-l参数,默认情况下,ll设置成为ls –l的意思。其实那个功能是bashshell的alias功能。即直接输入ll就等于输入ls –l。
复制、删除与移动:cp,rm,mv
复制文件,使用cp命令。不过cp这个命令的用途较多。除了单纯的复制之外,还可以创建连接文件(快捷方式),对比两文件的新旧而予以更新,以及复制整个目录等的功能。至于移动目录与文件,使用mv,这个命令也可以直接拿来作重命名的操作。至于删除,就是rm这个命令。
cp(复制文件或目录)
cp[-adfilprsu] 源文件(source)目标文件(destination)
cp[options] source1 source2 source3 … directory
参数:
² -a:相当于-pdr的意思
² -d:若源文件文连接文件的属性,则复制链接文件属性而非文件本身
² -f:为强制的意思,若目标文件已经存在且无法启动,则删除后再尝试一次;
² -i:若目标文件已经存在时,在覆盖时会先询问操作的进行(常用)
² -l:进行硬链接的连接文件创建,而非复制文件本身
² -p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);
² -r:递归持续复制,用于目录的复制行为(常用)
² -s:复制成为符号链接文件,即快捷方式文件
² -u:若destination比source旧才更新destination。
最后需要之一的是,如果源文件有两个以上,则最后一个目的文件一定要是目录才行。
复制(cp)这个命令非常重要,不同身份者执行这个命令会有不同的结果产生,尤其是那个-a、-p的参数,对于不同的身份来说,区别非常大。
下面以root账户执行
cp ~/.bashrc /tmp/bashrc .bashrc复制到/tmp下,并更名为bashrc
cp –I ~/.bashrc /tmp/bashrc 重复覆盖前会询问是否确定,-i用于交互。
切换/tmp,并将/var/log/wtmp复制到/tmp且查看属性:
cd /tmp 切换路径
cp /var/log/wtmp . 扶着文件到当前路径下
ls –l /var/log/wtmp wtmp 查看
cp –a /var/log/wtmp wtmp_2 复制,使整个数据特性完全一模一样
ls –l /var/log/wtmp wtmp_2
默认条件中,cp的源文件与目的文件的权限是不同的,目的文件的所有者通常会是命令操作者本身。因此,当我们进行备份的时候,某些需要特别注意的特殊权限文件,不能直接cp,必须加上-a或者-p等可以完整复制文件权限的参数才行。此外,如果想要复制文件给其他的用户,也必须注意到文件的权限(包含读、写、执行以及文件所有者等),否则,其他人无法针对给予的文件进行修订的操作。
cp–r /etc/ /tmp 注意:-r参数可以复制目录,但是文件与目录的权限可能会被改变。可以利用如下命令实现:cp –a /etc/ /tmp
复制链接文件的实现
cp–s bashrc bashrc_slink
cp –lbashrc bashrc_hlink
使用-l和-s都会创建所谓的连接文件,但是这两种连接文件却有不一样的情况。-l是硬链接,而-s是软链接。软链接是一种快捷方式。而硬链接与源文件的属性和权限完全一模一样。
cp –u ~/.bashrc /tmp/bashrc –u这个参数是在目标文件与源文件存在差异时才会复制。常用于备份中。
cp bashrc_slink bashrc_slink_1
cp –d bashrc_slink bashrc_slink_2
没有任何参数时,cp复制的是源文件,而非文件的属性。若要复制链接文件的属性,就要使用-d参数。
cp ~/.bashrc ~/.bash_history /tmp 同时将多个数据一次复制到同一个目录去,最后一个是目的目录。
cp命令总结
² cp有种种的文件属性与权限的特性,所以在复制时,必须要清楚了解到:
² 是否需要完整保留来源文件的信息?
² 源文件是否为软链接文件?
² 源文件是否为特殊的文件,如FIFO,socket等?
² 源文件是否为目录?
rm(移除文件或目录)
rm [fir]文件或目录
参数:
² -f 就是force的意思,忽略不存在的文件,不会出现警告信息;
² -I 互动模式,在删除前会询问用户是否操作;
² -r:递归删除。最常用在目录的删除。非常危险的参数。
rm –I bashrc 删除文件,并主动询问,避免删除错误文件。
rm –r /tmp/etc 删除目录
\rn –r /tmp/etc 命令前加上反斜杠,可以忽略alias指定的参数。
rm./-aaa 因为文件中含有-参数,所以删除时注意加当前路径,免得系统误判。
删除命令在使用前,为了怕误删,最好使用-i参数,删除目录时,使用-r参数,不过,使用“rm –r”这个命令之前,请千万注意,因为该目录或文件肯定会被root删除,系统不会再次询问是否要删除,所以是个超级严重的命令执行,需特别注意。不过,若确定目录不要了,则使用rm –r来循环删除即可。
为了避免首字符为-的文件删除,最好使用本目录./。或者使用rm ---aaa-也可以。
mv(移动文件与目录,或更名)
mv[-fiu] source destination
mv [options]source1 source2 source3 … directory
参数:
-f 就是force的意思,如果目标文件已经存在,不会询问而直接覆盖
-I 若目标文件已经存在时,就会询问是否覆盖
-u 若目标文件已经存在,且source比较新,才会更新
mv bashrc mytest 将某个文件移动到某个目录中去
mv mvtest mvtest2 将目录进行重命名
Linux中rename命令专门进行多个文件名的同时重命名,并非针对单一文件名的更改,与mv不同。
mv bashrc1 bashrc2 mytest2 将多个源文件或目录移动到最后一个目录中。
移动命令,在要移动文件或目录时,很重要。可以使用-u来测试新旧文件,看是否需要移动。另一个用户是“更改文件名”,可以轻易地使用mv来更改一个文件的文件名。不过,Linux已有命令当中,rename可以用来更改大量文件的文件名。
取得路径的文件名与目录名称
目录是通过斜线(/)来分辨。取得文件名或者是目录名称,一般的用户应该是写程序的时候用来判断使用。
basename/etc/sysconfig/network 取得最后的文件名
dirname/etc/sysconfig/network 取得目录名
文件内容查阅
最常使用的显示文件内容的命令是cat,与其相关命令如下:
² cat:由第一行开始显示文件内容
² tac:从最后一行开始显示,可以看出tac是cat的倒写形式
² nl:显示的时候,顺便输出行号
² more:一页一页地显示文件内容
² less:与more类似,但是比more更好,它可以往前翻页
² head:只看头几行
² tail:只看结尾几行
² od:以二进制的方式读取文件内容
直接查看文件内容
直接查看文件的内容可以使用cat tac nl命令。
cat命令
cat [-AbEnTv]
参数说明:
² -A:相当于-vET的整合参数,可列出一些特殊字符,而不是空白而已
² -b:列出行号,仅针对非空白行做行号显示,空白行不标行号
² -E:将结尾的断行字符$显示出来
² -n:打印出行号,连同空白行也会有行号,与-b的参数不同
² -T:将[Tab]按键以^I显示出来
² -v:列出一些看不出来的特殊字符
cat /etc/issue
cat –n /etc/issue
cat –A /etc/xinetd.conf
cat命令主要功能是将一个文件的内容连续显示在屏幕上,加上-n和-b选项后,每一行前面会有行号
tac(反向列示)
tac /etc/issue
tac刚好是将cat反写过来,它的功能跟cat相反,cat是由第一行到最后一行连续显示在屏幕上,而tac则是由最后一行到第一行反向在屏幕上显示出来。
nl(添加行号打印)
nl [-bnw] 文件
参数:
² -b:指定行号指定的方式,主要有两种:
n -b a:表示不论是否为空行,也同样列出行号(类似cat –n)
n -b t:如果有空行,空的那行不列出行号(默认值)
² -n:列出行号表示的方法,主要有三种:
n -n ln:行号在屏幕的最左方显示
n -n rn:行号在自己字段的最右方显示,且不加0
n -n rz:行号在自己字段的最右方显示,且加0
² -w:行号字段占用的位数
nl /etc/issue
nl –b a /etc/issue
nl –b a –n rz /etc/issue
nl –b a –n rz –w 3 /etc/issue
nl可以将输出的文件内容自动加上行号!其默认的结果与cat –n有点不太一样,nl可以将行号作比较多的显示设计,包括位数与是否自动补0等的功能。
可翻页查看
nl与cat,tac等等,都是一次性将数据一口气显示到屏幕上,没有可以进行一页一页翻动的命令。而一页一页查看主要涉及的命令为more和less。
more(一页一页翻动)
more /etc/man.config
此命令最后一行显示出目前的百分比,而且还可以在最后一行输入一些有用的命令。more这个程序运行过程中,有几个按键可以使用:
² 空格键(space):代表向下翻一页
² Enter:代表向下滚动一行
² /字符串:代表在这个显示的内容当中,向下查询“字符串”这个关键字;
² :f:立刻显示出文件名以及目前显示的行数
² q:代表立刻离开more,不再显示该文件内容
² b或ctrl + b:代表往回翻页,不过这操作只对文件有用,对管无用。
搜索字符串的功能,可以在查看时,输入/之后,输入要查询的内容,然后按下Enter键即可。若要重复查询同一个字符串,可以直接按下n即可。最后退出,按q即可离开more。
less(一页一页翻动)
less /etc/man.config
less命令比more命令更加有弹性,原因:more没办法向前翻页,只能向后翻页。而less可可以使用上、下等键的功能来往前往后翻看文件。此外,less可以有更多的查询功能。可以配合使用的按键如下:
² 空格键:向下翻动一页
² [PageDown]:向下翻动一页
² [PageUp]:向上翻动一页
² /字符串:向下查询字符串的功能
² ?字符串:向上查询字符串的功能
² n:重复前一个查询(与/或?有关)
² N:反向重复前一个查询(与/或?有关)
² q:离开less这个程序
man命令就是调用less显示说明文件的内容的。
数据选取
可以将输出的数据做一个最简单的选取,取出前面(head)与取出后面(tail)文字的功能。注意:head和tail都是以行为单位进行数据选取的。
head命令(取出前面几行)
head [-n number] 文件
参数:
² -n:后面接数字,代表显示几行的意思
head /etc/man.config:默认显示前10行
head –n 20 /etc/man.config:显示前20行
head –n -100 /etc/man.config:后面100行不打印,只打印前面几行
head命令,若没有加上-n参数,则默认只显示十行,若要只显示一行,则使用head –n 1 filename即可。此外,若-n参数跟负数,则表示不显示后多少行。
tail命令(取出后面几行)
tail [-n number] 文件
参数:
² -n:后面接数字,代表显示最后几行的意思
² -f:表示持续检测后面所接的文件名,要等到按下Ctrl + C才会结束tail的检测。
tail /etc/man.conf:默认显示最后10行
tail –n 20 /etc/man.conf:显示该文件的最后20行
tail –n +100 /etc/man.conf:列出100行之后的所有数据
tail –f /var/log/message:持续检测文件的内容,按Ctrl+ C之后才能离开tail这个命令检测。
tail名令与head用法差不多类似,只是显示的是最后几行。默认显示10行,非10行,则需加-n number参数。
如果想要让该文件有数据写入时就立刻显示到屏幕上,就利用-f参数即可。
如果显示/etc/man.conf的第11行到第20行内容,使用如下命令:
head–n 20 /etc/man.conf | tail –n 10
非纯文本文件:od
由于执行文件通常是二进制文件,使用上面的命令来读取它的内容,会产生乱码数据。可以使用od命令来读取。
od [-t TYPR] 文件
参数:
² -t:后面可以接各种“类型(TYPE)”的输出,如
n a:利用默认的字符来输出
n c:使用ASCII字符来输出
n d[size]:利用十进制来输出数据,每个整数占用size bytes
n f[size]:利用浮点数来输出数据,每个数占用size bytes
n o[size]:利用八进制来输出数据,每个整数占用size bytes
n x[size]:利用十六进制来输出数据,每个整数占用size bytes
od –t c /usr/bin/passwd:使用ASCII方式输出文件内容
od –t oCc /etc/issue:以八进制存储值与ASCII的对照表
od命令可以将数据文件或者二进制文件的内容数据读出来。虽然读出来的数值默认是使用非文本文件,即是十六进制的数值来显示的,但可以使用-t c参数将数据内的字符以ASCII类型的字符来显示,虽然对一般用户来说,这个命令用途可能不大,但对于工程师来说,这个命令可以将二进制文件的内容作为一个大致的输出,看其中的含义。
如果纯文本文件使用这个命令,可以发现到ASCII与字符的对照表。
修改文件时间或创建新文件:touch
ls命令主要的变动时间主要有三个,具体如下:
² modification time(mtime)
当该文件的“内容数据”更改时,就会更新这个时间。内容数据指的是文件的内容,而不是文件的属性或权限。
² status time(ctime)
当该文件的“状态(status)改变时,就会更新这个时间。举例来说,像是权限和属性被更改了,都会更新这个时间
² access time(atime)
当该文件的内容被取用时,就会更新这个读取时间(access)。举例来说,使用cat去读取/etc/man.conf,就会更新该文件的atime了。
ls –l /etc/man.conf
ls –l –time=atime /etc/man.conf
ls –l –time=ctime /etc/man.conf
在默认情况下,ls显示出来的是该文件的mtime,即这个文件的内容上次被更改的时间。
文件时间很重要,因为如果文件的时间误判的话,可能会造成某些程序无法顺利运行。如果发现一个文件的时间自未来的时间,则要把该文件的时间改为现在,可以使用touch命令。
系统时区选择不正确或BIOS的设置错误等,可能导致系统时间是未来时间。
touch[-acdmt] 文件
参数:
² -a:仅修改访问时间
² -c:仅修改文件的时间,若该文件不存在则不创建新文件
² -d:后面可以接欲修改的日期而不用目前的日期,也可以使用—date=”日期或时间“
² -m:仅修改mtime
² -t:后面可以接欲修改的时间而不用目前的时间,格式为[YYMMDDhhmm]
touch 文件名:默认状态下,如果touch后面有接文件,则该文件的三个时间(atime,ctime,mtime)都会更新为目前的时间。如果该文件不存在,则会主动创建一个新的空的文件。
ll hosts;ll –time=atime hosts;ll–time=ctime hosts:显示host文件的三个时间
上面的命令中;号代表连续命令的执行。可以在一行命令当中写入多条命令,这些命令可以依序执行。
当复制一个文件时,文件的mtime与源文件相同,但文件的atime和ctime则为当前时间。
将文件时间调整为两天前,使用如下命令:
touch –d “2 days age” hosts 此时改变的时间为mtime和ctime,但是atime时间未改变
ll hosts; ll –time=atime hosts; ll–time=ctime hosts
touch -t 0709150202 hosts 将文件的日期改为2007/09/15/2:02
通过touch命令,可以轻易修改文件的日期与时间,并且也可以创建一个空的文件。注意:即使复制了一个文件,复制了所有的属性,但没办法复制ctime这个属性。ctime可以记录这个文件最近的状态(status)被改变的时间。比较重要的时间事件还是mtime,因为经常关心文件的内容是什么时候被改动过的。
touch命令常用的情况:
² 创建一个空的文件
² 将某个文件日期修改为目前日期(mtime和atime)
文件与目录的默认权限与隐藏权限
Linux文件有若干属性,包括读写执行(r,w,x)等基本权限,以及是否为目录(d)与文件(-)或者是连接文件(l)等的属性。要修改属性,可以使用chgrp,chown,chmod等命令。
除了基本r,w,x权限外,Linux的Ext2/Ext3文件系统下,可以设置其他系统的隐藏属性。可以使用chattr来设置,而以lsattr查看,最重要的属性是可以设置其不可修改的特性。文件属性很重要,主要体现在安全机制方面。
你的系统有个一般身份用户yzhang,它的用户组属于users,它的主文件夹在/home/yzhang,你是root,想将你的~/.bashrc复制给他,需执行如下命令:
复制文件:cp ~/.bashrc ~yzhang/bashrc
修改属性:chown yzhang:users ~yzhang/bashrc
想在/tmp下面新建一个目录,目录名为pro,并且这个目录所有者为yzhang,用户组为users,此外,任何人都可以进入该目录浏览文件,不过除了yzhang之外,其他人不能修改该目录下的文件。
分析:除了yzhang之外,其他人不能修改该目录下的文件,故整个目录的权限应该是drwxr-xr-x才对。故需执行如下操作:
新建目录:mkdir /tmp/pro
修改属性:chowm –R yzhang:users/tmp/yzhang
修改权限:chmod –R 755 /tmp/yzhang
文件默认权限:umask
当新建一个文件或目录时,它的默认权限与umask有关。umask指:目前用户在新建文件或目录时候的权限默认值。
umask 显示权限对应的数字,一般为0022(root用户),0002(非root用户)
umaksk –S 显示u=rwx, g=rx, o=rx
查看umask方式两种,一种可以直接输入umask,就可以看到数字形态的权限设置分数,一种是加入-S这个参数,就会以符号类型的方式来显示出权限。umask会有四组数字,其中第一组是特殊权限用的,故只需关注后三组。
x权限对于目录是非常重要的,但是一般文件的创建则不应该有执行的权限,因为一般文件通常是用于数据的记录。故不需要执行的权限。故默认情况如下:
² 若用户创建文件,则默认没有可执行(x)权限,只有r、w这两个选项,即最大为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 002 设置umask为002
umask对于新建文件与目录的默认权限是很有关系的。它可以用在任何服务器上面,尤其是若架设服务器,如SAMBA Server或者FTP Server时,很重要。它涉及到用户是否能够将文件进一步利用的问题。
root的umask会拿掉比较多的属性,root的umask默认是022,这是基于安全的考虑,而一般用户的umask为002,即保留同组用户的写入权利。默认umask的设置可以参考/etc/bashrc这个文件的内容。
文件隐藏属性chattr,lsattr
隐藏属性对系统有很大的帮助,尤其是在系统的安全上面,很关键。不过chattr命令只能在Ext2/Ext3的文件系统上面生效,其他的文件系统可能就无法支持这个命令。
chattr(设置文件的隐藏属性)
chattr [+-=] [ASacdistu] 文件或目录名称
参数:
² +:增加某一个特殊参数,其他原本存在的参数则不动
² -:删除某一个特殊参数,其他原本存在参数则不动
² =:仅有后面接的参数
² A:当设置了A这个属性时,若你有访问此文件(或目录)时,它的访问时间atime将不会被修改,可避免I/O较慢的机器过度访问磁盘。这对速度较慢的计算机有帮助。
² S:一般文件是异步写入磁盘的,如果加上S这个属性时,当你进行任何文件的修改,该改动会”同步“写入磁盘中
² a:当设置a之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root才能设置这个属性
² c:这个属性设置之后,将会自动将此文件压缩,在读取的时候将会自动解压缩,但是在存储的时候,将会先进行压缩后再存储
² d:当dump程序被执行的时候,设置d属性将可使该文件(或目录)不会被dump备份
² i:它可以让一个文件“不能被删除、改名,设置连接也无法写入或添加数据。对于系统安全性有相当大的帮助。只有root能设置此属性。
² s:当文件设置了s属性时,如果这个文件被删除,它将会被完全从这个硬盘空间中删除
² u:与s相反,当使用u来配置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,可以使用来找回该文件。
注意:属性设置常见的是a和i的设置值,而且很多设置必须要root才能设置。
chattr +i 文件名:给这个文件赋予i属性
chattr –i 文件名:取消这个文件的i属性
chattr命令在系统的数据安全上非常重要。但由于这些属性与隐藏性质有关,故需使用lsattr才能查看该属性。其中最重要的属性为+i与+a。+i可以让一个文件无法被改动,对于需要强烈的系统系统安全的人来说,相当重要。其中一些属性需要root才能设置。
而对已log file这种登录文件,需要+a这个属性来增加但是不能修改旧有的数据和删除的参数。
lsattr(显示文件隐藏属性)
lsattr [-adR] 文件或目录
参数:
² -a:将隐藏文件的属性也秀出来
² -d:如果连接的是目录,仅列出目录本身的属性而非目录内的文件名
² -R:连同子目录的数据也一并列出来
chattr +aij temp 更改属性
lsattr temp 查看属性
使用chattr设置后,可以利用lsattr来查看隐藏的属性。不过这两个命令在使用上必须要特别小心,否则会造成很大的困扰。
文件特殊权限:SUID,SGID,SBIT
ls –ld /temp; ls –l /usr/bin/passwd 会发现passwd文件的属性中包括s属性,这就是特殊属性。
SetUID
当s这个标志出现在文件所有者的x权限上时,被称为Set UID,简称为SUID的特殊权限。SUID的权限对于一个文件的特殊功能和限制如下:
² SUID权限仅对二进制程序有效
² 执行者对于该程序需要具有x的可执行权限
² 本权限仅在执行改程序的过程中有效
² 执行者将具有该程序所有者的权限
举例:
在Linux系统中,所有账户的密码都记录在/etc/shadow这个文件里,这个文件的权限为-r-------- 1 root root,意思是这个文件仅有root可读且可以写入而已。既然这个文件只有root可以修改,为什么一般用户yzhang能够自行修改自己的密码,可以使用自己的账户输入passwd命令来修改自己的密码,存不存在冲突。为什么/etc/shadow不能让yzhang账户访问,但yzhang还能够修改这个文件内的密码,主要原因在与SUID。SUID的功能如下:
² yzhang对于/usr/bin/passwd这个程序来说具有x权限,表示yzhang能执行passwd
² passwd的拥有者是root这个账户
² yzhang执行passwd过程中,会暂时获得root权限
² /etc/shadow可以被yzhang所执行的passwd所修改
yzhang不能使用cat去读取/etc/shadow,因为cat不具有SUID的权限,所以yzhang执行cat/etc/shadow不能读取/etc/shadow。
此外,SUID可用在二进制程序,不能够用在shell script上面。因为shellscript只是将很多的二进制执行文件调进来来执行而已。SUID的权限部分,还是要看shell script调用进来的程序的设置,而不是shell script本身。SUID对于目录也是无效的。
SetGID
当s标志在文件所有者的x项目为SUID,那么在用户组的x时则称为Set GID,SGID。查看SGID权限的文件命令如下:
ls –l /usr/bin/locate
与SUID不同的是,SGID可以针对文件或目录来设置。如果对文件来说,SGID有如下功能:
² SGID对二进制程序有用
² 程序执行者对于该进程来说,需具备x的权限
² 执行者在执行的过程中将会获得该程序用户组的支持
当一个目录设置了SGID权限后,它具有如下的功能:
² 用户若对于此目录具有r与x的权限时,该用户能够进入此目录
² 用户在此目录下的有效组(effectivegroup)将会变成该目录的用户组
² 若用户组在此目录下具有w的权限(可以新建文件),则用户所创建的新文件的用户组与此目录的用户组相同。
SGID对于项目开发来说非常重要。因为这涉及用户组的权限问题。
StickyBit
Sticky Bit(SBIT)目前只针对目录有效,对于文件已经没有效果了。SBIT对于目录的作用如下:
² 当用户对于此目录具有w,x权限,即具有写入的权限时;
² 当用户在该目录下创建文件或目录时,仅有自己与root才有权利删除该文件。
举例:当甲这个用户用于A目录是具有用户组或其他人的身份,并且拥有该目录w的权限,表示甲用户对该目录内任何人新建的目录或文件均可进行删除、重命名、移除等操作。不过,如果将A目录加上了SBIT的权限项目时,则甲只能够针对自己创建的文件或目录进行删除、重命名、移动等操作,而无法删除他人的文件。
如果/tmp本身的权限是drwxrwxrwt,在这样的权限内容下,任何人都可以在/tmp内添加、修改文件,但仅仅该文件、目录创建者与root能够删除自己的目录或文件。
SUID/SGID/SBIT权限设置
更改文件的SUID和SGID等权限方法,是在原来的3个数字组合之前再加上一个数字,最前面的一个数字代表SUID/SGID/SBIT权限。
² 4为SUID
² 2为SGID
² 1为SBIT
如果要将一个文件权限改为-rwsrr-xr-x时,由于s在用户权利中,所以是SUID,故在原先的755之前加上4,即执行chmod 4755 文件名来设置。
注意:SUID不是用在目录上,SBIT不是用在文件上
² chmod 4755 test 加入具有SUID的权限
² chmod 6755 test 加入具有SUID/SGID的权限
² chmod 1755 test 加入SBIT的功能
² chomd 7666 test 具有空的SUID/SGID权限
注意最后一个属性会出现S和T。原因是s和t都是替代x这个权限,而7666说明user,group和others都没有x这个可执行的标志(666),故S和T代表的就是空。SUID是表示该文件在执行的时候具有文件拥有者的权限,但是文件拥有者都无法执行了,故权限给其他人的应当是空。
除了数字表示法之外,还可以通过符号来处理。其中SUID为u+s,SGID为g+s,SBIT为o+t。
设置权限为-rws—x—x命令:chmod u=rwxs,go=x test
在上述文件权限上加上SGID和SBIT权限命令:chmod g+s,o+t test
查看文件类型:file
如果想要知道某个文件的基本数据,如属于ASCII或者data文件,或者binary,且其中有没有使用动态函数库等等的信息,可以利用file命令来查看
具体命令使用如下:
file /etc/hosts
file /usr/bin/passwd
file /var/lib/mlocate/mlocate.db
file命令可以简单地判断文件的格式。
命令和文件的查询
文件的查询命令比较重要,因为经常需要知道哪个文件放在哪里,才能对该文件进行一些修改或维护等操作。有些时候某些软件配置文件的文件是不变的,但是各Linux版本放置的目录则不同,此时需要利用一些查询命令将该配置文件的完整文件名找出来,才能够修改。
脚本文件名的查询
which (寻找“执行文件”)
which [-a] command
参数:
² -a:将所有由PATH目录中可以找到的命令均列出,而不只第一个被找到的命令名称
如查找ifconfig命令的完整文件名使用下列命令:which ifconfig
which命令是根据PATH这个环境变量所规范的路径去查询执行文件的文件名,所以,重点是找出执行文件而已。且which后面接的是完整文件名。若加上-a参数,则可以列出所有的可以找到的同名执行文件,而非仅显示一个而已。
which cd命令找不到,原因是cd是bash的内置命令,而which默认查找PATH内所规范的目录,故找不到。
文件名的查找
Linux下面也有非常优异的查找命令。通常find不很常用,因为速度慢。可以显示用whereis和locate来检查,如果真的找不到,在使用find来查找。whereis与locate是利用数据库来查找数据,所以相当快速,并且没有实际查询硬盘,比较节省时间。
whereis(寻找特定文件)
whereis [-bmsu] 文件或目录名
参数:
² -b:只找二进制格式的文件
² -m:只找在说明文件manual路径下的文件
² -s:只找source源文件
² -u:查找不在上述三个选项当中的其他特殊文件
whereis ifconfig
whereis –m passwd
find是很强大的查找命令,但时间花费很多。因为find是直接查找硬盘,如果你的硬盘比较老旧的话,就要等很久。此时whereis相当好用。此外,whereis可以加入参数来寻找相关的数据,如要找二进制文件,加上-b参数。如果不加任何参数,则将所有的数据列出来。
whereis查找速度快于find原因:Linux系统会将系统内的所有文件都记录在一个数据库文件里面,而当要使用whereis或者是locate时,都会以此数据库文件的内容为准,因此,有时使用这两个执行文件时,会找到已经被删除掉的文件?而且也找不到最新的刚才创建的文件。因为这两个命令是由数据库当中的结果去查找文件的所在。
locate
locate [-ir] keyword
参数:
² -i:忽略大小写的差异
² -r:后面可接正则表达式的显示方式
找出系统中所有与passwd相关的文件名:locate passwd
locate使用简单,直接在后面输入文件的部分名称,就能够得到结果。如上面locate passwd,则在完整文件名(包含路径名称)当中,只要有passwd在其中,就会被显示出来。当忘记某个文件的完整名时,可以使用该命令。
locate命令使用数据库/var/lib/mlocate/里面的数据进行查找,不用区硬盘中访问数据,故速度快。
更新locate数据库的方法非常简单:直接输入updatedb即可。updatedb命令会去读取/etc/updated.conf这个配置文件的设置,然后再去硬盘里进行查找文件名的操作,最后就更新整个数据库文件。因为updatedb会去查找硬盘,故执行updatedb时,可能会等待数分钟时间。
updated:根据/etc/updated.conf的设置去查找系统硬盘内的文件名,并更新/var/lib/mlocate内的数据库文件。
locate:依据/var/lib/mlocate内的数据库记载,找不用户输入的关键文件名。
find
find [PATH] [option] [action]
参数:
参数1时间相关
² 与时间有关的参数:共有-atime,-ctime,与-mtime,下面以-mtime说明。
² -mtime n:n为数字,意义在n天之前的一天之内被更改过的文件
² -mtime +n:列出在n天之前(不含n天本身)被更高过的文件名
² -mtime –n:列出在n天之内(含n天本身)被修改过的文件名
² newer file:file为一个存在的文件,列出比file还要新的文件名。
find / -mtime 0:将过去系统上面24小时内有改动(mtime)的文件列出。其中0是重点。0代表目前的时间,所以从现在开始到24小时前,有改动过的内容文件都会被列出来?
find / -time 3:将3天前改动过的文件内容都列出来。
find /etc –newer /etc/passwd:寻找/etc下面的文件,如果文件日期比/etc/passwd新旧列出来,-newer用在分辨两个文件之间的新旧关系很有用。
atime、ctime、mtime的意义,如果想要找出一天内被改动过的文件名,就可以用上述命令。但如果想找出“4天内被改动过的文件”,可以使用find /var –mtime -4。如果是“4天前的那一天”,就用find /var –mtime 4。有没有加上“+,-”差别很大。
² +4代表大于等于5天前的文件名:ex>find /var –mtime +4
² -4代表小于等于5天内的文件名:ex>find /var –mtime -4
² 4则是代表4~5那一天的文件名:ex>find /var –mtime 4
参数2说明
与用户或用户组名有关的参数:
² -uid n:n为数字,这个数字是用户的账号ID,即UID,这个UID是记录在/etc/passwd里面与账号名称对应的数字,
² -gid n:n为数字,这个数字是用户组名的ID,即GID,这个GID记录在/etc/group中
² -user name:name为用户账户名称
² -group name:name为用户组名
² -nouser:寻找文件的所有者不存在/etc/group中的文件。
² -nogroup:寻找文件的所有用户组不存在与/etc/group中的文件。当你自行安装软件时,很可能该软件的属性当中并没有文件所有者,这是可能的,这时候,可以使用-nouser与-nogroup查找。
查找/home下面属于yzhang的文件夹
find /home –user yzhang
查找系统中不属于任何人的文件
find / -nouser
如果想知道某个用户在系统下面创建了什么,使用上述参数就能够找出来。至于那个-nouser或-nogroup的参数功能中,除了自行由网络上面下载文件时会发生之外,如果将系统里面某个账号删除,但是该账号已经存在系统内创建很多文件时,就可能发生无主的孤魂文件存在。可以是用-nouser来找出该类型的文件。
参数3
与文件权限及名称有关的参数
² -name filename:查找文件名为filename的文件
² -size [+-]SIZE:查找比SIZE还要大(+)或小(-)的文件。这个SIZE的规格有:c:代表byte,k代表1024bytes。所以,要找比50KB还要大的文件,就是-size +50K
² -type TYPR:查找文件类型为TYPE的。类型主要有:一般正规文件(f)、设备文件(b,c)、目录(d)、连接文件(l)、socket(s)及FIFO(p)等属性。
² -perm mode:查找文件权限“刚好等于”mod的文件。这个mode为类似chmod的属性值,如-rwsr-xr-x,即属性为4755。
² -perm –mode:查找文件权限“必须要全部包括mode的权限”的文件,举例来说,要查找-rwxr—r—,即0744的文件,使用-perm -0744,当一个文件权限为-rwsr-xr-x,即4755时,也会被列出来,因为-rwsr-xr-x属性包含了-rwxr-xr-x的属性了。
² -perm +mode:查找文件权限包含任意mode的权限文件,如要查找-rwxr-xr-x,即-perm +755时,但一个文件属性为-rw-------也会被列出来,因为他有-rw…属性存在。
找出文件名为passwd的文件,使用如下命令:
find / -name passwd
找出/var目录下文件类型为Socket的文件名,使用如下命令:
find /var –type s
查找文件中含有SGID或SUID或SBIT的属性,使用如下命令:
find / -perm +7000
上面中-perm这个参数,重点在找出特殊权限的文件。SUID和SGID都可以设置在二进制程序上,故想要将/bin,/sbin这两个目录下只要具有SUID或SGID的文件就列出来,使用如下命令:
find /bin /sbin –perm +6000
因为SUID是4分,SGID是2分,总共6分,故可用+6000来处理这个权限。find后面可以接多个目录来进行查找,另外,find本来就会查找子目录,这要特别注意。
参数4
其他可进行的操作
² -exec command:command为其他命令,-exec后面可再接其他的命令来处理查找到的结果。
² -print:将结果打印到屏幕上,这个操作是默认操作
将上述范例中找到文件使用ls–l列出来,使用如下命令:
find / -perm +7000 –exec ls –l {} \;
注意:那个-exec后面的ls –l是额外的命令,命令不支持命令别名,所以仅能使用ls –l,不可以使用ll。
找出系统中大于1MB的文件
find / -size +1000k
find的特殊功能就是能够进行额外的动作(action)
find / -perm +7000 –exec ls –l {} \;
上述命令中,特殊的地方有”{}”以及“\;”,还有-exec这个关键字,这些东西的意义如下:
{}代表的是“由find找到的内容”,find的结果会放置到{}位置中
-exec一直到”\”是关键字,代表find额外命令的开始(-exec)到结束(\;),在这中间的就是find命令内的额外命令。上述命令就是ls –l {};
因为“;”在bash环境下是有特殊意义的,因此利用反斜杠来转义。
此外find还可以利用通配符来找寻文件名。
想要找到/etc下面文件名包含httpd的文件,使用如下名令:
find /etc –name ‘*httpd*’
不但可以指定查找的目录(连同子目录),并且可以利用额外的参数来找到最正确的文件。
权限与命令间的关系
权限对于用户账号来说是非常重要的,因为它可以限制用户能不能读取/新建/删除/修改文件或目录。
让用户能进入目录成为可工作目录的基本权限如下:
² 可使用的命令:如cd等切换工作目录的命令
² 目录所需权限:用户对这个目录至少需要具有x的权限
² 额外需求:如果用户想要在这个目录内利用ls查阅文件名,则用户对此目录还需要r的权限
用户在某个目录内读取一个文件的基本权限如下:
² 可使用的命令:cat,more,less等
² 目录所需权限:用户对这个目录至少需要具有x权限
² 文件所需权限:用户对文件至少需要具有r的权限才行
让用户可以修改一个文件的基本权限如下:
² 可使用的命令:如nano,vi编辑器等
² 目录所需权限:用户在该文件所在的目录至少需要有x权限
² 文件所需权限:用户对该文件至少要有r,w权限
让一个用户可以创建一个文件的基本权限如下:
² 目录所需权限:用户在该目录下的要具有w,x的权限,重点在w
让用户进入某个目录并执行该目录下的某个命令的基本权限如下:
² 目录所需权限:用户在该目录至少要有x的权限
² 文件所需权限:用户在该文件直到需要有x的权限
cp /dir1/file1 /dir2则dir1,file1,dir2的最小权限:
dir1:至少需要有x权限
file1:至少需要有r权限
dir2:至少需要有w,x权限
重点:
² 绝对路径“一定由根目录/写起”;相对路径“不是由/写起”。
² 特殊目录有. .. - ~ ~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的特殊权限时,代表当用户执行此二进制程序时,在执行过程中用户会暂时具有程序所有者的权限。
² 目录具有SGID的特殊权限时,代表用户在这个目录下面新建的文件用户组都会与该目录的用户组名相同。
² 目录具有SBIT的特殊权限时,代表在该目录下用户创建的文件只有自己与root能够删除。
² 查看文件的类型可以使用file命令来查看。
² 查找命令的完整路径文件可用which或type,这两个命令都是通过PATH变量来查找文件名。
² 要查找文件的完整文件名可以使用whereis或locate到数据库文件去查找,而不是实际查找文件系统。
² 利用find可以加入许多参数来直接查询文件系统,以获得自己想要知道的文件名。
情景模拟
假设系统中有两个账号,分别是alex与arod,这两个人除了自己用户组之外还共同支持一个名为project的用户组。假设这两个用户需要共同拥有/src/ahome/目录的开发权,且该目录不允许其他人进入查阅。这该目录权限如何设置?
目标:了解到为何项目开发时目录最好要设置SGID的权限。
前提:多个账户支持同一用户组,且共同拥有目录的使用权。
需求:需要使用root的身份来进行chmod、chgrp等操作帮用户设置好他们的开发环境才行,这也是管理员的任务之一。
首先先要制作两个账号相关数据,具体如下(默认root下执行):
groupadd project:增加新的用户组
useradd –G project alex 新建alex账户,且支持project
useradd –G project arod 新建arod账户,且支持project
id alex 查询alex账号属性
id arod
新建所需开发的项目目录,具体如下:
mkdir /srv/ahome
ll –d /srv/ahome
进行权限修改,其他人不能进入该目录,此目录用户组为project,权限为700。具体如下:
chgrp project /srv/ahome
chmod 770 /srv/ahome
ll –d /srv/ahome
实际分别用用户测试
su – alex 切换身份为alex
cd /srv/ahome
touch abcd
exit
su – arod
cd /srv/ahome
ll abcd结果显示用户组为alex,arod为其他人,故arod最abcd文件只有r的权限
上面的结果是显示alex新建的abcd文件,arod可以删除,却不能编辑,故需重新规划
加入SGID的权限,使用如下名令
chmod 2770 /srv/ahome
ll –d /srv/ahome
使用alex创建文件,并查阅,具体如下:
su – alex
cd /srv/ahome
touch 1234
ll 1234
最终结果显示,此目录权限最好是2770,文件所有者为root,用户组必须要为两人共同支持的project这个用户组才行。