沒有~/.bash_profile 設置環境變數是什麼狀態?
儘管 Strode 想要轉向環境變數的“現代”解決方案,但他顯然感受到了來自更廣泛的損壞系統暴露的壓力。因此,在撰寫本文時,他最近對這個錯誤的評論是:“是的,我正在考慮放棄這個問題。” 所以 Fedora 25 很可能會看到一個將登錄 shell 恢復為登錄過程的更新;“適當的修復”將等待稍後。
現在是 Fedora 28 ……我們在“正確修復”方面的位置在哪裡?是否有一種前瞻性的方式讓使用者為其會話設置環境變數?
~/.bash_profile
即在 Fedora 上工作的替代品,並希望在其他地方工作。
對於 GNOME 3.24,Strode通過執行登錄 shell恢復了 gnome-session以載入環境變數。
在同一條評論中,他們為 gnome-session 提供了一個更新檔,用於將這些會話環境變數推送到 systemd 使用者服務。這些包括
gnome-terminal
,所以它相當重要:)。GDM 會話啟動器已在 3.22 中進行了修補
systemd --user
,以便從. 所以systemd環境被導入到會話中,然後被登錄shell修改,結果也被複製回systemd --user
.哪個應該可以工作…除了在 Fedora 28 上進行測試外,它不能正常工作,例如 PATH,因為 gdm 會話啟動器不允許 systemd 環境變數覆蓋預先存在的環境。我已經在 GNOME 問題跟踪器上報告了它。
同意(對於
login
文本控制台)可以在啟動使用者 shell 之前接受一些更新檔來載入環境配置,但util-linux v2.32到目前為止沒有任何變化。我什至沒有費心尋找 ssh 更新檔 :)。
systemd 環境已經可以在
user.conf
. 作為這項工作的一部分,systemd v233獲得了一種格式,現在支持例如在現有或搜尋列表中environment.d/
添加額外的目錄。PATH``LD_LIBRARY_PATH
我認為為使用者登錄設置環境變數的最佳位置是在 PAM 模組中——我們甚至已經
pam_env
有了。 邏輯是要求登錄、gdm、sshd(這永遠不會發生)等這樣做確實是一個糟糕的解決方案。
不幸的是,
pam_env
發行版之間的配置令人討厭地不一致……而且似乎有一個很好的理由。該~/.pam_environment
功能被認為是安全性的大“腳槍”。另請參閱CVE-2010-4708。> > 看看
pam_exec
例如。你可以想像一個系統管理員使用它來做一些登錄後配置或其他事情,但是使用者可以通過設置 LD_PRELOAD 來獲得 root。或者 pam_selinux 實際上直接使用 pam_getenv,所以使用者可以使用它。但我的觀點並不是這些具體的例子,它只是為了說明以 root 身份進行操作存在風險,我們可以完全繞過這些風險,消除一整類潛在的安全漏洞,方法是稍後再做。登錄過程。作為一般規則,如果您不需要以 root 身份執行程式碼,則不應以 root 身份執行!當然,我還是很糾結,因為從邏輯上講,以後再做會更尷尬,但毫無疑問,以 root 身份進行操作比以使用者身份進行操作風險更大。 > > >pam_exec 手冊明確指出:“由 pam_exec 呼叫的命令需要知道使用者可以控制
$$ sic $$在環境之上。”
> > 關於。pam_env,注意 fedora 將它放在 pam 堆棧的頂部,並預設禁用 ~/.pam_environment。 > > >
將其放在堆棧頂部是一個錯誤,違反了不這樣做的明確警告:“由於 PAM 環境變數的設置可能對其他模組產生副作用,因此該模組應該是堆棧中的最後一個。”
$$ … $$鑑於這裡的混亂,這顯然是一支腳槍
為此使用 shell 配置的一般想法似乎也適用於例如 Ubuntu Desktop 16.04 圖形登錄。但是,有一個區別。Fedora
~/.bash_profile
預設創建,這(對於 bash)會導致~/.profile
被忽略。Ubuntu 和其他基於 Debian 的發行版~/.profile
預設創建。(即這些文件是在您創建新使用者時提供的,來自/etc/skel
)。(我最近在 Ubuntu 上使用過這個。Ubuntu 似乎隨著時間的推移而改變了執行 GUI 會話的登錄 shell。例如,參見https://superuser.com/questions/183870/difference-between-bashrc-and-bash-profile /183980#183980,https://askubuntu.com/questions/40287/etc-profile-not-being-sourced,“為什麼 gnome-terminal 不是登錄 shell”和“ shell 登錄意味著什麼(‘bash - l’)”)。