Linux——關於執行文件路徑的變量($PATH)

查閱文件屬性的指令 ls 完整文件名爲:/bin/ls(這是絕對路徑), 會不會覺得很奇怪:『爲什麼可在任何地方執行/bin/ls 這個指令呢? 』 爲什麼在任何目錄下輸入 ls  就一定可以顯示出一些訊息而不會說找不到該 /bin/ls  指令呢? 這是因爲環境變量PATH 的幫助所致呀!當我們在執行一個指令的時候,舉例來說『ls』好了,系統會依照 PATH 的設定去每個 PATH 定義的目錄下搜尋文件名爲 ls 的可執行文件, 如果在 PATH 定義的目錄中含有多個文件名爲 ls 的可執行文件,那麼先搜尋到的同名指令先被執行!

現在,請下達『echo $PATH』來看看到底有哪些目錄被定義出來了? echo 有『顯示、印出』的意思, PATH 前面加的 表示後面接的是變量,所以會顯示出目前的 PATH

PATH(一定是大寫)這個變量的內容是由一堆目錄所組成的,每個目錄中間用冒號(:)來隔開, 每個目錄是有『順序』之分的。無論是 root 還是 dmtsai 都有 /bin  或/usr/bin 這個目錄在 PATH 變量內,所以當然就能夠在任何地方執行 ls 來找到/bin/ls 執行檔囉!因爲/bin CentOS 7  當中,就是連結到 /usr/bin  去的! 所以這兩個目錄內容會一模一樣!

例題:

假設你是root,如果你將 ls 由/bin/ls 移動成爲/root/ls(可用『mv /bin/ls /root』指令達成),然後你自己本身也在/root 目錄下, 請問(1)你能不能直接輸入 ls 來執行?(2)若不能,你該如何執行 ls 這個指令?(3)若要直接輸入 ls 即可執行,又該如何進行?

答:

由於這個例題的重點是將某個執行文件移動到非正規目錄去,所以我們先要進行底下的動作纔行:(務必先使用 su- 切換成爲 root 的身份)

(1)接下來不論你在那個目錄底下輸入任何與 ls 相關的指令,都沒有辦法順利的執行 ls 了! 也就是說,你不能直接輸入 ls 來執行,因爲/root 這個目錄並不在 PATH 指定的目錄中, 所以,即使你在/root 目錄下,也不能夠搜尋到 ls這個指令!

(2)因爲這個 ls 確實存在於/root 底下,並不是被刪除了!所以我們可以透過使用絕對路徑或者是相對路徑直接指定這個執行檔檔名, 底下的兩個方法都能夠執行 ls 這個指令:

(3)如果想要讓root 在任何目錄均可執行/root 底下的 ls,那麼就將/root 加入 PATH 當中即可。 加入的方法很簡單,就像底下這樣:

上面這個作法就能夠將/root 加入到執行文件搜尋路徑 PATH 中了!不相信的話請您自行使用『echo $PATH』去查看吧! 另外,除了 $PATH 之外,如果想要更明確的定義出變量的名稱,可以使用大括號 ${PATH} 來處理變量的呼叫喔! 如果確定這個例題進行沒有問題了,請將 ls 搬回/bin 底下,不然系統會掛點的!

某些情況下,即使你已經將 ls 搬回 /bin 了,不過系統還是會告知你無法處理 /root/ls 喔!很可能是因爲指令參數被快取的關係。 不要緊張,只要註銷 (exit) 再登入 (su -) 就可以繼續快樂的使用 ls 了!

例題:

如果我有兩個 ls 指令在不同的目錄中,例如/usr/local/bin/ls 與/bin/ls 那麼當我下達 ls 的時候,哪個 ls 會被執行?

答:那還用說,就找出 ${PATH} 裏面哪個目錄先被查詢,則那個目錄下的指令就會被先執行了!所以用 dmtsai 賬號爲例,他最先搜尋的是 /usr/local/bin, 所以 /usr/local/bin/ls 會先被執行喔!

例題:

爲什麼 ${PATH}  搜尋的目錄不加入本目錄(.)?加入本目錄的搜尋不是也不錯?

答:如果在 PATH 中加入本目錄(.)後,確實我們就能夠在指令所在目錄進行指令的執行了。 但是由於你的工作目錄並非固定(常常會使用 cd 來切換到不同的目錄), 因此能夠執行的指令會有變動(因爲每個目錄底下的可執行文件都不相同嘛!),這對使用者來說並非好事。

另外,如果有個壞心使用者在/tmp 底下做了一個指令,因爲/tmp 是大家都能夠寫入的環境,所以他當然可以這樣做。 假設該指令可能會竊取用戶的一些數據,如果你使用 root 的身份來執行這個指令,那不是很糟糕? 如果這個指令的名稱又是經常會被用到的 ls 時,那『中標』的機率就更高了!

所以,爲了安全起見,不建議將『.』加入PATH 的搜尋目錄中。

而由上面的幾個例題我們也可以知道幾件事情:

  • 不同身份使用者預設的PATH 不同,默認能夠隨意執行的指令也不同(root dmtsai)
  • PATH 是可以修改的
  • 使用絕對路徑或相對路徑直接指定某個指令的文件名來執行,會比搜尋PATH 來的正確;
  • 指令應該要放置到正確的目錄下,執行纔會比較方便;
  • 本目錄(.)最好不要放到PATH 當中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章