您的位置:首页 > 运维架构 > Linux

鸟哥linux私房菜 基础篇 笔记3

2011-08-12 03:54 134 查看
[b]绝对路径与相对路径:

[/b]

绝对路径:路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录。
相对路径:路径的写法『不是由 / 写起』,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: 『cd ../man』这就是相对路径的写法啦!

常用的目录『符号』代表的意义:

 
. 代表此层目录

.. 代表上层目录

~ 代表自己的家目录

~user 代表到 user 这个人的家目录
 

目录与路径的几个常用的指令:

cd 变换目录
pwd 显示目前的目录
mkdir 建立一个新目录
rmdir 删除一个里面是空的空目录

mkdir

语法:
[root @test /root ]# mkdir [-mp] [目录名称]

参数说明:

-m :设定档案的权限喔!直接设定,不需要看 umask 这个内容的脸色!

-p :帮助你直接将上面的目录递归建立起来!

范例:

[root @test /root]# cd tmp

[root @test /tmp]# mkdir test<==建立名称为 test 的目录

[root @test /tmp]# mkdir -p test1/test2/test3/test4 <==直接建立 test2...等上层目录

[root @test /tmp]# mkdir -m 711 testqq <==建立权限为 711 的目录!

[root @test /tmp]# ll test*

drwxrwxr-x 2 test test 4096 Feb 6 20:47 test/

drwxrwxr-x 3 test test 4096 Feb 6 20:48 test1/

drwx--x--x 2 test test 4096 Feb 6 20:48 testqq/

rmdir

语法:
[root @test /root ]# rmdir [-p] [目录名称]

参数说明:

-p :将上层的目录也删除吧!

范例:

[root @test /root]# rmdir test<==删除名称为 test 的目录

[root @test tmp]# ll

drwxrwxr-x 3 test test 4096 Feb 6 20:48 test1/

[root @test tmp]# rmdir test1

rmdir: `test1': Directory not empty

[root @test tmp]# rmdir -p test1/test2/test3/test4

[root @test tmp]$ ll
说明:

如果想要建立删除旧有的目录时,就使用 rmdir 吧!例如将刚刚建立的 test 杀掉,使用 rmdir test 即可!请注意呦!目录需要一层一层的删除才行!而且被删除的目录里面必定不能还有其它的目录或档案!那如果要将所有目录下的东西都杀掉呢?!这个时候就必须使用 rm -rf test 啰!不过,还是使用 rmdir 比较不危险!不过,你也可以尝试以 -p 的参数加入,来删除上层的目录喔!

环境变量 PATH

下达 echo $PATH , echo 有『显示、印出』的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以即会显示出目前的 PATH 了!

 
[root@test root]# echo $PATH

/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin

增加环境变量:

PATH=”$PATH”:/root

档案与目录管理:

档案与目录的管理上,不外乎『显示属性』、『拷贝』、『删除档案』及『移动档案或目录』等等

ls 显示文件名称、属性等

cp 拷贝档案或目录

rm 删除档案或目录

mv 移动档案或目录

cp

语法:
[root @test /root ]# cp [-drsu] [来源档] [目的档]

参数说明:

-d     :在进行 copy 的时候,如果是 copy 到 link 档案,若不加任何参数,则预设情况中会将 link 到的源文件

       copy 到目的地,若加 -d 时,则 link 档案可原封不动的将 link 这个快捷方式其拷贝到目的地!

-r     :可以进行目录的 copy 呦!

-s :做成连结档,而不 copy 之意!与 ln 指令相同功能!

-u, --update:如果来源档比较新,或者是没有目的档,那么才会进行 copy 的动作!可用于备份的动作中!

范例:

[root @test /root]# cp .bashrc bashrc <==将 .bashrc 拷贝成 bashrc 这个档案!

[root @test /root]# cp -r /bin /tmp/bin <==这个功能就好玩啦!这是用来 copy 整个目录的参数!

[root @test /root]# cp -s .bashrc bashrc <==将 .bashrc
建立一个连结档,档名为 bashrc

[root @test /root]# cp -u /home/.bashrc .bashrc <==先检查 /home/.bashrc 是否与 .bashrc 不同,如果不同的话就开始
copy 一份!如果相同则不做任何动作!
说明:

这个指令会常用到的呦!因为我们得常常需要 copy 资料呀!所以需要了解一下喔!如果你有些很大档案的需要备份,偏偏这个档案的更新率很低,那么每次备份都需要在 copy 一份吗?看来是不需要了!你可以使用『cp -u 来源档 目的档』来备份呦!如此一来,当档案被改变过后,才会进行 copy 的动作!

 

rm

语法:
[root @test /root ]# rm [-fir] [檔名]

参数说明:

-i :提供使用者确认(这是默认值)

-r :循环,就是一直杀掉,直到没有东西为止的意思

-f :force ,就是强力杀掉啦!

范例:

[root @test /root]# cp .bashrc bashrc<==建立一个新档案, bashrc

[root @test /root]# rm bashrc <==会显示如下的提示:

rm: remove `bashrc'?

