[知识] 为什么默认不把当前目录加入PATH
发表于 : 2011-08-10 14:13
许多刚接触Linux shell的人,会使用下列命令编译运行程序:
然后果断碰壁了,他就会来论坛求助。
原因是很简单的:当前目录“.”不在PATH变量中。命令都在PATH中搜索,所以PATH中找不到a.out命令。
正确做法:
但为什么不把当前目录加入PATH呢?貌似Windows的cmd和DOS神马的都这样做,其实旧的UNIX什么的也是这样做的。
其实主要是安全问题。当前目录是会变化的,用户完全可能进入某个未知的目录,然后使用系统命令。但万一当前目录下有一个与系统命令名字一样的文件,实际执行的就可能不是想要用的系统命令。
如果当前目录在PATH中,我cd进某个人人可访问目录,而某个坏人在这里放了一个恶意程序,并命名为cat,为了查看某个文件我输入了cat,然后伪cat提示我输入密码(虽然很奇怪,但是愚蠢的人类也许一粗心就没注意),然后我输入了密码...... 我就杯具了。如果我用了root,那就更杯具了。
虽然把当前目录放在PATH最后可以避免覆盖系统程序。但自己扩充PATH时,一般都是放在最后,所以还是有被覆盖的风险。所以最好还是别放进PATH了,多输入一个“./”又累不死人。
看APUE知道的,分享一下。
代码: 全选
cuihao@cuihao-arch mysh $ gcc mysh.c
cuihao@cuihao-arch mysh $ a.out
zsh: command not found: a.out
原因是很简单的:当前目录“.”不在PATH变量中。命令都在PATH中搜索,所以PATH中找不到a.out命令。
正确做法:
代码: 全选
cuihao@cuihao-arch mysh $ ./a.out
..........
其实主要是安全问题。当前目录是会变化的,用户完全可能进入某个未知的目录,然后使用系统命令。但万一当前目录下有一个与系统命令名字一样的文件,实际执行的就可能不是想要用的系统命令。
如果当前目录在PATH中,我cd进某个人人可访问目录,而某个坏人在这里放了一个恶意程序,并命名为cat,为了查看某个文件我输入了cat,然后伪cat提示我输入密码(虽然很奇怪,但是愚蠢的人类也许一粗心就没注意),然后我输入了密码...... 我就杯具了。如果我用了root,那就更杯具了。
虽然把当前目录放在PATH最后可以避免覆盖系统程序。但自己扩充PATH时,一般都是放在最后,所以还是有被覆盖的风险。所以最好还是别放进PATH了,多输入一个“./”又累不死人。
看APUE知道的,分享一下。