使用 ZSH 作為預設 shell SSH 進入系統不會執行 /etc/profile
我在我們的某些機器 atm 上遇到了奇怪的行為。至少,這對我和我的同事來說似乎很奇怪,我們沒有找到任何解釋:)
$$ edit 1 $$
下一段似乎是錯誤的。見最後的編輯 2。
我們在這裡使用 bash 和 zsh。因此,當通過 SSH 連接到一些配置為使用zsh
ssh 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/profile
profile.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 的初始化文件:
/etc/zshenv
~/.zshenv
登錄方式:
/etc/zprofile
~/.zprofile
互動的:
/etc/zshrc
~/.zshrc
登錄方式:
/etc/zlogin
~/.zlogin
尖端:
- 在 Linux 上的終端中打開的預設 shell 是非登錄的互動式 shell。但在 macOS 上,它是一個登錄 shell。
參考
sshd
當客戶端不發送任何執行命令時執行登錄 shell。這是為了模仿rsh
呼叫rlogind
服務的行為,而不是rshd
在沒有給出任何執行命令時呼叫服務的行為。要告訴 shell 它是一個登錄 shell,比如
rlogind
orlogin
或telnetd
,sshd
你的 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.login
。fish
使用/etc/fish/config.fish
(無論是否處於登錄模式)。
zsh
的語法也與 Bourne/POSIX 的語法不完全兼容,因此預設情況下,它不讀取/etc/profile
. 它在登錄模式下的配置文件是/etc/zsh/zprofile
(或/etc/zprofile
取決於zsh
建構時的配置方式)和/etc/zsh/zlogin
(或/etc/zlogin
)後者在zshrc
.
zsh
僅/etc/profile
在處於sh
或ksh
仿真時的源,在這種情況下,其語法比在預設zsh
仿真模式下更接近 POSIX sh 的語法。如果您想在登錄模式下
zsh
獲取源文件,則/etc/profile
需要添加一個source /etc/profile
in/etc/zsh/zprofile
,但您只需要確保它的語法/etc/profile
及其來源的任何其他文件與zsh
.或者,您可以添加:
emulate sh -c 'source /etc/profile'
到
/etc/zsh/zprofile
. 然後/etc/profile
將以sh
仿真模式獲取(並且在那裡聲明的函式也將保留sh
仿真模式)。