一.目录与路径
绝对路径:路径的写法[一定由根目录 / 写起],例如: /usr/share/doc 这个目录。
相对路径:路径的写法[不是由 / 写起],例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成:[cd ../man] 这就是相对路径的写法啦!
. 代表此层目录
.. 代表上层目录
~ 代表自己的家目录
~user 代表到 user 这个人的家目录
2. cd [改变工作路径]
语法:
[root @test /root ]# cd [相对路径或绝对路径]
参数说明:
路径有『相对路径』与『绝对路径』的分别,请千万小心啰!
范例:
[root @test /root]# cd.. 回到上一层目录
[root @test /root]# cd ../home 相对路径的写法
[root @test /root]# cd /var/www/html 绝对路径的写法
[root @test /etc]# cd 回到使用者的家目录
[root @test /etc]# cd~ 回到使用者的家目录!
[root @test /etc]# cd~test 回到 test 这个使用者的家目录
说明:
注意,路径与 cd 指令之间存在一个空格!一登入 Linux 系统后,root 会在 root 的家目录,亦即 /root 下,至于使用者会在预设的/home/username 底下。
3. pwd [显示目前所在目录]
语法:
[root @test /root ]# pwd
范例:
[root @test root]# cd /home/test
[root @test test]# pwd
/home/test <==显示目前你所在的目录呦!
说明:
pwd 是 print working directory 的缩写,也就是显示目前所在目录的指令,例如在上个表格最后的目录是 /home/test 这个目录,但是提示字符仅显示 test ,如果你想要知道目前所在的目录,可以输入 pwd 即可。
此外,由于很多的套件所使用的目录名称都相同,例如 /usr/local/etc 还有 /etc ,但是通常 Linux 仅列出最后面那一个目录而已,这个时候你就可以使用 pwd 来知道你的所在目录啰!免得搞错目录,结果……
4. 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/
说明:
如果想要建立新的目录的话,那么就使用 mkdir 吧! 不过,请注意呦!在预设的情况下,你所需要的目录得一层一层的建立才行!例如:假如你要建立一个目录为 /home/bird/testing/test1,那么首先必须要有/home 然后 /home/bird ,再来 /home/bird/testing 都必须要存在,才可以建立test1 这个目录!假如没有 /home/bird/testing 时,就没有办法建立test1 的目录啰!不过,现在有个更简单有效的方法啦!那就是加上 -p 这个参数喔!你可以直接下达:[ mkdir -p/home/bird/testing] 则系统会自动的帮你将 /home, /home/bird, /home/bird/testing 依序的建立起目录!并且,如果该目录本来就已经存在时,系统也不会显示错误讯息喔!
5. rmdir [删除旧的目录]
语法:
[root @test /root ]# rmdir [-p] [目录名称]
参数说明:
-p :将上层的目录也删除吧!
范例:
[root @test /root]# rmdir test <==删除名称为 test 的目录
[root @test tmp]# ll
drwxrwxr-x 3 test test 4096Feb 6 20:48 test1/
[root @test tmp]# rmdir test1
rmdir: `test1': Directory not empty
[root @test tmp]# rmdir -ptest1/test2/test3/test4
[root @test tmp]$ ll
说明:
如果想要建立删除旧的目录时,就使用 rmdir 吧!例如将刚刚建立的 test 删除,使用 rmdir test 即可!请注意呦!目录需要一层一层的删除才行!而且被删除的目录里面必定不能还有其它的目录或文档!那如果要将所有目录下的东西都删除呢?!这个时候就必须使用 rm -rf test 啰!不过,还是使用 rmdir 比较不危险!不过,你也可以尝试以-p 的参数加入,来删除上层的目录喔!
6. 环境变量 PATH在提过了绝对路径、相对路径与指令的下达方式之后,您应该会稍微注意到一件事情,那就是: [为什么我可以在 /root 底下执行 /bin/ls 这个文档呢?]对呀!为什么我可以直接执行 ls 就一定可以显示出一些讯息而不会说找不到该档案呢?这是因为环境变量 PATH 的帮助所致呀! 当我们在执行一个指令的时候,系统会依照 PATH 的设定去每个 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
注意到了吗?对啦! /bin 在 PATH 的设定之中,所以自然就可以找的到 ls 啦!
如果你将 ls 移动到 /root 底下的话,然后你自己本身也在 /root 底下,但是当你执行 ls 的时候,他就是不理你?怎么办?这是因为 PATH 没有 /root 这个目录,而你又将 ls 移动到 /root 底下了,自然系统就找不到可执行文件了,因此就会告诉你, command not found !那么该怎么克服这种问题呢?有两个方法,其一:直接将 /root 的路径加入 PATH 当中!
如何增加?可以使用:PATH=”$PATH”:/root
这种方式来增加即可!另一种方式则是使用完整档名,亦即直接使用相对或绝对路径来执行,例如:
/root/ls
./ls
因为在同一个目录中,而我们又知道在同一个目录中的目录符号为 [ . ],因此,就以上面的 ./ls 来执行也可以!这种执行方式以后您应该会很常见到才对!
如果我有两个 ls 档案在不同的目录中,例如 /usr/local/bin/ls 底下与 /bin/ls 那么当我下达 ls 的时候,那个 ls 会被执行?那还用说,就找出 PATH 里面那个目录先被查询,则那个目录下的档案就会被先执行了!
咦!既然如此的话,那么为何不要在 PATH 里面加入 . 这个目录,如此一来的话,不就可以直接在所在目录执行档案了吗?因为 . 代表所在目录嘛!是这样没错!但是有没有想过,如果某天,某个怪怪的使用者在 /tmp里面写了一个ls 的档案,偏偏他是有害的档案,那么当你在 /tmp 底下执行 ls 时,怎么办?!没错,可能会 [中标],所以啰,为了安全起见,不建议将[ . ]加入 PATH 的搜寻当中!
二. 管理文件和目录
1. ls [查看文件和目录]
语法:
[root @test /root ]# ls [-ailS]
参数说明:
-a :全部的文件都列出,连同隐藏文件(开头为.的文件)
-i :列出 inode 的值
-l :列出长数据串,连同文件大小的数据等等
-S :以文件大小排序
--color=never :不要显示颜色
--color=always :均显示颜色
--color=auto :由系统自行判断!
范例:
[root @test /root]# ls -al
total 48
drwxr-x--- 4 root root 4096 Mar 10 00:37 .
drwxr-xr-x 21 root root 4096 Mar 10 20:16 ..
-rw------- 1 root root 524 Mar 10 00:40 .bash_history
-rw-r--r-- 1 root root 24 Jun 11 2000 .bash_logout
-rw-r--r-- 1 root root 266 Jun 11 2000 .bash_profile
-rw-r--r-- 1 root root 249 Mar 6 20:50 .bashrc
-rw-r--r-- 1 root root 210 Jun 11 2000 .cshrc
drwx------ 2 root root 4096 Mar 9 11:06 .gnupg
-rw------- 1 root root 524 Jan 16 14:37 .mysql_history
drwx------ 2 root root 4096 Mar 9 11:06 .ssh
-rw-r--r-- 1 root root 196 Jul 11 2000 .tcshrc
-rw-r--r-- 1 root root 1126 Aug 24 1995 .Xresources
[root @test /]# ls
bin dev etc lib misc opt root tftpboot usr
boot disk1 home lost+found mnt proc sbin tmp var
[root @test /]# ls --color=never
bin dev etc lib misc opt root tftpboot usr
boot disk1 home lost+found mnt proc sbin tmp var
[root @test /]# ls -al|more
说明:
通常我们都需要知道这个文件名称 [目录] 还是 [文件] ?所以,我都喜欢使用 [ ll ]这个指令,其实那就是ls -l的意思啦!不论如何,你都可以尝试着执行这之指令来视察你的文件!
另外,如果在远程以 telnet 或者是 putty 的联机程序登入主机的时后,由于 Linux 预设使用有颜色的方式显示方式,蓝色的字样根本就是很难看到!这个时候通常我都是使用『ls --color=never 』来丢掉颜色!那如果想让 ls 预设没有颜色的话,可以在 /root/.bashrc或者是你的家目录的.bashrc 这个文件中加入下面这一行:
alias ls='ls--color=never' 这样就可以把颜色去到了!
通常,蓝色显示目录,白色显示普通文件。
2. cp [拷贝文件或目录]
语法:
[root @test /root ]# cp [-drsu] [来源文件] [目的文件]
参数说明:
-d :在进行 copy 的时候,如果是 copy 到 link 文件,
若不加任何参数,则默认情况中会将 link 到的源文件 copy 到目的地,
若加 -d 时,则 link 文件可原封不动的将 link 这个快捷方式其拷贝到目的地!
-r :递归复制,可以进行目录的 copy !
-s :复制成连结文件,而不 copy 之意!与 ln 指令相同功能!
-u :若目标文件比源文件旧,更新目标文件。
-i :若目标文件已存在,覆盖时会询问。
-f :强制复制
范例:
[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 的动作!
3. 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 来循环删除是不错的方式!
4. mv [移动文件与目录,或重命名]
语法:
[root @test /root ]# mv [-fiu] [来源] [目的]
参数说明:
-f :强制直接移动,不会询问
-i :若目标文件已存在,会询问
-u :同样的,为 update 的简写,当来源文件比目的文件还新的时后才会动作!
范例:
[root @test /root]# cp ~/.bashrc bashrc //复制一个文件
[root @test /root]# mkdir mvtest //建立一个目标
[root @test /root]# mv bashrc mvtest //将文件移动到目录
[root @test /root]# mv mvtest mvtest2 //将目录重命名
[root @test /root]# mv bashrc1 bashrc2 mvtest2
//将 bashrc1 与 bashrc2 移动到 mvtest2 这个目录下!请注意,最后一个才是最终的目标,其它的都是 SOURCE
5. basename [取出最后的文件或目录名]
语法:
[root @test /root ]# basename [目录]
范例:
[root @test /root]# basename /usr/local/etc
etc
这个指令会取出[目录]最后面的那个目录或文件的名子,
以上面的例子来看, /usr/local/etc 不论 etc 是目录或文件,
他都会被取出来,因为他是最后一个出现的咚咚!
[root @test /root ]# dirname [目录]
范例:
[root @test /root]# dirname /usr/local/etc
/usr/local
他取出etc前面的部分!
三.查看文件内容:
如果我们要视察文件的内容时,该如何是好呢?!最常使用的显示文件内容的指令可以说是 cat 与 more 及 less 了!此外,如果我们要查看一个很大型的文件(好几百MB时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用tail 呀,此外, tac 这个指令也可以实现!
1. cat [从第一行开始显示文件内容]
语法:
root @test /root ]# cat [-nAE]
参数说明:
-n: 显示行号
-A: 将 <tab> 与换行字符都列出来!
-E: 将结尾的换行字符$显示出来!
范例:
[root @test /root]# cat~/.bashrc <==显示 .bashrc 这个文件
# .bashrc
# User specific aliases and functions
PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias ll='ls -l --color=never'
[root @test /root]# cat~/.bashrc -n <==显示 .bashrc 并且加上行号!
1 # .bashrc
2
3 # User specific aliases andfunctions
4 PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
6 alias rm='rm -i'
7 alias cp='cp -i'
8 alias mv='mv -i'
9 alias ll='ls -l --color=never' [root @test /root]# cat -A regexp.txt
This is a cat, however, I need a dog.^M$
I want to "Happy" and <Happy> and /Happy/ here.^M$
OK! ^Ieverythins is OK^M$
可发现 ^M 为换行符号,而每行的$ 为行尾符号,
至于 ^I 则是<tab> 按键啦!
说明:
cat 是 Concatenate (连续)的简写,主要的功能是将一个文件的内容连续的显示在屏幕上面!cat 比较少用!毕竟当你的文件内容的行数超过40 行以上,根本来不及看!所以,配合 more 或者是 less 一起使用会更好一点!
2. tac [从最后一行开始显示,可以看出 tac 是 cat 的倒着写]
语法:
[root @test /root ]# tac [文件名]
范例:
[root @test /root]# tac ~/.bashrc <==发现了没?反向印出呦!
fi
. /etc/bashrc
if [ -f /etc/bashrc ]; then
# Source global definitions
alias h='history'
alias lm='ls -al|more'
alias ll='ls -l'
# alias ll='ls -l --color=never'
alias mv='mv -i'
alias cp='cp -i'
alias rm='rm -i'
export PATH
PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH"
# User specific aliases and functions
# .bashrc
说明:
cat 与 tac ,有没有发现呀!对啦!tac 刚好是将 cat 反写过来,所以他的功能就跟 cat 相反啦, cat 是由『从一行到最后一行连续显示在屏幕上』,而 tac 则是『从最后一行到第一行反向在屏幕上显示』!
3. more [一页一页的显示文件内容]
语法:
[root @test /root ]# more [文件名]
范例:
[root @test /root]# more ~/.bashrc <==一页一页的显示文件内容
[root @test /]# ls -al | more <==一页一页的将 ls 的内容显示出来
说明:
空格键:向下翻一页。
Enter:向下翻一行。
/字符串:向下搜索"字符串"。
:f:立刻显示文件名以及当前显示的行数。
q:离开more。
4. less与 more 类似,但是比more 更好的是,他可以往前翻页
语法:
[root @test /root ]# less [文件名]
范例:
[root @test /root]# less ~/.bashrc
说明:
空格键:向下翻一页。
/字符串:向下搜索"字符串"。
?字符串:向上搜索"字符串"。
[pagedown]:向下翻动一页。
[pageup]:向上翻动一页。
q:离开less。
less 的用法比起 more 更灵活。在more 的时候,我们并 没有办法向前面翻,只能往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown]等按键的功能来往前往后翻看文件。more 与 less 的用途与用法真的是很广啦!首先,你可以在 more 与less 的画面中进行『搜索』的工作!如何进行呢?我们以 less 来说明好了,如果你想要知道/etc/man.config 这个文件里面有没有一个叫做GER 的大写字眼,那么可以:
[root @test /root ]# less /etc/man.config
按键说明:
/word:在 /etc/man.config 这个文件中搜寻 word 这个字符串的所在
q :离开 less 的画面
然后在输入 / 之后,光标会移动到最左下角等待输入,这个时候您只要输入你的字符串之后,就会自动的帮你找出来该关键词啰!
5. head [只看头几行]
语法:
[root @test /root ]# head [-n number] [文件]
参数说明:
-n :表示显示几行的意思
范例:
[root @test /root]# head ~/.bashrc <==默认,显示头十行
[root @test /root]# head -n 20 ~/.bashrc <==显示头二十行!
说明:
head 的英文意思就是『头』啦,那么这个东西的用法自然就是显示出一个文件的前几行啰!没错!就是这样!若没有加上 -n 这个参数时,默认只显示十行,若只要一行呢?那就加入『 head -n 1 filename』即可!
6. tail [只看尾巴几行]
语法:
[root @test /root ]# tail [-n number] [文件]
参数说明:
-n :显示 number 行
范例:
[root @test /root]# tail ~/.bashrc
[root @test /root]# tail -n 5 ~/.bashrc <==只显示最后面五行!
说明:
那么有 head 自然就有 tail ( 尾巴 ) 啰!没错!这个 tail 的用法跟 head 的用法差不多类似,只是显示的是后面几行就是了! 默认也是显示十行,若要显示非十行,就加 -n number 的参数!
7. nl [显示的时候,顺序输出行号]
语法:
[root @test /root ]# nl [文件]
范例:
[root @test /root]# nl ~/.bashrc
说明:
那么nl 也就是 [可以印出行号] 的指令来查看文件啦!
[root @test /root ]# od [文件]
范例:
[root @test /root]# od ~/.bashrc
0000000 020043 061056 071541 071150 005143 021412 052440 062563
0000020 020162 070163 061545 063151 061551 060440 064554 071541
说明:
好了,那么如果有一个非 ASCII 的数据文件呢?例如那个 binary 的档案!使用 vi 根本就是看不着~这个时候看来只有使用将整个数据以数值方法读出来啦!那就是 od 这个指令来读出来呦!这个东西可以用来输出该数据为十进制、16进位等等的数据格式!不过这个东西对于工程师可能比较有用啦!
四.搜索文件
1. which (搜索“执行文件”)
语法:
[root @test /root ]# which [-a] command
参数说明:
-a : 将所有可找到的命令均列出,而不仅仅列出第一个找到的命令名称
范例:
[root @test /root]# which passwd
/usr/bin/passwd
说明
:which 的基本功能是 [根据 PATH 这个环境变量的内容,去该路径内寻找可执行文件的文件名],重点在于[找出执行文件 ]! 如果执行文件不在环境PATH路径下,是找不出来的。
2.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 所在的目录!
说明
:那么 whereis 到底是使用什么呢?为何搜寻的速度会比 find 快这么多?!其实那也没有什么!这是因为 Linux 系统会将系统内的所有文件都记录在一个数据库文件里面,而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库文件的内容为准,因此,有的时后你还会发现使用这两个执行文件时,会找到已经被删除的文件,而且也找不到刚刚建立的最新文件!这就是因为他是通过 [数据库]中的结果来搜索的呀!另外,基本上 Linux 每天会针对 Linux 主机进行 updatedb (就是那一个数据库档案啰!)的动作。
你可以直接使用 /usr/bin/updatedb 来更新数据库文件呢!
3. locate
语法:
[root @test /root ]# locate [文件的部分名称]
范例:
[root @test /root]# locate root
……一大堆跟 root 有关字眼的文件都出来了 @_@
[root @test /root]# updatedb <==立刻更新数据库
说明
:locate 的使用方式就更简单了!直接键入你要找的文件的部分名称即可!但是,这个东西还是有使用上的限制呦!为什么呢?您会发现使用 locate 来寻找数据的时候特别的快,这是因为 locate 寻找的数据是由 [已建立的数据库 /var/lib/slocate]里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速啰!那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的建立预设是在每个礼拜执行一次,所以当您新建立起来的文件,却还在数据库更新之前搜寻该文件,那么 locate 会告诉您 [找不到!] 呵呵!因为必须要更新数据库!
4.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 的文件
-uid n :寻找拥有者 ID 为 n 的文件
-group name :寻找群组名称为 name 的文件
-user name :寻找使用者名称为 name 的文件
3. 与文件名称及权限有关的参数:
-name file :寻找文件名为 file 的文件名称(可以使用万用字符)
-type TYPE :寻找文件属性为 TYPE 的文件,TYPE 包含了 b, c, d, p, l, s,
范例:
[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 !
五.文件与目录权限:
1. 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 拥有
说明
:刚接触 Linux 的朋友最容易犯的一个错误在哪里呢?就是以 root 的身份 copy 一个文件(或路径)给一般使用者(假设为 test )时,忘记将该文件的所有人改成 test 了!由于复制者是 root 所以该文件也会是 root 所有!那么 test 当然也就不能修改该文件了!
在上面的例子中,[ chown test /home/test/testing ] 这个指令只会将该目录变成 test 的,但是 group 仍然是 root 的呦!所以你可以使用 [chown test:test /home/test/testing ],连使用者群组都给他改变一下啰!不过需要注意的是,这两个指令都只改变了[目录]的所有权而已!那么在这个目录下的东西也要改变的话,该如何?!呵呵,就使用 -R 这个参数即可!
2. chmod (改变文件的rwx属性)
语法:
[root @test /root ]# chmod [-R] [parameter] [目录名称]
参数说明:
-R :循环的一直将该目录的文件均改变!
范例:
[root @test /root]# chmod 777 .bashrc
说明
:一个文件或目录至少有九个属性,三个三个一组,共分为三组!而可以使用数字来当作变换属性的参考依据!各属性如下:
r:4 可读
w:2 可写
x:1 可执行
举个例子来说,当一个属性为『-rwxr-xr--』时,那是几分呢?!我们可以将他看成如下『-[rwx][r-x][r--]』三组,分别是[拥有人权限,群组权限,其它非本组权限],所以分数就变成了『[4+2+1][4+0+1][4+0+0]』共有『754』分啦!
所以,如果你要将 .bashrc 设定成所有人都可以读取的话,就下达『chmod 777 .bashrc 』吧!
3. umask (文件或目录的默认属性)
umask 就是指定『当前用户在建立文件或目录时的属性默认值』,那么如何得知或设定 umask 呢?他的指定条件以底下的方式来指定:
语法:
[root @test root]# umask //查看当前用户的默认权限
0022
[root@vbird test]# umask -S //查看当前用户的默认权限
u=rwx,g=rx,o=rx
[root@vbird test]# umask 002 //设置默认权限
说明
:
umask 指定的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 !
如果以上面的例子来说明的话,因为 umask 为 002 ,所以 user, group 并没有被拿掉属性,不过 others 的属性被拿掉了 2 ( 也就是 w 这个属性 ),那么由于当使用者:
建立文件时:(-rw-rw-rw-) – (--------w-) ==> -rw-rw-r-- 注:(默认文件是没有可执行x权限)
建立目录时:(drwxrwxrwx) – (--------w-) ==> drwxrwxr-x 注:(默认目录权限均开放)
语法:
[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 这个属性了,因为他可以让一个档案无法被更动,对于需要强烈的系统安全的人来说,真是相当的重要的!
5.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 的属性拿掉吧!
五.文件特殊权限:
1. SUID 与 SGID:
[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 的情况时,必须要特别小心呢!
2. 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 这个文件!
如何!?发现了吧!!
3. 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 是表示 [该文件在执行的时候,具有文件拥有者的权限],
但是档案拥有者都无法执行了,哪里来的权限给其它人使用?当然就是空的啦!
4. 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 等等的信息!