『 cd /etc 』这个情况,这也就是所谓的『绝对路径』,他是从根目录连续写上来的一个情况,所以不论你在哪一个路径现执行这一个指令,都会将你移动到该路径下。那如果我是使用『 cd etc 』呢?那表示你要切换到『目前这个目录下的 etc 目录中』,情况可是不一样的呦!通常第一次接触 Linux 的使用者常会搞错这一个路径的观念!
. 代表此层目录 .. 代表上层目录 ~ 代表自己的家目录 ~user 代表到 user 这个人的家目录
底下我们要来谈一谈目录与路径的几个常用的指令:
cd 变换目录
pwd 显示目前的目录
mkdir 建立一个新目录
rmdir 删除一个里面是空的空目录
cd 与 pwd 这两个指令主要是在『变换目前目录』与『显示目前所在目录』的工作,底下说一说他们的用途与语法吧!
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 是 change directory 的缩写,这是用来变换工作路径的指令。注意,路径与 cd 指令之间存在一个空格!一登入 Linux 系统后,root 会在 root 的家目录,亦即 /root 下,至于使用者会在预设的 /home/username 底下,例如鸟哥的 ID 为 vbird ,则以 vbird 的身份登入后,会到 /home/vbird 这个路径下。OK!那回到上一层可以用『 cd .. 』而到相对路径可到『 cd ../bird』,至于绝对路径则是 cd /usr/sbin !注意喔,在前面的提示字符会改变路径名称!此外,家目录还有一个代码,那就是『 ~ 』符号!例如上面的例子可以发现,使用『 cd ~ 』可以回到个人的家目录里头去呢!此外,如果你的 Linux 主机当中有个 testing 的账号,你要到他的家目录去,可以下达『 cd ~testing』立刻去到 testing 的家目录啰!
如果我有两个 ls 档案在不同的目录中,例如 /usr/local/bin/ls 底下与 /bin/ls 那么当我下达 ls 的时候,那个 ls 会被执行?那还用说,就找出 PATH 里面那个目录先被查询,则那个目录下的档案就会被先执行了!
咦!既然如此的话,那么为何不要在 PATH 里面加入 . 这个目录,如此一来的话,不就可以直接在所在目录执行档案了吗?因为 . 代表所在目录嘛!是这样没错!但是有没有想过,如果某天,某个怪怪的使用者在 /tmp 里面写了一个 ls 的档案,偏偏他是有害的档案,那么当你在 /tmp 底下执行 ls 时,怎么办?!没错,可能会『中标』,所以啰,为了安全起见,不建议将『 . 』加入 PATH 的搜寻当中!
档案与目录管理:
谈了谈目录与路径之后,再来讨论一下关于档案的一些基本管理吧!档案与目录的管理上,不外乎『显示属性』、『拷贝』、『删除档案』及『移动档案或目录』等等,由于档案与目录的管理在 Linux 当中是很重要的!尤其是每个人自己家目录的数据也都需要注意管理!由于我们在执行程序的时后,系统预设有一个搜寻的路径顺序,如果有两个以上相同档名的执行档分别在不同的路径时,呵呵,就需要特别留意啰!这里我们来谈一谈有关档案与目录的一些基础管理部分吧!
ls 显示文件名称、属性等 cp 拷贝档案或目录 rm 删除档案或目录 mv 移动档案或目录
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
说明: 还记得我们在解释档案的一些属性与目录的结构的那一章吗?!对啦!我们使用的第一支指令就是 ls 啦!通常我们都需要知道这个文件名称『目录』还是『档案』?所以,我都喜欢使用『 ll』这个指令,其实那就是ls -l的意思啦!不论如何,你都可以尝试着执行这之指令来视察你的档案!
请注意呦!不要忘记你的资料的主要咚咚!尤其是前面几个主要的属性呦!另外,你有没有发现如果在远程以 telnet 或者是 putty 的联机程序登入主机的时后,由于 Linux 预设使用有颜色的方式显示方式,但是像上表一样,蓝色的字样根本就是很难看到!这个时候通常我都是使用『ls --color=never 』来丢掉颜色!那如果想让 ls 预设没有颜色的话,可以在 /root/.bashrc 或者是你的家目录的 .bashrc 这个档案中加入下面这一行:
alias ls=‘ls --color=never‘
这样就可以把颜色去到了!至于 alias 是在干嘛的?我们到了 bash 这个 shell 的时候再来谈吧!
刚刚我们提到的都只是在于显示档案的外观,或者是移动与复制一个档案或目录而已,那么如果我们要视察一个档案的内容时,该如何是好呢?!这里有相当多有趣的指令可以来分享一下:最常使用的显示档案内容的指令可以说是 cat 与 more 及 less 了!此外,如果我们要查看一个很大型的档案(好几百MB时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外, tac 这个指令也可以达到!好了,说说各个指令的用途吧!
cat 由第一行开始显示档案内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写! more 一页一页的显示档案内容 less 与 more 类似,但是比 more 更好的是,他可以往前翻页! head 只看头几行 tail 只看尾巴几行 nl 显示的时候,顺道输出 行号! od 以二进制的方式读取档案内容!
# 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 and functions 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$ Now, I will eat my food^M$ are you ^Ifinished your work^M$ what do you 123 goto where^M$ 显示出 DOS 档案的几个特殊符号,以上面档案为例, 可发现 ^M 为断行符号,而每行的 $ 为行尾符号, 至于 ^I 则是 <tab> 按键啦!
说明: 嘿嘿! Linux 里面有『猫』?!喔!不是的, cat 是 Concatenate (连续)的简写,主要的功能是将一个档案的内容连续的印出在屏幕上面!例如上面的例子中,我们将重要的参数档 .bashrc 印出来!如果加上 -n 的话,则每一行前面还会加上行号呦!cat 比较少用!毕竟当你的档案内容的行数超过 40 行以上,嘿嘿!根本来不及看!所以,配合 more 或者是 |more 来执行比较好!此外,如果是一般的 DOS 档案时,就需要特别留意一些奇奇怪怪的符号了,例如断行与<tab>等,要显示出来,就得加入 -A 之类的参数了!。
tac 语法:
[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
说明: 好了,那么如果有一个非 ASCII 的数据文件呢?例如那个 binary 的档案!使用 vi 根本就是看不着~这个时候看来只有使用将整个数据以数值方法读出来啦!那就是 od 这个指令来读出来呦!这个东西可以用来输出该数据为十进制、16进位等等的数据格式!不过这个东西对于工程师可能比较有用啦!因为印出来的东西都是数字或内存当中的数据~~
连结档的介绍:
在开始介绍介绍连结档 ( Link ) 之前,我们得先来了解一下什么是 inode 这个东西?说实在的,这个东西真的很重要,不了解他的时候,很容易搞错很多的咚咚!
ln OK!知道了什么是 inode 与他的功能之后,接着下来就要来介绍 link 这个玩意儿了!说到 link 其实也没有什么大不了的,说穿了,就真的有点像是 Windows 的『快捷方式』一样,不过, link 的功能要好的多呦! Link 又分为 hard link 与 symbolic link 两种方式,分别来谈一谈:
Hard Links: 刚刚说过,当系统要读取某一个档案的时候,就会先去读 inode table ,然后再根据 inode 的信息到 block area 去将数据取出来利用!而 hard link 就是直接再建立一个 inode 连结到档案放置的 block 区块。也就是说,进行 hard link 的时候,实际上,你的档案内容不会改变,只是你在查询的时候,利用原来的 inode 与后来的 inode 均可被指定到该档案放置的地点,因此两个档案的内容会是一样的!所以读取任何一个 inode 的结果都是存取在同一个档案的内容就是了。不过,这样一来就有个问题啦,因为 inode 是会连结到 block 区域去的,而『目录』本身仅消耗 inode 而已,那么一来的话, hard link 不就不能 link 目录啦?对的!没错! Hard link 有两个最大的限制:
Symbolic Links: 相对于 hard link , Symbolic link 可就好理解多了,基本上,他就是在建立一个独立的档案,而这个档案会让数据读取指向他 link 的那个档案内容!由于只是利用档案来做为指向的动作,所以,当来源档被删除之后,symbolic link 的档案会『开不了』,会一直说『无法开启某档案!』
所以,看样子,似乎 hard link 比较安全,因为即使某一个 inode 被杀掉了,只要有任何一个 inode 存在,那么该档案就不会不见!不过,不幸的是,由于 Hard Link 的限制太多了,包括无法做『目录』的 link ,所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方向较广喔!好了,说的天花乱坠,看您也差不多快要昏倒了!没关系,实作一下就知道怎么回事了! 特别留意,底下的案例中,我们是将系统的设定文件 copy 到 /root/test 底下进行测试用的,请不要在 /etc/ 底下做,未来我们的工作目录都会在 /root/test 底下进行,这有个好处,是可以让您清楚的知道,这是用来 test 用的啦!
语法:
[root @test /root ]# ln [-s] [来源档] [目的档] 参数说明: -s :提供连结档的连结!如果直接以 ln 不加任何参数的话,那么就属于 hard link 啰! 范例: [root @test /root]# mkdir test [root @test /root]# cd test [root @test /test]# cp /usr/bin/passwd .
1. Hard Link 信息: [root @test /test]# ln passwd passwd-hard [root @test /test]# ll total 32 -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd-hard 注意看,上面那个数字变成 2 啰!这就是占用掉 inodes 啰! [root @test /test]# du -k 20 <==注意看,容量并没有变大!因为是 link 档案呀!
2. Symbolic Link 信息: [root @test /test]# ln -s passwd passwd-soft; ll -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd -rw-r--r-- 2 root root 13476 Jun 26 11:31 passwd-hard lrwxrwxrwx 1 root root 6 Jun 26 11:37 passwd-sofe -> passwd 注意啰!该 Symbolic Link 的档案是有容量的呦! 注意啰, passwd-soft 会指到另外一个档案去,而且,最前面属性显示 l , 此外,他是一个独立的档案!先杀掉 passwd 后,我们分别 more 一下内容:
3. 用 more 来试试看是怎样?! [root @test test]# rm passwd rm: remove regular file `passwd‘? y [root @test test]# more passwd-hard ………(正常显示) [root @test test]# more passwd-soft passwd-soft: No such file or directory
说明: 要注意啰!如果不加任何参数的话,那么就是 Hard Link 啰!如同上面的情况,增加了 hard link 之后,可以发现 link 那一栏属性增加了!而如果这个时候砍掉 passwd 会发生什么事情呢?呵呵! passwd-hard 的内容还是会跟原来 passwd 相同,但是 passwd-soft 就会找不到该档案啦!就是这样!了解了吗?!还有,跟 cp 也不一样呦!因为虽然 Hard Link 的档案看起来是有容量的,但是基本上还是指向原来的档案,所以啰,整体容量是没有增大的啦!
而如果使用 -s 的参数时,就做成差不多是 Windows 底下的『快捷方式』的意思(Symbolic Link,较常用!)不过,需要特别注意的是, Linux 的 link 与 Windows 的快捷方式是不一样的东西!举个例子说,当你在 Windows 建立一个快捷方式时,你可以在这个快捷方式内修改任何数据,而你的原始数据并不会跟着变!不过,当你修改 Linux 下的 link 档案时,则更动的其实是『原始档』,呵呵,所以不论你的这个原始档被连结到哪里去,只要你修改了连结档,呵呵!原始档就跟着变啰!以上面为例,由于你使用 -s 的参数建立一个名为 passwd-soft 的档案,则你修改 passwd-soft 时,其内容与 passwd 完全相同,并且,当你按下储存之后,被改变的将是 passwd 这个档案!
记得档案有『拥有人』及『拥有群组』吧,这个 chown 就是在改变拥有者的指令。刚接触 Linux 的朋友最容易犯的一个错误在哪里呢?就是以 root 的身份 copy 一个档案(或路径)给一般使用者(假设为 test )时,忘记将该档案的所有人改成 test 了!由于复制者是 root 所以该档案也会是 root 所有!那么 test 当然也就不能修改该档案了!
在上面的例子中,『 chown test /home/test/testing 』这个指令只会将该目录变成 test 的,但是 group 仍然是 root 的呦!所以你可以使用『 chown test:test /home/test/testing 』,连使用者群组都给他改变一下啰!不过需要注意的是,这两个指令都只改变了『目录』的所有权而已!那么在这个目录下的东西也要改变的话,该如何?!呵呵,就使用 -R 这个参数即可!
[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 这个目录!
假设要将一个档案属性改为『-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 是表示『该档案在执行的时候,具有档案拥有者的权限』,但是档案拥有者都无法执行了,哪里来的权限给其它人使用?当然就是空的啦! ^_^