我正在从 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
(以及相应的系统范围的文件) 。/etc
ssh some command
sshd
bash -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'
sshd
zsh
您可以将第二种情况限制为仅通过以下方式将 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...),所以它不运行。