Pages

Tuesday, 30 July 2024

Linux下, $PATH环境变量详解

 在Linux下我们可以用ls这个命令查看文件的属性,而命令ls完整的命令路径一般是:/bin/ls,这是绝对路径。我们在任何地方都可以运行/bin/ls这个命令。当我们在任何目录下输入ls,其实最终找到的命令都是/bin/ls。那么为什么我们输入ls就可以找到/bin/ls命令呢,这个就是环境变量PATH起的作用了。


当我们运行一个命令,如ls这个命令,系统会根据PATH环境变量事先的配置去每个PATH定义的目录下搜寻可运行命令,如果PATH定义的目录包含多个ls可执行文件,则先找到的命令先被运行。


那么,$PATH环境变量存储的值是什么?我们可以用echo这个命令来输出这个环境变量的值,echo的作用是显示,输出。

具体做法如下:


超级管理员root执行

 

[root@lmode ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

 

[ppp@lmode ~]# echo $PATH

/usr/local/bin:/bin:/usr/bin:/home/ppp/bin

PATH(这个命令要大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开,每个目录有先后之分,放在越前面的目录越先被查找。超级管理员用户root和普通用户自行echo $PATH打印出的目录会有所不同。不过,无论是超级管理员root还是普通用户都有/bin这个目录,也就说任何普通用户也好或者超级管理员用户也好,都可以使用/bin/ls这个命令。注意:/sbin、/usr/sbin和/usr/local/sbin这三个目录是超级管理员特有的,也就是说里面的命令也是超级管理员特有的。一般来说普通用户可以用绝对路径的方法来操作这些命令,比如当普通用户想查看网卡配置信息时,可以使用/sbin/ifconfig ehto来进行查看。


实例1:


假设在root用户下,将ls由/bin/ls移动到/root/ls,那么root用户还可使用ls这个命令吗?

 

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

 

[root@lmode~]# ls

-bash: /bin/ls: No such file or directory

 

[root@lmode~]# /root/ls

sh-1.3.0-centos.zip

这个答案是否定的,root不可以使用ls这个命令,即使在/root目录下也不行,因为系统是根据PATH这个环境变量指定的目录去查找命令位置的,而/root这个目录不在PATH这个目录中。不过我们可以通过绝对路径/root/ls、或相对路径./ls来执行这个命令。


实例2:


如果想让/root这个目录也加到环境变量PATH里面,那么如何操作?

 

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

 

[root@lmode~]# ls

sh-1.3.0-centos.zip

 

将ls重新放回/bin下

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

把/root加到环境变量PATH中,那么在任何目录都可以运行ls命令。注意,实验完了不要忘了将ls命令重新放回到/bin目录下。


实例3:


为什么PATH搜寻的目录不加入本目录(.)?

 

因为在Linux下/tmp是大家都能够写入的环境,如果一个黑客在/tmp底下做了一个命令,假设该命令可能会窃取使用者的一些数据,如果你使用root的身份来运行这个命令,那后果就很可怕。

最后,关于PATH环境变量,总结下:


1.不同用户默认的PATH不同,默认能够随意运行的命令也不同(如普通用户和超级管理员);


2.PATH是可以修改的,所以一般使用者还是可以透过修改PATH来运行某些位于/sbin或/usr/sbin下的命令来查询;


3.使用绝对路径或相对路径直接指定某个命令的可执行文件来运行,会比搜寻PATH来的正确;


4.命令应该要放置到正确的目录下,运行才会比较方便;


5.本目录(.)最好不要放到PATH当中。

No comments:

Post a Comment