Environment-Variables

如何在互動式非登錄 shell 上獲取正確的啟動腳本

  • April 5, 2019

我正在嘗試在準系統 OpenSolaris 衍生物(OmniOS,Illumos/OpenIndiana 的發行版)中建立一個健全/可用的環境。我在 .profile、.inputrc 和 .bashrc 文件中有我需要的所有管道程式碼,準備好推廣到系統範圍內使用,但沒有為非登錄 shell 提供系統範圍的腳本。Bash 嘗試在 su 上傳入使用者的 .bashrc 文件,但 $HOME(和任何其他環境變數)仍然為前一個使用者配置。

直接(SSH)登錄的輸出:

login as: myuser
Using keyboard-interactive authentication.
Password:
/etc/profile run
myuser's .bashrc run
myuser's .profile run
myuser@Helios:~$ echo ~
/home/myuser
myuser@Helios:~$

輸出切換使用者:

root@Helios:/etc# su myuser
bash: /root/.bashrc: Permission denied
bash-4.2$ id
uid=1001(myuser) gid=100(users) groups=100(users),27(sudo)
bash-4.2$ echo ~
/root
bash-4.2$

請特別注意嘗試獲取 root 的 .bashrc 而不是 myuser 的 .bashrc。

su(沒有額外的參數)在 Ubuntu、Fedora 等中一直可以無縫執行,我打算複製這種體驗,但是當沒有系統範圍的腳本執行並且找不到使用者的腳本時我該怎麼辦?我傾向於責怪 OmniOS 版本的 bash 和/或 su 遺漏了一些東西,但正確的行為究竟是什麼?我可以在某處配置/訪問/腳本附加管道來解決更新 $HOME 和其他環境變數的失敗嗎?

進一步說明:

  • OmniOS 中沒有 man bash(至少不使用 MANPATH=/opt/omni/share/man:/opt/mysql55/man:/opt/gcc-4.4.4/man:/usr/gnu/share/man: /usr/local/man:/usr/local/share/man:/usr/man:/usr/share/man)
  • /etc/bashrc 和 /etc/bash.bashrc 永遠不會被獲取(這是預期的,因為這顯然是一個特定於發行版的約定,但 Ubuntu 確實似乎在沒有從 .bashrc 引用的情況下載入這些)

su命令不會更改HOMESolaris 下的環境變數。這就是它的工作原理。在 Linux 和 *BSD 下,su確實 reset HOME,我認為這是 BSD/SysV 的區別。Bash 的行為非常正常:它嘗試載入~/.bashrc,並且由於HOME仍然是/root,那就是/root/.bashrc.

這個想法是,當你suroot 時,你啟動的 shell 和其他程序仍然會在你的主目錄中查找你的配置文件。如果你想要目標使用者的環境,你可以執行su -.

如果要設置HOME但保持環境不變,請顯式設置。

HOME=~myuser su myuser

bash 是否載入系統範圍的文件是一個編譯時選項。該選項在 Ubuntu 上啟用,但在 OmniOS 上禁用。

引用自:https://unix.stackexchange.com/questions/84779