[root @test /root]# mkdir testing

[root @test /root]# cp .bashrc testing

[root @test /root]# rmdir testing

rmdir: `testing': Directory not empty <==由于 testing 里面有 .bashrc ,所以砍不掉!

[root @test /root]# rm -rf testing <==持续删除该目录下的所有档案与目录
说明:

这是移除的指令,相当于 dos 下的 del 指令!这里要注意的是,通常在 Linux 系统下,为了怕档案被误杀,所以都已经有 -i 这个参数, -i 是指每个档案被杀掉之前都会让使用者确认一次,以预防误杀档案!而如果要连目录下的东西都一起杀掉的话,例如子目录里面还有子目录时,那就要使用 -rf 这个参数了!不过,使用『 rm -rf 』这个指令之前,请千万注意了,因为,该目录或档案『肯定』会被
root 杀掉
!因为系统不会再次询问你是否要砍掉呦! 所以那是个超级严重的指令下达呦!得特别注意!不过,如果你确定该目录不要了,那么使用 rm -rf 来循环杀掉是不错的方式!

mv

语法:
[root @test /root ]# mv [-u] [来源档] [目的档]

参数说明:

-u :同样的,为 update 的简写,当来源档比目的档还新的时后才会动作!

范例:

[root @test /root]# cp .bashrc bashrc

[root @test /root]# mv bashrc bashrc.old

[root @test /root]# mv bashrc bashrc2 /tmp<==将 bashrc 与 bashrc2 移动到 /tmp 这个目录下!请注意,最后一个才是最终的目标,其它的都是 SOURCE
说明:

这是搬移的意思!当你要移动档案或目录的时后,呵呵!这个指令就很重要啦!同样的,你也可以使用 -u ( update )才测试新旧档案,看看是否需要搬移啰!另外一个用途就是『变更档名!』,我们可以很轻易的使用 mv 来变更一的档案的档名呢!

 

basename 就是取最后一个文件名或者目录名

语法:
[root @test /root ]# basename [目录]

参数说明:

范例:

[root @test /root]# basename /usr/local/etc

etc

这个指令会将后面的[目录]仅撷取出最后面的那个目录或档案,

以上面的例子来看, /usr/local/etc 不论 etc 是目录或档案,

他都会被撷取出来,因为他是最后一个出现的咚咚!
说明:

这个指令颇有点意思~他可以将一个目录或档案的最后一个咚咚秀出来!所以,未来如果你有要使用变量,并且取出最后一个数据(不论是档案还是目录),那么使用这个玩意儿就对啦! ^_^

dirname 与basename相反,取最后一个文件名或者目录名的前面部分

语法:
[root @test /root ]# dirname [目录]

参数说明:

范例:

[root @test /root]# dirname /usr/local/etc

/usr/local

恰恰与 basename 相反,他仅是秀出来前面的『目录』部分喔!
说明:

这个指令恰恰与 basename 相反的啦!呵呵!很好玩吧!这部份也最常用在我们第三部分要讲的 Shell 的学习中喔!用最多的地方应该是 scripts 啦!用这两个宝贝蛋来撷取部分数据的内容!有用的很!

 

观看档案内容:cat, tac, more, less, head, tail, nl

最常使用的显示档案内容的指令可以说是 cat 与 more 及 less 了

如果我们要查看一个很大型的档案(好几百MB时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外, tac 这个指令也可以达到!

cat
由第一行开始显示档案内容

tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!

more 一页一页的显示档案内容

less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

head 只看头几行

tail 只看尾巴几行

nl 显示的时候,顺道输出 行号!

od 以二进制的方式读取档案内容!

more

语法:
[root @test /root ]# more [檔名]

参数说明:

范例:

[root @test /root]# more ~/.bashrc <==一页一页的显示档案内容

[root @test /]# ls -al | more <==一页一页的将 ls 的内容显示出来
说明:

more 真是个很有用的指令!我好喜欢呦!当你的档案太大的时后,那么使用 cat 将没有办法看清楚!这个时候你可以使用 more 来做动作!more 也可以用来做为管线的同时执行之用!例如你在执行 find 这个寻找的指令时,可以同时使用 |more ,则搜寻结果可以一页一页的列出呦!关于管线( pipe )的用法我们在 bash shell 的地方再来谈!

less

语法:
[root @test /root ]# less [檔名]

参数说明:

范例:

[root @test /root]# less ~/.bashrc
说明:

less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办法向前面翻,只能往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,您瞧,是不是更容易使用来观看一个档案的内容了呢!?

 

more 与 less 的用途与用法真的是很广啦!首先,你可以在 more 与 less 的画面中进行『搜寻』的工作!如何进行呢?我们以 less 来说明好了,如果你想要知道 /etc/man.config 这个档案里面有没有一个叫做 GER 的大写字眼,那么可以:

连结档的介绍

ln命令

如果直接用ln passwd passwd-hard 是硬链接

如果使用ln -s passwd passwd-hard 是符号链接

硬链接不能跨分区 符号链接可以

档案与目录权限

由于 Linux 还可以设定其它的系统安全属性,使用 chattr 来设定,而以 lsattr 来查看,最重要的属性就是可以设定其不可修改的特性!让连档案的拥有者都不能进行修改!这个属性可是相当重要的,尤其是在安全机制上面( security )!

chown 改变档案的拥有人

chgrp 改变档案的所属群组

chmod 改变档案的可写、可读、可执行等属性

umask 改变预设的建立档案或目录时的属性

chattr 改变档案的特殊属性

lsattr 显示档案的特殊属性!

chown

语法:
[root @test /root ]# chown [-R] user:group [目录名称]

参数说明:

-R :循环的将该目录下的所有档案都改成 user 与 group 的名称!

范例:

[root @test /root]# mkdir /home/test/testing <==在 /home/test 这个家目录中建立一个名为 testint 的子目录

[root @test /root]# cp * /home/test/testing

[root @test /root]# chown test /home/test/testing

[root @test /root]# chown -R test:test /home/test/testing<==将该目录下的所有目录或档案均变为 test 拥有

说明:

前一个章节才刚讲完,应该不会就这样忘记了吧?!由于 chown 的使用范围较广,所以这里再次的给他复习一下 chown 就好, chgrp 请回前一章内容观看呦!

 

记得档案有『拥有人』及『拥有群组』吧,这个 chown 就是在改变拥有者的指令。刚接触 Linux 的朋友最容易犯的一个错误在哪里呢?就是以 root 的身份 copy 一个档案(或路径)给一般使用者(假设为 test )时,忘记将该档案的所有人改成 test 了!由于复制者是 root 所以该档案也会是 root 所有!那么 test 当然也就不能修改该档案了!

 

在上面的例子中,『 chown test /home/test/testing 』这个指令只会将该目录变成 test 的,但是 group 仍然是 root 的呦!所以你可以使用『 chown test:test /home/test/testing 』,连使用者群组都给他改变一下啰!不过需要注意的是,这两个指令都只改变了『目录』 的所有权而已!那么在这个目录下的东西也要改变的话,该如何?!呵呵,就使用
-R 这个参数即可!

chmod

语法:
[root @test /root ]# chmod [-R] [parameter] [目录名称]

参数说明:

-R :循环的一直将该目录的档案均改变之!

范例:

[root @test /root]# chmod 777 .bashrc

umask

OK!那么现在我们知道如何建立或者是改变一个目录或档案的属性了,不过,您知道当你建立一个新的档案或目录时,他的预设属性会是什么吗?呵呵!那就与 umask 有关了!那么 umask 是在搞什么呢?基本上, umask 就是指定『目前使用者在建立档案或目录时候的属性默认值』,那么如何得知或设定 umask 呢?他的指定条件以底下的方式来指定:

语法:
[root @test root]# umask

0022

[root@vbird test]# umask 002 <==后面接 3 个数字!

[root@vbird test]# umask

0002
说明:

查看 umask 数值为直接输入 umask 即可,而设定呢?没错!就是 umask 之后接三个数字!那么如何来指定呢?主要还是跟 Linux 的档案属性(那九个属性, r, w, x )有关的,而且是以分数的那一个关系为例的,而有底下的规则为辅:

 

若使用者建立为『档案』则预设『没有可执行 ( x ) 项目』,亦即只有 rw 这两个项目,也就是最大为 666 分

--rw-rw-rw-
若使用者建立为『目录』,则由于 x 与是否可以进入此目录有关,因此预设为所有权限均开放,亦即为 777 分

drwxrwxrwx

 

那么 umask 指定的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 分,所以啰!也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉执行与写入的权限,也就是 3 分,这样了解吗?请问您, 5 分是什么?呵呵!就是读与执行的权限啦!如果以上面的例子来说明的话,因为 umask 为 002 ,所以 user,
group 并没有被拿掉属性,不过 others 的属性被拿掉了 2 ( 也就是 w 这个属性 ),那么由于当使用者:

 

建立档案时:(-rw-rw-rw-) – (--------w-) ==> -rw-rw-r--
建立目录时:(drwxrwxrwx) – (--------w-) ==> drwxrwxr-x

 

不相信吗?你只要使用 touch test 然后看看这个 test 的档案属性,就可以知道了!那么如何看你这个使用者目前的 umask 呢?直接下达 umask 即可!实作看看先:

 
[root@vbird test]# umask

0002

[root@vbird test]# touch test1

[root@vbird test]# mkdir test2

[root@vbird test]# ls -l

-rw-rw-r-- 1 root root 0 Oct 22 00:00 test1

drwxrwxr-x 2 root root 4096 Oct 22 00:00 test2/

发现了什么?呵呵! Test1 的属性为 666-002 = 664 !正确吗?是的!正确!

而 test2 这个目录呢?就是 777-002 = 775 !也正确!
[root@vbird test]# umask 003

[root@vbird test]# touch test3

[root@vbird test]# mkdir test4

[root@vbird test]# ll

-rw-rw-r-- 1 root root 0 Oct 22 00:03 test3

drwxrwxr-- 2 root root 4096 Oct 22 00:03 test4/

嘿!属性又跟刚刚的不一样啰!仔细推敲一下为什么呦!test3 666-003 =663,这是怎么一回事?! 663 应该是 -rw-rw--wx 才对啊!怎么会是上面的属性!呵呵!这里就要特别的给他强调了!『尽量不要以数字相加减啦!』容易造成类似上面的问题!你应该要这样想(-rw-rw-rw-)
- (--------wx)=-rw-rw-r--这样就对啦!了解了吗?不要用十进制的数字喔!够能力的话,用二进制来算,不晓得的话,用 rwx 来算喔! ^_^

 

由上面的例子您应该很轻易的就可以发现 umask 的用途!而这个 umask 可以在 /etc/bashrc 里面进行修改喔!预设的情况之下, root 的 umask 为 022 而一般使用者则为 002 ,因为可写的权限蛮严重的,因此预设都会拿掉这个权限!此外,因为 root 比较重要!所以为了安全的需求,其同群组的写入属性就被拿掉了!这东西对于安全性也有一定程度的贡献呦!

chattr

语法:
[root @test /root ]# chattr [+-=][ASacdistu] [档案或目录名称]

参数说明:

+-= :分别为 [+ 增加] [- 减少] [= 设定] 属性的意思

A  :当设定了 A 这个属性时,这个档案(或目录)的存取时间 atime (access) 将不可被修改,

    可避免例如手提式计算机容易有磁盘 I/O 错误的情况发生!

S  :这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中!可以有效的避免数据流失!

a  :当设定 a 之后,这个档案将只能增加数据,而不能删除,只有 root 才能设定这个属性。

c  :这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩出来!

    但是在储存的时候,将会先进行压缩之后再储存(看来对于大档案似乎蛮有用的!)

d  :当 dump (备份)程序被执行的时候,设定 d 属性将可使该档案(或目录)具有 dump 功效!

i  :这个 i 可就很厉害了!他可以让一个档案『不能被删除、改名、设定连结也无法写入或新增数据!』

    对于系统安全性有相当大的帮助!

j  :当使用 ext3 这个档案系统格式时,设定 j 属性将会使档案在写入时先记录在 journal 中!

    但是当 filesystem 设定参数为 data=journalled 时,由于已经设定了日志了,所以这个属性无效!

s  :当档案设定了 s 参数时,他将会被完全的移除出这个硬盘空间。

u  :与 s 相反的,当使用 u 来设定档案时,则数据内容其实还存在磁盘中,可以使用来 undeletion.

范例:

[root @test /root]# chattr +i /etc/shadow<==呵呵!如此则无法更动这个档案啰!

[root @test /root]# chattr -i /etc/shadow <==解除该属性!
说明:

这这个指令是重要的,尤其是在系统的安全性上面!由于这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 这个属性了,因为他可以让一个档案无法被更动,对于需要强烈的系统安全的人来说,真是相当的重要的!里头还有相当多的属性是需要 root 才能设定的呢!此外,如果是 log file 这种的登录档,就更需要
+a 这个可以增加,但不会被杀掉的参数了!怎样?很棒吧!未来提到登录档的认知时,我们再来聊一聊如何设定他吧!

lsattr

语法:
[root @test /root ]# lsattr [-aR]

参数说明:

-a :将隐藏文件的属性也秀出来;

-R :连同子目录的数据也一并列出来!

范例:

[root @test /root]# chattr +i .bash_logout

[root @test /root]# lsattr -a

-------------- ./.

-------------- ./..

---i---------- ./.bash_logout

-------------- ./.bash_profile

-------------- ./.bashrc

-------------- ./.emacs

-------------- ./.screenrc
说明:

这两个指令在使用上必须要特别小心,例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录档案给他设定成为具有 i 的属性,那么过了若干天之后,你突然要新增使用者,却一直无法新增!别怀疑,赶快去将 i 的属性拿掉吧!

搜寻档案或目录

档案的搜寻可就厉害了!因为我们常常需要知道那个档案放在哪里,所以来谈一谈怎么搜寻吧!在 Linux 底下也有相当优异的搜寻系统呦!通常 find 不很常用的!因为速度慢之外,也很操硬盘!通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以
find 来搜寻呦!为什么呢?因为 whereis 与 locate 是利用数据库来搜寻数据,所以相当的快速,而且并没有实际的搜寻硬盘,比较省时间啦!

which 查看可执行档案的位置

whereis 查看档案的位置

locate 配合数据库查看档案位置

find 实际搜寻硬盘去查询文件名称

which

语法:
[root @test /root ]# which [文件名称]

参数说明:

范例:

[root @test /root]# which passwd

/usr/bin/passwd
说明:

which 的基本功能是『藉由 PATH 这个环境变量的内容,去该路径内寻找可执行文件』,所以基本的功能在于『寻找执行档』啰!

 

whereis

语法:
[root @test /root ]# whereis [-bmsu] [目录名称]

参数说明:

-b :只找 binary 的档案

-m :只找在说明文件 manual 路径下的档案

-s :只找 source 来源档案

-u :没有说明档的档案!

范例:

[root @test /root]# whereis passwd

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.bz2

将 passwd 相关字眼的档案或目录都列出来!
[root @test /root]# whereis -b passwd

passwd: /usr/bin/passwd /etc/passwd

仅列出binary 档案!

[root @test /root]# whereis -m passwd

passwd: /usr/share/man/man1/passwd.1.bz2

仅搜寻 man page 所在的目录!

说明:

如果使用 find 太麻烦,而且时间花用的很大!(因为如果你的硬盘比较老旧的话,嘿嘿!有的等的!)这个时候 whereis 就相当的好用了!另外, whereis 可以加入参数来找寻相关的资料,例如如果你是要找可执行档( binary )那么加上 -b 就可以啦!例如上面的范例针对 passwd 这支程序来说明!如果不加任何参数的话,那么就将所有的数据列出来啰!那么 whereis 到底是使用什么咚咚呢?为何搜寻的速度会比 find 快这么多?!其实那也没有什么!这是因为 Linux 系统会将系统内的所有档案都记录在一个数据库档案里面,而当使用
whereis 或者是底下要说的 locate 时,都会以此数据库档案的内容为准,因此,有的时后你还会发现使用这两个执行档时,会找到已经被杀掉的档案!这就是因为他是一个『数据库』档案呀!另外,基本上 Linux 每天会针对 Linux 主机进行 updatedb (就是那一个数据库档案啰!)的动作,你可以在 /etc/cron.weekly/slocate.cron 这个档案找到相关的机制呦!当然,也可以直接使用 /usr/bin/updatedb 来更新数据库档案呢!

 

locate

语法:
[root @test /root ]# locate [目录名称]

参数说明:

范例:

[root @test /root]# locate root

……一大堆跟 root 有关字眼的档案都出来了 @_@
[root @test /root]# updatedb <==立刻更新数据库

说明:

locate 的使用方式就更简单了!直接键入你要找的档名即可!但是,这个东西还是有使用上的限制呦!为什么呢?您会发现使用 locate 来寻找数据的时候特别的快,这是因为 locate 寻找的数据是由『已建立的数据库 /var/lib/slocate』里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速啰!那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的建立预设是在每个礼拜执行一次,所以当您新建立起来的档案,却还在数据库更新之前搜寻该档案,那么 locate 会告诉您『找不到!』呵呵!因为必须要更新数据库呀!

 

那么我到底要建立哪些数据库呢?是否全部都要建立?似乎不需要,这个时候,你可以自己选择需要建立档案数据库的目录呢!在 /etc/updatedb.conf 这个内即可设定了!

 
[root @test root]# more /etc/updatedb.conf

## Linux-Mandrake configuration.

# 由何处开始查询数据,当然是由根目录啦!所以填入 / 即可

FROM="/"
# 哪些目录不想要建立档案搜寻数据,呵呵!就是那些不要的数据嘛!

# 忘记的话,记得回上一章去看看内容,就知道为何如此设定了!

PRUNEPATHS="/proc,/tmp,/var/tmp,/usr/tmp,/net,/afs,/mnt"

# 安全等级

# 0 代表关闭安全检验,速度上面较快速,但较不安全;

# 1 启动安全简易,这是系统的默认值;

SECURITY="1"

# 查询的时候是否要由屏幕输出?当然不要,否则多麻烦?

VERBOSE="NO"

# 数据库所在处!这是默认值,不要随意移动,否则会找不到!

DATABASE="/var/lib/slocate/slocate.db"

# 哪些档案系统我们也不搜寻建立?就是光盘啦、非 Linux 的档案格式啦,

# 我们都不要进行搜寻信息的建立啦!

PRUNEFS="nfs,smbfs,ncpfs,proc,devpts,supermount,vfat,iso9660,udf,usbdevfs,devfs"

 

find

语法:
[root @test /root ]# find [路径] [参数]

参数说明:

1. 时间:

-atime n :在 n*24 小时内被 access 即存取过的档案列出来!

-ctime n :在 n*24 小时内被 changed 即改变、新增的档案或目录印出

-mtime n :在 n*24 小时内被 modified 即修改过的档案印出

-newer file :比 file 还要新的档案就列出来!

2. 使用名称:

-gid n :寻找 群组 ID 为 n 的档案

-group name :寻找群组名称为 name 的档案

-uid n :寻找拥有者 ID 为 n 的档案

-user name :寻找使用者名称为 name 的档案

-name file :寻找档名为 file 的文件名称(可以使用万用字符)

-type type :寻找档案属性为 type 的档案,type 包含了 b, c, d, p, l, s,

这些与前一章的属性相同!例如 l 为 Link 而 d 为路径之意!

范例:

[root @test /root]# find / -name testing <==寻找档名为 testing

[root @test /root]# find / -name 'test*' <==寻找档名包含 test 的!

[root @test /root]# find . -ctime 1 <==寻找目前目录下一天内新增的目录或档案

[root @test /root]# find /home/test -newer .bashrc <==寻找 /home/test 目录下比 .bashrc 还要新的档案

[root @test /root]# find /home -user test <==寻找 /home 底下拥有者为 test 的档案

[root @test /root]# find /dev -type b <==寻找 /dev 这个目录下,档案属性为 b 的档案
说明:

如果你要寻找一个档案的话,那么使用 find 会是一个不错的主意!他可以根据不同的参数来给予档案的搜寻功能!例如你要寻找一个档名为 httpd.conf 的档案,你知道他应该是在 /etc 底下,那么就可以使用『 find /etc -name httpd.conf 』噜!那如果你记得有一个档案档名包含了 httpd ,但是不知道全名怎办?!呵呵,就用万用字符 * 吧,如上以:『 find
/etc -name '*httpd*' 』就可将档名含有 httpd 的档案都列出来啰!不过,由于 find 在寻找数据的时后相当的耗硬盘!所以没事情不要使用 find 啦!有更棒的指令可以取代呦!那就是 whereislocate 啰!!

SetUID, SetGID, Sticky bit 与 file 指令

SUID 与 SGID:

其实,说到这里之前,应该先说明一下 UID (user ID)与 GID (Groupt ID)的!基本上, Linux 认得的账号只是一堆数字而已!而由于我们每个档案中同时含有『使用者』与『使用者群组』的属性,因此,就有所谓的 UID 与 GID 啰! UID 代表我们的使用者『代号』而 GID 则是群组的『代号』。你可以使用『 more /etc/passwd 』这个指令来看一下你的系统当中的所有账号,然后你会注意到每行的第三、四个字段(以 : 分隔)为数字,那个就是
UID 与 GID 了,您更会注意到的是, root 的 UID 与 GID 都是 0 !因此,当你建立了一个账号,而你将该账号的 UID 与 GID 都改为零,呵呵!那个账号的使用者就具有 root 的身份啰!

 

那么什么是 SUID 与 SGID 呢?!在说明之前我们先来以一般身份使用者 ( 还记得安装的时候曾经增加一个 test 账号的一般身份使用者吗?对啦!用他!然后呢?直接在键盘上按下 [Alt] + [Ctrl] + [F2] 到第二个终端机呀!) test 的身份登入,再来看一个档案的内容:

 
[test@test test]$ ls -l /usr/bin/passwd

-r-s--x--x 1 root root 13476 Aug 7 2001 /usr/bin/passwd
 

看到了 /usr/bin/passwd 档案的前面属性了吗?怎么会有 s 的属性在原本的 x 呀!?那个就是所谓的 SUID 了!如果是『 -r-xr-s--x 』时,那么 s 就成为所谓的 SGID 了!

 

当一个档案具有 SUID 的时候,同时 other 的群组具有可执行的权限,那么当 others 群组执行该程序的时候, other 将拥有该档案的 owner 的权限!』。
  
[test@test test]$ ls -l /usr/bin/passwd /etc/shadow

-r-s--x--x 1 root root 13476 Aug 7 2001 /usr/bin/passwd

-rw------- 1 root root 2423 Jun 25 14:29 /etc/shadow
 

我们以账号的密码文件来说明好了!注意上面的范例啰!可以看到的是, /etc/shadow 的权限是『只有 root 才能存取』呦!那么你会不会觉得很奇怪?明明我的一般使用者可以自己修改密码呀!对不对?那么修改密码一定跟 /etc/shadow 这个档案有关,那么怎么回事呀!?使用者是如何修改
/etc/shadow 这个档案的呢?嗯!没错!就是使用 SUID 的功能啦!上面的例子说明了, /usr/bin/passwd 这个档案具有 SUID 的属性,那么当使用者使用 /usr/bin/passwd 这个执行档时,在执行 pass word 修改的期间就具有 /usr/bin/passwd 这个档案的拥有者 root 的所属权限啰!所以,所以当一般使用者执行 passwd 的时候,将具有 root 的权限,所以他们也可以更改 /etc/shadow 的内容啰!那么由此也可以知道,由于这个 Set
UID ( SUID ) 的主要功能是在『某个档案执行的期间具有档案拥有者的权限』,因此, s 就是替代上面提到的 x 这个可执行的位置啰!那万一该档案并没有 x 的属性呢?哈哈!问的好!那么该档案的属性就会将小写的 s 变成大写的 S 啦! ( 这里即使暂时不了解也没有关系,等到过一阵子再回来看一看,你就会了解啦! )

 

不过,由此也知道 SUID 与 SGID 的问题所在,没错!就是太不安全了!如果你有一个档案具有 root 的权限,那么当开启了 SUID 的时候,嘿嘿!够你瞧的了!!因此上,在变更一个档案成为具有 SUID 或 SGID 的情况时,必须要特别小心呢!知道乎!?

 
Sticky bit:

OK!接着下来,我们要来看一下,既然有 SUID 与 SGID ,那么为什么没有在最末位出现 s 取代 x 呢?呵呵!这当然没有必要啦!因为那是属于 others 的权限,你的档案如果是任何人皆可执行的话,那么本来他们就具有权限啦!干嘛还要设定 s 的属性!?不过,这里却真的有另一个属性出现了,那就是 Sticky bit 的属性 ( t ) !这个属性的最大用处在于『具有
sticky bit 属性的该”目录”下的档案,其档案或目录只有档案拥有者及 root 才有权力删除!
』这样是否可以了解了呢?嘿嘿!没错!在我们系统里面本来就预设有一个啦!那就是 /tmp 这个目录!

  
[test@test test]$ ls -l /

drwxrwxrwt 2 root root 4096 Jul 18 13:08 tmp
 

如何,发现了吧!虽然该目录具有所有人皆可擦写的权限,但是确有一个 t 出现了,那就是所谓的 sticky bit 啰!在该目录里面虽然你可以建立与修改任何档案,但是却仅能删除自己建立的档案呢!除非你是 root !你可以这样试试看啰:

 

1. 以 root 登入系统,并且进入 /tmp 当中;

2. touch test,并且更改 test 权限成为 777 ;

3. 以一般使用者登入,并进入 /tmp;

4. 尝试删除 test 这个档案!
 

如何!?发现了吧!!

 
SUID, SGID, Sticky bit 的设定方法:

前面介绍过 SUID 与 SGID 的功能,那么如何开启档案使成为具有 SUID 与 SGID 的权限呢?!这就需要刚刚的数字更改权限的方法了!现在你应该已经知道数字型态个更改权限方式为『三个数字』的组合,那么如果在这三个数字之前再加上一个数字的话,那最前的面数字就代表这几个属性了! ( 注:通常我们使用 chmod xyz filename 的方式来设定 filename
的属性时,则是假设没有 SUID, SGID 及 Sticky bit 啦!
)

 

4 为 SUID
2 为 SGID
1 为 Sticky bit

 

假设要将一个档案属性改为『-rwsr-xr-x』时,由于 s 在使用者权限中,所以是 SUID ,因此,在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来设定!此外,还有大 S 与大 T 的产生喔!参考底下的范例啦!

 
[root@test tmp]# touch test

[root@test tmp]# ll

total 0

-rw-r--r-- 1 root root 0 Feb 6 23:08 test

[root@test tmp]# chmod 4755 test

[root@vbird tmp]# ll

total 0

-rwsr-xr-x 1 root root 0 Feb 6 23:08 test*

[root@test tmp]# chmod 6755 test

[root@test tmp]# ll

total 0

-rwsr-sr-x 1 root root 0 Feb 6 23:08 test*

[root@test tmp]# chmod 1755 test

[root@test tmp]# ll

total 0

-rwxr-xr-t 1 root root 0 Feb 6 23:08 test*

上面的三个例子应该都很好说明啊!就是直接将 x 以 s 或者是 t 来取代就是了!也就是分别为 SUID, SGID 及 sticky bit 的设定方法啦!
[root@test tmp]# chmod 7666 test

[root@test tmp]# ll

total 0

-rwSrwSrwT 1 root root 0 Feb 6 23:08 test

这个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗?因为 s 与 t 都是取代 x 这个参数的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可执行的标志 ( 因为 666 嘛! ),所以,这个 S, T 代表的就是『空的』啦!怎么说? SUID 是表示『该档案在执行的时候,具有档案拥有者的权限』,但是档案拥有者都无法执行了,哪里来的权限给其它人使用?当然就是空的啦!
^_^

 
file

语法:
[root @test /root ]# file [檔名]

参数说明:

范例:

[root @test /root]# file ~/.bashrc

/root/.bashrc: ASCII text <==表示这个档案是 ASCII 纯文字文件
[root @test /root]# file /usr/bin/passwd

/usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped

嘿!还可以看到是否具有 SUID 的权限呢!

说明:

file 这个指令也蛮好用的,可以用来查看这个档案的类型,例如 ASCII 格式档,或者是 binary 的档案等等,还可以用来观看档案是否被加入 SUID 等等的信息!并且,也同时提供了是否有使用动态函式库的信息!相当的好用!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: