我在我们的一些自动取款机机器上遇到了奇怪的行为。至少,这对我和我的同事来说似乎很奇怪,我们没有找到任何解释:)
[编辑1]
下一段似乎是错误的。请参阅最后的编辑 2。
我们在这里使用 bash 和 zsh。因此,当通过 SSH 连接到一些ssh login@host
配置为使用 zsh 作为默认 shell 的 zsh-default-machines (plain ) 时(使用chsh -s /usr/bin/zsh
)的 zsh-default-machines(plain )时,随后打开的 shell 是交互式的,但未登录shell,无论我们是否已经登录到相应的计算机上。
根据我的理解,通过 SSH 连接到一台机器应该在该机器上启动一个新的用户会话,因此要求 shell 是登录 shell,对吧? zsh 不应该也是这样吗?
将计算机上的默认 shell 更改为 bash 时,使用登录 shell 登录计算机。
这是 zsh 的正常行为吗?可以改变吗?或者是一些配置错误?
[/编辑1]
[编辑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 文件夹中的脚本是来源的。
[/编辑2]
[编辑 3 - 答案] 谢谢@StéphaneChazelas 在下面的评论中给出答案!似乎zsh
只有在/兼容模式/etc/profile
下运行时才进行采购(请参阅相应的 man 条目sh
ksh
https://linux.die.net/man/1/zsh)。由于通过 SSH 登录不会触发该兼容模式,因此zsh
不一定会/etc/profile
自行获取,但必须通过.zprofile
[/edit 3]触发
系统:操作系统:Ubuntu 18.04 zsh-5.4.2,已激活 omz 和一些插件。
谢谢你!
答案1
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。
参考
答案2
sshd
当客户端未发送任何要运行的命令时运行登录 shell。这是为了模仿rsh
调用服务的行为rlogind
,而不是rshd
在没有给出任何运行命令时的行为。
要告诉 shell 它是一个登录 shell,例如rlogind
orlogin
或telnetd
,请使用以 开头的 来sshd
启动您的 shell 。argv[0]
-
或者当然,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
仿真时提供源,在这种情况下,其语法比默认仿真模式更接近 POSIX sh 的语法zsh
。
如果您想在登录模式下zsh
进行来源/etc/profile
,则需要添加source /etc/profile
in ,但只有在确保 的语法及其来源的任何其他文件与 的语法兼容/etc/zsh/zprofile
时才需要添加 in 。/etc/profile
zsh
或者,您可以添加:
emulate sh -c 'source /etc/profile'
到/etc/zsh/zprofile
。然后/etc/profile
将以sh
仿真模式获取(并且其中声明的函数也将保留sh
仿真模式)。