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

nig*_*arc 6 shell login zsh profile dot-files

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

[编辑 1]
下一段似乎是错误的。请参阅最后的编辑 2。
我们在这里使用 bash 和 zsh。因此,当通过 SSH 连接到某些ssh login@host配置为使用 zsh 作为默认 shell(带有chsh -s /usr/bin/zsh)的 zsh-default-machines(plain )时,然后打开的 shell 是一个交互式但非登录的shell,无论我们是否已经登录是否在相应的机器上。

根据我的理解,通过 SSH 连接到一台机器应该是在该机器上启动一个新的用户会话,因此要求 shell 是一个登录 shell,对吗?zsh 不应该也是这种情况吗?

在机器上将默认 shell 更改为 bash 时,登录机器使用 login-shell。

这是 zsh 的正常行为吗?能不能改?或者是一些配置错误?
[/编辑 1]

[编辑 2] 好的,根据 ZSH 文档,您可以轻松测试它是否是登录 shell:

$ if [[ -o login ]]; then; print yes; else; print no; fi
Run Code Online (Sandbox Code Playgroud)

见: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/profilesh/ksh兼容模式下运行时才进行采购(请参阅相应的 man 条目https://linux.die.net/man/1/zsh)。由于通过 SSH 登录不会触发该兼容模式,zsh因此不一定/etc/profile是它自己的来源,但必须通过.zprofile [/edit 3]触发

系统:操作系统:Ubuntu 18.04 zsh-5.4.2,已激活 omz 和一些插件。

谢谢!

Sim*_*mba 19

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认同)

Sté*_*las 5

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

要告诉 shell 它是一个登录 shell,例如rlogindorlogintelnetdsshdargv[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/profile在 inshkshemulation时的源,在这种情况下,它的语法比默认的zsh仿真模式更接近 POSIX sh 的语法。

如果您想在登录模式下zsh获取源代码/etc/profile,则需要添加一个source /etc/profilein /etc/zsh/zprofile,但您只希望在确保/etc/profile其源代码的语法以及它所提供的任何其他文件与zsh.

或者,您可以添加:

emulate sh -c 'source /etc/profile'
Run Code Online (Sandbox Code Playgroud)

/etc/zsh/zprofile. 然后/etc/profile将在sh仿真模式下获取(并且在那里声明的函数也将保留sh仿真模式)。