分类: LINUX
2009-09-15 20:59:08
首先对系统环境变量PATH 的背景知识做一些简单介绍:
环境变量PATH
是由一连串由冒号隔开的目录名组成,它定义了用户执行的命令在系统中的查找顺序。当你输入一条命令但没有指定绝对路径时(譬如,输入” ls ”
而不是” /bin/ls ” ),你的命令行解释器(shell) 将会按照PATH
中给出的路径顺序依次查找,直到找到和所输入命令名称相同的可执行文件,然后再执行这个文件。PATH 变量一般在用户配置文件$HOME/ .
profile, 或系统环境配置文件/etc/environment 中定义。
在PATH 变量中我们常会用到当前目录“. ”,另外,在PATH 中同样可以用空目录名来代表当前目录,二者是等效的。
对csh 用户,格式如下:
setenv PATH :/usr/ucb:/bin:/usr/bin
setenv PATH . :/usr/ucb:/bin:/usr/bin
对sh 或ksh 用户:
PATH=:/usr/ucb:/bin:/usr/bin;export PATH
PATH= . :/usr/ucb:/bin:/usr/bin;export PATH
在PATH 变量中加入当前目录“. ”会带来很多方便– 要想执行当前目录下的程序a.out ,我们只需要输入“a.out ”而不必输入“. /a.out ”。但这同时也带来了潜在的安全隐患。
我们可以想一想当前目录“. ”处于PATH 的第一位时(就像这样 PATH= . :/usr/ucb:/bin:/usr/bin ),会发生什么问题?
假设你– 系统管理员– 的当前目录是一个所有用户都有写权限的公用目录,如/tmp 。如果恰好有人在这个目录下放了他自己的程序” /tmp/ls ” ,这时你输入” ls ” 并且执行(当然,你的本意是执行” /bin/ls ” 程序,就像通常一样),可你的命令行解释器(shell) 实际执行的却是” ./ls “, 也就是” /tmp/ls “, 一个来路不明的程序!无须赘言,它的后果可能十分严重。如果它是木马程序等恶意软件,你的系统的安全性就已经被破坏了。
所以一个相对好一点的方法是把当前目录“. ”放到PATH 的最后面,就像这样:
PATH=/usr/ucb:/bin:/usr/bin: .
现在你再在/tmp 目录下执行” ls ” ,命令解释器将会依次搜索/usr/ucb,/bin 以及/usr/bin 目录去寻找” ls ” 程序,这一切都发生在搜索当前目录“. ”之前,这样就降低了在无意中执行其他人的” ls ” 程序的风险。但这种方法同样不是百分之百的安全– 如果你是一个笨拙的输入者,有时会把” ls -l ” 错敲成” sl -l “, 那你仍然有运行” ./sl ” 的风险,特别是当前目录还真有一个” sl ” 程序的时候。有些“聪明的”攻击者会估计各种可能的输入错误,用它们来做程序的名字,并把它们放到各个公用目录下,所以要小心哟。
因此很多经验丰富的UNIX 用户在PATH 中根本不加入当前目录“. ”,以避免潜在的安全隐患:
PATH=/usr/ucb:/bin:/usr/bin
对系统管理员来说,这是被强烈推荐的一种做法。虽然这样做,你需要输入” . /program” 来执行当前目录下的程序,稍微麻烦一些,但为了消除系统的安全隐患,这么做还是值得的。