将 ssh 远程命令从 bash 传递到 zsh

将 ssh 远程命令从 bash 传递到 zsh

我正在从 Windows 到我的 Red Hat Enterprise Linux 服务器运行远程 Putty 会话。

由于公司限制,我无法将 Linux 用户的默认 shell 从 bash 更改为 zsh。相反,我对 具有只读访问权限~./bash_profile,它执行~/.bashrc(我也只有只读访问权限),而它又~/.bash_custom在我具有写访问权限的地方执行。在里面~/.bash_custom,我执行 zsh 来更改我的 shell。

包含执行 zsh 的行可防止执行 putty 提供的任何远程命令。我知道这是问题所在,因为如果我注释掉 zsh 的执行,它就可以正常工作。

我的 zsh 中有几个别名和 PATH 修改,我想将其用作从 putty 执行的远程命令的一部分。如何将远程命令从 bash shell 传递到 zsh 以便在那里执行?

答案1

在某些(目前大多数)系统上,bash在构建时进行配置,以便当通过 ssh 运行时,即使在非交互模式下运行(例如运行where runs ¹ 时),也bash可以读取~/.bashrc(以及相应的系统范围的文件) 。/etcssh some commandsshdbash -c 'some command'

你可以做的就是在你的顶部添加~/.bash_custom

export SHELL="$(command -v zsh)" # tell everyone your preferred shell
case ${SSH_CONNECTION+s}:${-//[^ilc]}:$#:$SHLVL in
  (s:c:0:1) exec zsh -c -- "$BASH_EXECUTION_STRING";;
  (*:i:0:*) exec zsh;;
esac

当 bash 作为by运行时,它zsh使用相同的代码执行,而当 bash 交互运行时,它会单独执行。bash -c 'some code'sshdzsh

您可以将第二种情况限制为仅通过以下方式将 bash 作为登录 shell 调用的情况:

if shopt -q login_shell; then
  exec zsh
fi

和/或仅通过ssh替换*:i:0:*s:i:0:*


严格来说,它应该运行,bash -c -- 'some command'但由于有些 shell 不支持它(或者不需要,如 csh、fish、rc...),所以它不运行。

相关内容