Linux系统:当前目录与PATH变量,安全问题
当前工作目录:UNIX 和 Linux系统中使用 pwd 命令查看,放在$PWD 变量中的目录。英文名:current directory或者 working directory。
pwd 是 print working directory 的缩写。
在Linux系统中,执行命令时,即使当前工作目录下存放了所输入命令的 可执行文件 或者 可执行脚本,Linux也是找不到这个命令的,因为Linux 搜索命令的时候是根据$PATH变量去寻找的,而当前工作目录” . “ (这里是个点号,表示当前目录)是不列入 $PATH中的。
可是有人就奇怪了,那为什么不把当前目录 “ . ” 放到$PATH中呢,回答曰:安全。
这里的安全,一个是说防止攻击方面的安全,比如你下了一个软件,然后你去执行tar ,gzip,cat 之类的本地软件时。假如你下载的软件恶意的存在了这样的同名可执行文件,并且你下载完后,刚好就在这个目录,那么你执行这样的命令的时候……结果可想而知。
除了它人的原因外,还有自己的原因。比如我们经常会自己用c语言或者其它的语言写一些程序,然后编译、链接为可执行文件。假如我们的可执行文件是做一些不可恢复性的操作,比如删除文件,格式化磁盘之类的。而这些文件名字又恰巧和我们系统$PATH下的某些常用可执行文件名字相同时,那么结果会出乎我们的意料。
也就是说当前目录是总在变化的,一会我们cd 到这儿了,一会又cd 到另一个地方去了。这样的话,当前目录下有哪些可执行文件也会随着改变的。有时候我们不会太在意自己处于的目录位置,如果当前目录在$PATH中,那么我们也就不清楚自己干了什么。
而$PATH 里面则放置了一些固定的目录,这些目录是不会变化的,这样的话,当我们输入命令时,永远可以保证不会随着自己的位置改变,而导致出乎意料。
同样的Linux下的编译器 gcc 的两个选项 -L 和 -I ,也默认不会包含当前目录的,这样的话,如果我们的头文件,或者函数库即使在当前目录中,如果没有使用 -L 或者 -I指定的话,那么也是会找不到。这样做同样也是为了安全方面,因为假如我们 -lm,自以为链接了/usr/lib中的libm.so库,可是如果刚好目录下也有同样的库时,链接后的可执行文件可能同样会出乎我们的意料,甚至链接了危险的东西……
所以涉及到安全,隐晦,可变的方面,Linux会尽量用一种安全的方法或者机制保证。如果我们需要使用某些特性,那么好,你自己手动去指定好了,出事了你自己负责就行了。
这种感觉有点类似于C++ 的更严格的语法,比如说空指针是不能赋值给其它类型的指针的,如果直接赋值,c++会报错。你假如真的想赋值,好,你自己在语法上强制指定,这样的话你会知道自己在干嘛,出事了不要怪编译器。