我最近得知〜指的是HOME變量。所以,如果我設置HOME =/foo和再嘗試使用bash腳本,想CD〜/文稿它結束了一句話:覆蓋的HOME變量
富/文件:沒有這樣的文件或目錄
什麼是最好的做法在這個情況下?崩潰並向用戶抱怨他們覆蓋了HOME?或者有什麼方法可以恢復HOME的默認值?
我最近得知〜指的是HOME變量。所以,如果我設置HOME =/foo和再嘗試使用bash腳本,想CD〜/文稿它結束了一句話:覆蓋的HOME變量
富/文件:沒有這樣的文件或目錄
什麼是最好的做法在這個情況下?崩潰並向用戶抱怨他們覆蓋了HOME?或者有什麼方法可以恢復HOME的默認值?
我認爲你應該像對待任何其他訪問文件的問題一樣對待它。如果您嘗試訪問的文件不存在,或者您嘗試在目錄中創建文件,但無法打印該文件,則會顯示一條錯誤消息。如果它對應用程序的操作至關重要,則在報告錯誤後退出。
據我所知,大多數需要使用用戶主目錄的應用程序只使用HOME
環境變量,他們不會再次猜測它。
這不應該有任何安全隱含的。用戶仍然需要適當的權限才能訪問這些文件,因此重定向HOME
將不允許他們編寫他們不應該的文件。如果您的應用程序是set-uid,那麼在打開用戶目錄中的文件時應始終返回到用戶的ID,而不要使用提升的權限。
用戶主目錄的真實來源是/etc/passwd
,其中包含系統中每個用戶的一行,列出用戶的名稱,主目錄和其他信息。如果你的問題是「什麼是某某這樣的主目錄?」,那麼你應該看看它在/etc/passwd
。*
然而,儘管/etc/passwd
是正確的,如果用戶已經重挫$HOME
一些其他的路徑,他們可能希望您使用該值而不是「真正的」主目錄。除非允許用戶欺騙主目錄存在安全問題,否則最好盲目使用用戶給出的值。
就個人而言,我會檢查$HOME
是否是一個目錄(例如if [[ -d "$HOME" ]]
),如果是這樣,請按原樣使用它。如果不是,則使用grep
和cut
解析出/etc/passwd
,可能會將警告打印到stderr以提醒用戶他們的$HOME
不好。你可以grep找到由id -u
打印的UID,這個不能被非root用戶破壞。
但是,如果你真的擔心$HOME
被破壞,你還應該擔心$PATH
,$LC_*
變量和其他幾個可能破壞各種事物的環境變量。最終,僅僅假設這些變量是正確的並且按原樣使用它們會更容易,除非存在安全問題。這意味着只是一味地使用$HOME
,不要太擔心它是錯誤的。
*在使用LDAP或類似聯網系統管理帳戶的系統上,用戶的帳戶可能沒有在那裏列出。在某些情況下,有一個/etc/passwd.cache
或類似的東西,可能包含用戶,但不能保證在每個系統上都能正常工作。在whoami(1)
上運行strace(1)
可以幫助指示此信息來自何處。
這取決於上下文。對於許多工具來說,環境變量構成了接口的一部分(例如'LC_ *'和locales),並且您希望允許用戶明確地設置它們。在其他情況下,比如'sudo',你想清除環境以防止發生意想不到的事情。你在做什麼你的腳本? –
如果他們更改了「HOME」,那意味着他們希望應用程序將該目錄作爲其主目錄。超越他們的意願不是你的責任。 – Barmar
另一個恢復選項是使用'$ USER'在標準位置測試'/ home/$ USER',如果你想恢復'$ HOME',那麼這個選項就可以使用。現在明白了,這些都不能在腳本中完成並影響shell。您可以更改腳本運行的進程的環境,但不更改父級。因此,如果用戶在腳本中更改'$ HOME',請使用@ Barmar的評論。 –