使用 ZSH 作为默认 shell 的 SSH 进入系统不会运行 /etc/profile

使用 ZSH 作为默认 shell 的 SSH 进入系统不会运行 /etc/profile

我在我们的一些自动取款机机器上遇到了奇怪的行为。至少,这对我和我的同事来说似乎很奇怪,我们没有找到任何解释:)

[编辑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 条目shkshhttps://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 的初始化文件:

  1. /etc/zshenv
  2. ~/.zshenv
  3. 登录方式:
    1. /etc/zprofile
    2. ~/.zprofile
  4. 交互的:
    1. /etc/zshrc
    2. ~/.zshrc
  5. 登录方式:
    1. /etc/zlogin
    2. ~/.zlogin

在此输入图像描述

尖端:

  • Linux 终端中打开的默认 shell 是非登录交互式 shell。但在 macOS 上,它是一个登录 shell。

参考

答案2

sshd当客户端未发送任何要运行的命令时运行登录 shell。这是为了模仿rsh调用服务的行为rlogind,而不是rshd在没有给出任何运行命令时的行为。

要告诉 shell 它是一个登录 shell,例如rlogindorlogintelnetd,请使用以 开头的 来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.loginfish使用/etc/fish/config.fish(无论是否处于登录模式)。

zsh的语法也不完全兼容 Bourne/POSIX,因此默认情况下,它不读取/etc/profile.它在登录模式下的配置文件是/etc/zsh/zprofile(或/etc/zprofile取决于zsh构建时的配置方式)和/etc/zsh/zlogin(或/etc/zlogin)后者在zshrc.

zsh/etc/profileshksh仿真时提供源,在这种情况下,其语法比默认仿真模式更接近 POSIX sh 的语法zsh

如果您想在登录模式下zsh进行来源/etc/profile,则需要添加source /etc/profilein ,但只有在确保 的语法及其来源的任何其他文件与 的语法兼容/etc/zsh/zprofile时才需要添加 in 。/etc/profilezsh

或者,您可以添加:

emulate sh -c 'source /etc/profile'

/etc/zsh/zprofile。然后/etc/profile将以sh仿真模式获取(并且其中声明的函数也将保留sh仿真模式)。

相关内容