鸟哥的Linux私房菜基础学习篇 第6章的重点探索

前言

续上一篇所述进入到更加精彩的第6章,各种命令帮助大家熟悉针对文件与目录的操作。这篇也帮大家列出了鸟哥书里的不少实例供大家巩固练习,当然肯定不如man命令查找来的更全面。

一、目录与路径

1.目录的相关操作

先回顾一下上一章的绝对路径与相对路径,一般来说句对路径的正确度要比较好,再写程序(shell脚本)来管理系统的条件下,务必使用绝对路径,但相对路径写法更为简便。
除了常用的.和…,-:代表前一个工作目录,即上一条命令执行时所在目录,~:代表目前使用者身份所在的家目录(其后跟账号名称即代表这个账号的家目录)。

根目录的上一层与根目录自己是同一个目录。

常见的命令:
1.cd(change directory)切换目录:

[root@study ~]# cd ~
#表示回到自己的家目录
[root@study ~]# cd 
#不加任何路径,依然是回到自己的家目录
[root@study ~]# cd -
#回到刚刚的目录,就是/root
[root@study ~]# cd /var/spool/mail
#绝对路径直接指定要去的完整路径名称
[root@study ~]# cd ../postfix
#体会相对路径,即访问/var/spool/postfix,不记得准确的目录路径时,记得搭配tab键自动补齐

2.pwd(Print Working Directory)显示目前所在的目录:

[root@study ~]# cd /var/mail
[root@study ~]# pwd
/var/mail
#列出目前的工作目录
[root@study ~]# pwd -P
/var/spool/mail
#加了-P这个选项后,会显示出真正的路径,而非使用链接(link)l路径,想查看这样的链接关系可用 ls -d /var/mail

由于许多软件所使用的目录名称相同,如/usr/local/etc和/etc,为避免搞错目录,所以用pwd查看。
3.mkdir(make directory)建立新目录:

[root@study ~]# cd /tmp
[root@study tmp]# mkdir test1/test2/test3/test4
mkdir:cannot create directory ……
#上次目录没建之前,下层也建不了
[root@study tmp]# mkdir -p test1/test2/test3/test4
#加上-p选项可以直接递归创建,上次目录也一并创建出来了,即便该目录已经存在,也不会显示错误信息
[root@study tmp]# mkdir -m 711 test2
#不使用默认权限(umask),而用自己设置的权限创建目录,不适用-m时创建的目录会是系统默认的新建目录权限,详见下 

4.rmdir(remove directory)删除“空”的目录:

[root@study tmp]# rmdir test
#刚例子里创建的,可以直接删掉
[root@study tmp]# rmdir test1
rmdir:failed to remove……
#里面尚有内容,删不掉
[root@study tmp]# rmdir -p test1test2/test3/test4
#使用-p,有点像递归删除,把test4之上的空目录全部删掉了

如果要将所有目录下的东西都删除,必须使用rm -r test,用rmdir更安全。

2.执行文件路径的变量: $PATH

这个就是环境变量了,为什么在任何目录下都可以执行ls这个命令,它明明放在/bin/ls这里,是因为输入ls,系统会按照PATH的设置去欸个PATH定义的目录下查找文件名为ls的可执行文件,先查找到的同名命令先被执行。

