Chinaunix首页 | 论坛 | 博客

分类: LINUX

2009-01-11 12:39:36

关于执行档路径的变数: $PATH

经过第六章FHS的说明后,我们知道查阅档案属性的指令ls完整档名为:/bin/ls(这是绝对路径), 那你会不会觉得很奇怪:‘为什么我可以在任何地方执行/bin/ls这个指令呢? ’ 为什么我在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢? 这是因为环境变数 PATH 的帮助所致呀!

当我们在执行一个指令的时候,举例来说‘ls’好了,系统会依照PATH的设定去每个PATH定义的目录下搜寻档名为ls的可执行档, 如果在PATH定义的目录中含有多个档名为ls的可执行档,那么先搜寻到的同名指令先被执行!

现在,请下达‘echo $PATH’来看看到底有哪些目录被定义出来了? echo有‘显示、印出’的意思,而 PATH 前面加的 $ 表示后面接的是变数,所以会显示出目前的 PATH !

范例:先用root的身份列出搜寻的路径为何?
[root@www ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin
:/bin:/usr/sbin:/usr/bin:/root/bin  <==这是同一行!

范例:用vbird的身份列出搜寻的路径为何?
[root@www ~]# su - vbird
[vbird@www ~]# echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/vbird/bin
# 仔细看,一般用户vbird的PATH中,并不包含任何‘sbin’的目录存在喔!

PATH(一定是大写)这个变数的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开, 每个目录是有‘顺序’之分的。仔细看一下上面的输出,你可以发现到无论是root还是vbird都有/bin 这个目录在PATH变数内,所以当然就能够在任何地方执行ls来找到/bin/ls执行档啰!

我们用几个范例来让你瞭解一下,为什么PATH是那么重要的项目!

例题:
请问你能不能使用一般身份使用者下达ifconfig eth0这个指令呢?
答:
如上面的范例所示,当你使用vbird这个帐号执行ifconfig时,会出现‘-bash: ifconfig: command not found’的字样,因为ifconfig的是放置到/sbin底下,而由上表的结果中我们可以发现vbird的PATH并没有设置/sbin,所以预设无法执行。

但是你可以使用‘/sbin/ifconfig eth0’来执行这个指令喔!因为一般用户还是可以使用ifconfig来查询系统IP的参数,既然PATH没有规范到/sbin,那么我们使用‘绝对路径’也可以执行到该指令的!

例题:
假设你是root,如果你将ls由/bin/ls移动成为/root/ls(可用‘mv /bin/ls /root’指令达成),然后你自己本身也在/root目录下,请问(1)你能不能直接输入ls来执行?(2)若不能,你该如何执行ls这个指令?(3)若要直接输入ls即可执行,又该如何进行?
答:
由于这个例题的重点是将某个执行档移动到非正规目录去,所以我们先要进行底下的动作才行:(务必使用root的身份)

[root@www ~]# mv /bin/ls /root
# mv 为移动,可将档案在不同的目录间进行移动作业

(1)接下来不论你在那个目录底下输入任何与ls相关的指令,都没有办法顺利的执行ls了!也就是说,你不能直接输入ls来执行,因为/root这个目录并不在PATH指定的目录中,所以,即使你在/root目录下,也不能够搜寻到ls这个指令!

(2)因为这个ls确实存在于/root底下,并不是被删除了!所以我们可以透过使用绝对路径或者是相对路径直接指定这个执行档档名,底下的两个方法都能够执行ls这个指令:

[root@www ~]# /root/ls  <==直接用绝对路径指定该档名
[root@www ~]# ./ls      <==因为在 /root 目录下,就用./ls来指定

(3)如果想要让root在任何目录均可执行/root底下的ls,那么就将/root加入PATH当中即可。加入的方法很简单,就像底下这样:

[root@www ~]# PATH="$PATH":/root

上面这个作法就能够将/root加入到执行档搜寻路径PATH中了!不相信的话请您自行使用‘echo $PATH’去查看吧!如果确定这个例题进行没有问题了,请将ls搬回/bin底下,不然系统会挂点的!

[root@www ~]# mv /root/ls /bin


例题:
如果我有两个ls指令在不同的目录中,例如/usr/local/bin/ls与/bin/ls那么当我下达 ls 的时候,哪个ls会被执行?
答:
那还用说,就找出 PATH 里面哪个目录先被查询,则那个目录下的指令就会被先执行了!

例题:
为什么PATH搜寻的目录不加入本目录(.)?加入本目录的搜寻不是也不错?
答:
如果在PATH中加入本目录(.)后,确实我们就能够在指令所在目录进行指令的执行了。但是由于你的工作目录并非固定(常常会使用cd来切换到不同的目录),因此能够执行的指令会有变动(因为每个目录底下的可执行档都不相同嘛!),这对使用者来说并非好事。

另外,如果有个坏心使用者在/tmp底下做了一个指令,因为/tmp是大家都能够写入的环境,所以他当然可以这样做。假设该指令可能会窃取使用者的一些资料,如果你使用root的身份来执行这个指令,那不是很糟糕?如果这个指令的名称又是经常会被用到的ls时,那‘中标’的机率就更高了!

所以,为了安全起见,不建议将‘.’加入PATH的搜寻目录中。

而由上面的几个例题我们也可以知道几件事情:

    * 不同身份使用者预设的PATH不同,预设能够随意执行的指令也不同(如root与vbird);
    * PATH是可以修改的,所以一般使用者还是可以透过修改PATH来执行某些位于/sbin或/usr/sbin下的指令来查询;
    * 使用绝对路径或相对路径直接指定某个指令的档名来执行,会比搜寻PATH来的正确;
    * 指令应该要放置到正确的目录下,执行才会比较方便;
    * 本目录(.)最好不要放到PATH当中。

对于PATH更详细的‘变数’说明,我们会在第三篇的bash shell中详细说明的!

阅读(2177) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~