Shell

使用 ZSH 作為預設 shell SSH 進入系統不會執行 /etc/profile

  • August 12, 2021

我在我們的某些機器 atm 上遇到了奇怪的行為。至少,這對我和我的同事來說似乎很奇怪,我們沒有找到任何解釋:)

$$ edit 1 $$

下一段似乎是錯誤的。見最後的編輯 2。

我們在這裡使用 bash 和 zsh。因此,當通過 SSH 連接到一些配置使用zshssh login@host作為預設 shell(帶在各自的機器上與否。chsh -s /usr/bin/zsh 據我了解,通過 SSH 連接到一台機器應該是在該機器上啟動一個新的使用者會話,因此要求 shell 是登錄 shell,對嗎?zsh不應該也是這樣嗎?

在機器上將預設 shell 更改為 bash 時,使用登錄 shell 登錄機器。

這是 zsh 的正常行為嗎?可以改變嗎?還是配置錯誤?

$$ /edit 1 $$ $$ edit 2 $$ 好的,根據 ZSH 文件,您可以輕鬆測試它是否是登錄 shell:

$ if [[ -o login ]]; then; print yes; else; print no; fi

見:http: //zsh.sourceforge.net/Guide/zshguide02.html

但是,由於 zsh man 條目/文件,zsh 應該 source/etc/profile反過來又在/etc/profile.d/*.sh. 我上面的問題源於這樣一個事實,即腳本沒有來源,因此我們的大多數環境變數和系統配置內容都沒有正確初始化。但是,如上所述 - 當我們使用 bash 作為預設 shell 時,/etc/profileprofile.d 文件夾中的腳本是有源的。

$$ /edit 2 $$ $$ edit 3 - ANSWER $$ 感謝@StéphaneChazelas 在下面的評論中給出答案!似乎只有在/兼容模式下執行時才進行zsh採購(請參閱相應的 man 條目https://linux.die.net/man/1/zsh)。由於通過 SSH 登錄不會觸發該兼容模式,因此不一定是自己的來源,但必須通過/etc/profile``sh``ksh``zsh``/etc/profile``.zprofile $$ /edit 3 $$ 系統:作業系統:Ubuntu 18.04 zsh-5.4.2,帶有 omz 和一些啟動的外掛。

謝謝!

ZSH 就是這樣工作的。/etc/profile不是 ZSH 的初始化文件。ZSH 使用/etc/zprofile~/.zprofile

ZSH 的初始化文件:

  1. /etc/zshenv

  2. ~/.zshenv

  3. 登錄方式:

  4. /etc/zprofile

  5. ~/.zprofile

  6. 互動的:

  7. /etc/zshrc

  8. ~/.zshrc

  9. 登錄方式:

  10. /etc/zlogin

  11. ~/.zlogin

在此處輸入圖像描述

尖端:

  • 在 Linux 上的終端​​中打開的預設 shell 是非登錄的互動式 shell。但在 macOS 上,它是一個登錄 shell。

參考

sshd當客戶端不發送任何執行命令時執行登錄 shell。這是為了模仿rsh呼叫rlogind服務的行為,而不是rshd在沒有給出任何執行命令時呼叫服務的行為。

要告訴 shell 它是一個登錄 shell,比如rlogindorlogintelnetdsshd你的 shell 以argv[0]a 開頭,它以 . 開頭-

或者,當然,zsh就像其他所有 shell 也理解它一樣。如果沒有,則永遠無法在登錄模式下呼叫它。

在這裡,讓您認為您沒有獲得登錄 shell 的症狀是因為/etc/profile沒有被解釋。

/etc/profile是類似 Bourne 的 shell 的登錄會話初始化文件。那裡的語法預計將採用 Bourne shell 語法(或者可能是 POSIX sh 語法,因為 Bourne shell 現在幾乎從未使用過),並且在登錄時被所有語法(大部分)向後兼容 Bourne 或POSIX sh 語法。

csh並且tcsh使用完全不同的語法/etc/csh.loginfish使用/etc/fish/config.fish(無論是否處於登錄模式)。

zsh的語法也與 Bourne/POSIX 的語法不完全兼容,因此預設情況下,它不讀取/etc/profile. 它在登錄模式下的配置文件是/etc/zsh/zprofile(或/etc/zprofile取決於zsh建構時的配置方式)和/etc/zsh/zlogin(或/etc/zlogin)後者在zshrc.

zsh/etc/profile在處於shksh仿真時的源,在這種情況下,其語法比在預設zsh仿真模式下更接近 POSIX sh 的語法。

如果您想在登錄模式下zsh獲取源文件,則/etc/profile需要添加一個source /etc/profilein /etc/zsh/zprofile,但您只需要確保它的語法/etc/profile及其來源的任何其他文件與zsh.

或者,您可以添加:

emulate sh -c 'source /etc/profile'

/etc/zsh/zprofile. 然後/etc/profile將以sh仿真模式獲取(並且在那裡聲明的函式也將保留sh仿真模式)。

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