[root@study ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
#从左往右,哪个目录先被查询,哪个目录下的命令被先执行
[root@study ~]# exit
[xxxx@study ~]# echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xxxx/.local/bin:/home/xxxx/bin
#echo:可以在屏幕上显示任何信息
[root@study ~]# mv /bin/ls /root
#mv为移动,可将文件在不同的目录之间进行移动操作,接下来不论在哪个目录下输入ls,都无法查找。
[root@study ~]# /root/ls
[root@study ~]# ./ls
#只有使用绝对路径与相对路径,确切的指向这个执行文件,才能够执行成功,这时把/root目录也加入环境变量便也可以执行成功了
[root@study ~]# PATH="${PATH}:/root"
#记得一定要将ls移回/bin目录
[root@study ~]# mv /root/ls /bin
#移回后输入ls依然不行,可能是指向参数被缓存了,只需要注销再登录即可

${PATH}查找的目录不加入本目录.是因为用户的工作目录不固定,切换目录后能够执行的命令会有变动,再一个是防止大量窃取用户数据事件的发生,这一点与Windows的习惯不同。
要点:
1.不同身份用户默认的PATH不同
2.PATH是可以修改的
3.使用绝对路径或相对路径之间指定某个命令的文件名来执行,会比查找PATH来到正确
4.命令要放置到正确的目录下以便执行
5.本目录勿放到PATH中

二、文件与目录管理及文件内容查看

1.常见命令

1.文件与目录的查看:ls
执行ls,默认显示的只有:非隐藏文件的文件名、以文件名进行排序及文件名代表的颜色(蓝色显示目录,白色显示一般文件),但ls有非常多的选项。
Bash shell的alias功能还将ll设置成ls -l的意思。

[root@study ~]# ls [-aAdfFhilnrRSt] 文件名或目录名称
#常用的有:-a(全部的文件连同隐藏文件一并列出)
#-d(仅列出目录本身而不是列出目录内的文件数据)
#-l(详细信息显示,包含文件的属性与权限等数据,是多个文件一次列举,用空格隔开)
#其他操作常需要配合-a,因为非隐藏文件可能过于普通了,不能表现一些特质。
#参数输入时无所谓先后顺序
[root@study ~]# ls [--color={never,auto,always}] 文件名或目录名称,不显示颜色后,会在目录后加上/表示这是目录
[root@study ~]# ls [--full-time] 文件名或目录名称
#ls -al列出的时间时目前短格式的时间,借由--full-time可以查看到比较未正确的完整时间格式

在这里插入图片描述

2.复制:cp
cp除了单纯的复制之外还可以建立链接文件(快捷方式),比对两文件的新旧而予以更新,以及复制整个目录等的功能。

[root@study ~]# cp [-adfilprsu] 源文件1 源文件2…… 目标文件
#cp常用的选项有:-a(相当于-dr --preserve=all 的意思,区别-p,--preserve=all指除了-p的权限相关参数外,还加入了SELinux的属性,links、xattr等也复制)
#-p(连同文件的属性,包括权限、用户、时间一起复制过去,而非使用默认属性,这也是备份时常用的)
#-i:若目标文件已经存在,会先询问再覆盖
#-r:递归复制,用于目录都复制操作
#-u:目标文件与源文件有差时复制,备份常用
[root@study tmp]# cp -s bashrc bashrc_slink
[root@study tmp]# cp -l bashrc bashrc_hlink
#使用-s或-l都会建立所谓的链接文件,但-s是我们熟悉的快捷方式,-l则建立的是硬链接,与bashrc的属性与权限完全一样,执行后,ls -l后的第二栏link数会+1
[root@study tmp]# cp -d bashrc_slink bashrc_slink_2
#不加选项复制快捷方式不能生成快捷方式,只会把原始文件复制一份,而加了-d可以复制链接文件的属性,复制出来的是快捷方式

在不加任何选项时,文件复制过去属性和权限可能会变,默认条件下,cp之后文件的拥有者通常会是命令操作者本身,密码文件(/etc/shadow)以及一些配置文件不能直接以cp来复制必须要加上-a或-p这样可以完整复制文件权限的选项才行。
想要复制文件给其他用户,也要注意权限,不然其他人无法针对给予的文件进行自定义操作。
注意多个源文件复制时,最后一个得是目标“目录”。
不同身份执行此命令也有不同结果,用自己的账号cp -a时发现并不能随意修改文件的拥有者与用户组,因此只能够复制文件的相关权限与时间等属性。
使用要点:是否需要完整保留源文件信息,源文件是否为符号链接文件(s),是否为特殊文件,是否为目录
3.删除文件或目录:rm

[root@study ~]# rm [-fir] 文件或目录 
-f:force,忽略不存在的文件,不会出现警告信息
-i:交互模式,使用root时默认带这个选项
-r:递归删除,常用于目录,非常危险的选项
[root@study tmp]# rm -r /tmp/etc
rm:descend into directory `/tmp/etc'?y
rm:renove regular file `/tmp/etc/fstab'?y
rm:……?
……
#每删一个文件,需要一次询问,按下ctrl+c退出
[root@study tmp]# \rm -r /tmp/etc
#加上\,可以忽略掉alias的设定

用-做文件名执行命令时容易误判,这时还有两种操作可以避免误会,如删除文件-foo,可以rm ./-foo 或rm – -foo。
4.移动目录与文件或重命名:mv

[root@study tmp]# mv [-fiu] source1 source2 …… directory/destination
-f:force,若目标文件已存在不询问直接覆盖
-i:若目标文件已存在询问
-u:若目标文件已存在,且source更新,才会更新
[root@study tmp]# mkdir mvtest
[root@study tmp]# mv mvtest mvtest2
#起到了重命名的作用
#rename命令也可以重命名,但它是对一组文件进行编号,并且修复extension of your html files

注意多个源文件移动时,最后一个得是目标“目录”。
5.获取路径的文件名于目录名称:basename与dirname

[root@study ~]# basename /etc/sysconfig/network
network 
[root@study tmp]#  dirname /etc/sysconfig/network
/etc/sysconfig

2.文件内容的直接查看与翻页查看

1.cat(concatenate):
主要功能是将一个文件的内容连续打印在屏幕上面。加上-n或-b(非空白行),每一行还会加上行号,但当文件内容的行数超过40行以上,根本来不及在屏幕上看到结果,配合more或less更好。一般的DOS文件可能需要留意特殊符号,用上-A。

[root@study ~]# cat [-AbEnTv] 
[root@study ~]# cat -n /etc/issue
1  \S
2  Kernel \r on an \m
3
#-n选项可以打印出行号,这对于大文件要找某个特定的行时很有用
#-A:相当于vET,可列出一些特殊字符而不是空白,区别文件里使用了tab和使用了空格的地方,tab键会以^I显示,换行符会以$显示

2.tac(反向显示):
cat是由第一行写道最后一行连续显示在屏幕上,而tac则是从最后一行到第一行反向在屏幕上显示
3.nl(添加行号打印):

[root@study ~]# nl /etc/issue
#同cat -b
[root@study ~]# nl -b a /etc/issue
#同cat -n,-b t不列出空行行号
[root@study ~]# nl -b a -n rz /etc/issue
#行号在自己栏位最右边显示,行号前面自动补0,-n rz行号在自己栏位的最右方显示,且不加0,-n ln行号在屏幕的最左方显示
[root@study ~]# nl -b a -n rz -w 3 /etc/issue 
#更改行号默认栏位数

4.more(一页一页向下翻):
more运行中的操作:
空格键-向下翻一页
Enter-向下翻一行
/字符串-在这个显示的内容当中,向下查找字符串这个关键词
:f-立刻显示出文件名以及目前显示的行数
q-立刻离开more,不再显示该文件内容
b或ctrl+b-往回翻页,支队文件有用,对管道无用
5.less(一页一页翻动):
less比more更好用,more只能下翻,less可以用pageup、pagedown前后翻,另外还有操作:?字符串-向上查找字符串、n-重复前一个查找(与/或?有关)、N-反向的重复前一个查找(与/或?有关)、g-前进到这个数据的第一行、G-前进到这个数据的最后一行。
事实上,man这个命令就是调用less来显示内容的。
6.数据截取head(取出前面几)和tail(取出后面几):

[root@study ~]# head 文件
#默认显示前面十行
[root@study ~]# head -n number 文件
#显示前面number行
[root@study ~]# head -n -number 文件
#除后面number行不显示之外,前面的都显示
[root@study ~]# tail 文件
#默认显示最后的十行
[root@study ~]# tail -n number 文件
#显示最后的number行
[root@study ~]# tail +number 文件
#除前面100行不显示之外,后面的都显示
[root@study ~]# tail -f 文件
#持续检测文件内容,指导按下ctrl+c才结束执行,它可以一直刷新显示文件内容,比如/var/log/messages随时会有数据写入,需要刷新显示。
[root@study ~]# head -n 20 /etc/man_db.conf | tail -n 10
#显示第11行到第20行
[root@study ~]# cat -n /etc/man_db.conf | head -n 20 | tail -n 10
#显示第11行到第20行加行号

显示第11行到第20行需要用到管道,管道(|)是指前面的命令所输出的信息,通过管道交由后续的命令继续使用,即在前一个命令的基础上执行下一个命令,前一个命令不输出到屏幕。
7.针对非纯文本文件od:
执行文件通常是二进制文件,用cat这些命令会产生乱码般的数据,要用特定的od。

[root@study ~]# od [-t TYPE] 文件
a:利用默认的字符来输出
c:使用ASCII来输出
C:对齐用,两种输出方式下观察对应关系,如输入oCc,一定要按照这样的顺序,若前面对照有多种输出方式如oxCc,离c近的有对其效果
d{size}:利用十进制来输出数据,每个整数占用size Bytes
f{size}:利用浮点数值来输出数据
o{size}:利用八进制输出
x{size}:利用十六进制输出

3.修改文件时间或创建新文件

1.三个时间:
修改时间(modification time)mtime:文件内容数据变更时更新
状态时间(status time)ctime:文件状态(权限、属性)改变时更新
读取时间(access time)atime:文件内容被读取时更新
默认情况下ls显示出来的时间是mtime,输入ls -l --time=atime或ctime可以读到另外两个时间
2.touch:

[root@study ~]# touch [-acdmt] 文件
-a:仅自定义access time
-c:仅修改文件的时间,不新建文件
-d:自定义日期
-m:仅修改mtime
-t:接自定义时间[YYYYMMDDhhmm]

比较时间的显示时,为了把信息打印在一起,选择在一行命令下输入几个命令,用分号隔开,这些命令会依次执行。
touch主要还是用于建立一个空文件,和将某个文件日期自定义为目前。
我们常关心mtime,即这个文件的内容是什么时候被修改。
复制的文件,ctime是这个文件复制完成的时间,atime与mtime是原本文件的。事实上复制一个文件,复制所有属性,也没有办法复制ctime。

[root@study tmp]# touch -d "2 days ago" bashrc
#会改变bashrc的atime和mtime,但ctime只会把分钟刷新到现在,日期不会变 

三、默认权限与隐藏权限

1.文件默认权限

umask:指定目前用户在建立文件或目录时候的权限默认值
,输入umask命令会有四组数字。第一组是特殊权限的,后面三组分别对应第五章的拥有者、用户组、其他人。用户一般文件建立时默认没有x(可执行)权限,即-rw-rw-rw-,建立目录时需要x,即drwxrwxrwx,有了umask,相当于在这个基础上设定建立文件和目录时还要拿掉的权限,比如设置umask为0022,即针对拥有者,不拿掉默认权限,针对用户组,拿掉可写权限,针对其他人,拿掉可写权限。
umask的设置:

[root@study ~]# umask 002
#一般为了安全性,不太建议修改,root的umask是022,一般用户是002

2.文件隐藏属性

九个权限之外的对文件的一些特殊保护。
1.chattr(配置文件隐藏属性):

[root@study ~]# chattr [+-=] [ASacdistu] 文件或目录名称
#常用的有a:这个文件只能增加数据,而不能删除也不能修改,只有root可设置这个属性,logfile就很需要
#i:可以让一个文件不能被删除、改名、设置链接也无法写入或新增数据,具有相当强的保护属性,只有root可设
#s:文件如被删除会完全从硬盘删除无法恢复
#u:文件如被删除数据依然在硬盘中,可以用来恢复该文件

2.lsattr(显示文件隐藏属性):

[root@study ~]# lsattr [-adR] 文件或目录
-a:将隐藏文件的属性也显示出来
-d:接的是目录则仅列出目录本身的属性而非目录内的文件名
-R:递归列出的感觉,连同子目录的数据一并列出

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

(1)SUID(Set UID)(-rwsr-xr-x):

1.相关限制:
SUID权限仅对二进制程序(binary program)有效
执行者对于该程序需要具有x的权限
本权限仅在执行该程序的过程中有效(run-time)
执行者将具有该程序拥有者(owner)的权限
2.例:一般用户可以修改自己的密码,但我们知道存放密码信息的文件/etc/shadow属性是---------,应该只有root可写,但可执行文件passwd的权限是-rwsr-xr-x,它的拥有者是root,用户输入这个命令后会暂时获得root的权限,从而可以针对/etc/shadow操作了。
3.注意:SUID仅可用在二进制程序是,不能够用在shell脚本上,shell脚本只是调用很多二进制程序,它的权限还是要看它调用的那些程序本身;SUID针对目录无效;针对user,区别于下面的SGID,针对group

(2)SGID(Set UID)(-rwx–s--x):

1.相关限制:
SGID对二进制程序有用
程序执行者对于该程序来说,需具备x的权限
执行者在执行的过程中将获得该程序用户组的支持
2.功能:(类似SUID理解)
用户若对于此目录具有r与x的权限时,该用户能够进入此目录
用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
若用户在此目录下具有w的权限(可以新建文件),则用户所建立的新文件,该新文件的用户组与此目录的用户组相同
3.例:很多时候多用户在一个目录(770)下工作,虽然这个目录属于用户组,多个用户也属于用户组,但仅对于目前某个用户在目录中创建的文件并不能为其他队友改动,该文件的用户与用户组都是他本人,其他队友只能删除而已,为了方便,不让这个用户每建一个文件都要去chgrp,使大家都能用,我们会直接更改目录的第四位权限改成2,即2770,这样每个用户再创建的文件用户组都会变更成整个团队隶属的用户组。

(3)SBIT(Sticky Bit)(drwxrwxrwt):

1.相关限制:
针对目录有效
2.功能:当用户对于此目录具有w、x权限,即具有写入的权限时,若干用户在该目录下建立文件或目录,便仅有自己与root才有权力删除该文件,进行更名、移动等操作,用户组内的他人无法删除文件。换句话是文件受到上层目录的t权限限制,具有了更强的保护性。

(4)如何设置

1.SUID-4,SGID-2,SBIT-1,权限设置里的第四个数,如chmod 4755 filename。
除了数字法还有常见的符号法,如 chmod g+s,o+t test,u和g可针对s操作,o可针对t操作

2.出现大写的情况:

[root@study ~]# chmod 7666 test;ls -l test
-rwSrwSrwT 1 root root 0 ……
#具有空的SUID/SGID权限,因为它们的6意味着没有x权限,根本无从执行,何谈特殊权限

4.观察文件类型:file

想要知道某个文件的基本信息,例如是属于ASCII或是数据文件或是二进制文件,且其中有没有使用到动态链接库(share library)等信息,通过file可以查看。目前先看文件格式,将来还有看压缩方式等。

四、命令与文件的查找

1.常见命令:

1.which(查找【执行文件】):
这个命令是根据PATH这个环境变量所规范的路径,去查找执行文件的文件名,所以,重点是找出执行文件,找不到PATH之外的命令。这个要用type命令,它也是通过PATH来查找文件名。

[root@study ~]# which [-a] command
-a:将所有由PATH目录中可以找到的命令均列出,而不止第一个被找到的命令名称

输入which which后可看到which的命令别名,含“alias”,即输入which等于输入后面那一堆。
2.whereis(由一些特定的目录中查找文件):
比find快,因为它只查找特定目录,没有全系统查找,但这样它查询目录有限,某些文件很有可能就查不到了。

[root@study ~]# whereis [-blmsu] 文件或目录名
-l:可以列出whereis会去查询的几个主要目录
-b:只找binary格式的文件
-m:只找说明文件manual路径下的文件
-s:只找source源文件
-u:查找不再上述三个项目当中的其他特殊文件

3.locate/updatedb:
locate查找数据特别快,因为locate寻找的数据是由已建立的数据库/var/lib/mlocate里面的数据所查,不用再去硬盘中读数据,文件名中包含输入内容的都会被查到。但有时候新建立的文件查不到,这时需要更新数据库updatedb,它根据/etc/updatedb.conf的设置去查找系统硬盘内的文件,并更新数据库文件。
locate也不会实际查找文件系统。

[root@study ~]# locate [-ir] keyword
-i:忽略大小写的差异
-c:不输出文件名,仅计算找到的文件数量
-l:仅输出几行,如输出5行是-l 5
-S:输出locate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等
-r:后面可解正则表达式的显示方式

2.多功能的find

1.与时间有关:

[root@study ~]# find [PATH] [option] [action]
-mtime n:n天之前的某天被修改过内容的文件
-mtime +n:列出n天之前(不含n天本身)被修改过内容的文件
-mtime -n:列出在n天之内(含n天本身)被修改过内容的文件
-newer file:file为一个存在的文件,列出比file还要新的文件
[root@study ~]# find /etc -newer /etc/passwd

以4为例说明time
在这里插入图片描述

2.与用户或用户组有关:

-uid n:n为使用者的账号ID,亦即UID,是数字,记录在/etc/passwd
-gid n:n为用户组的名称ID,亦即GID,是数字,记录在/etc/group
-user name:name是使用者账号名称
-group name:name是用户组名称
-nouser:查找文件的拥有者不在/etc/passwd中
-nogroup:查找文件的用户组不存在于/etc/group中
#自行安装的软件其属性很容易出现上面这两种情况

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

-name filename:查找文件名称为filename的文件
-size [+-]SIZE:查找比SIZE还要大(+)或小(-)的文件(SIZE的规格:c-Bytes,k-1024Bytes)
-type TYPE:查找文件的类型为TYPE(f-一般文件,b/c-设备文件,d-目录,l-链接文件,s-socket,p-FIFO)
-perm mode:查找文件权限刚好等于mode
-perm -mode:查找文件权限必须囊括mode
-perm /mode:查找文件权限含任一mode的权限
[root@study ~]# find / -perm /7000
#只要含有s或t就列出
[root@study ~]# find / -perm -7000
#同时含有s、s、t才列出

4.额外操作:

-exec command:接额外的命令来处理前面查找到的结果,这里的command不支持命令别名
-print:将结果打印到屏幕上,这个是默认操作
[root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
#可以列出找到的文件,-exec一直到\;都是关键词,代表find额外操作的开始和结束,其中的额外操作具体是指 ls -l {}。
[root@study ~]# find /etc -name *httpd* 

注意find本来就是会查找子目录的。
所找文件具有特殊属性,如SUID、文件拥有者、文件大小,用find会满足你的各种要求。
find还可以利用通配符(*/?)来查找文件名。
find查找相当小号硬盘资源,没事不要用。

总结

笔者通篇挪列下来感觉是巩固了不少的,搬一遍重点也相当于再学了一遍。也许有很多小例子工作时派不上用场,但同样会在成功练习后带来喜悦。希望大家都有所收获,一同进步!

猜你喜欢

转载自blog.csdn.net/ClaireTang1/article/details/114107600
今日推荐