如果您的登录Shell无法在某些计算机上执行,那么您将无法通过SSH或大多数其他方法登录。SSH服务器始终执行您的登录Shell。如果您在ssh
命令行上传递命令,那么将使用,-c
并以命令字符串¹作为参数来执行登录shell 。否则,登录外壳程序将作为不带参数的登录外壳程序执行。
如果有一种绕过登录外壳的方法,那将是一个安全漏洞。通过将其登录外壳设为仅执行一项特定任务的程序,可以将帐户配置为受限帐户。例如,登录外壳可能git-shell
仅允许访问git存储库或rssh
,等等。
要登录到该计算机,您需要安排/bin/zsh
存在,或者将您的登录Shell更改为存在的内容。
我建议在这样的异构环境中坚持使用/bin/sh
登录shell,因为它无处不在。将SHELL
环境变量设置为(/bin/zsh
如果存在),这样您将获得zsh作为交互式shell。
if [ -x /bin/zsh ]; then
export SHELL=/bin/zsh
fi
在使用时,这可以避免硬编码到的路径zsh
。
if SHELL=$(command -v zsh); then
export SHELL
else
unset SHELL
fi
要使zsh自动以文本模式登录运行,请从中调用它.profile
。如果要使用它.zprofile
进行设置,请将其设置为登录外壳程序(但是,在没有zsh的计算机上您将无法获得相同的环境,因此我不建议这样做)。仅当这是交互式登录时,才.profile
执行此操作,而不是在脚本执行您的操作时,在GUI模式登录时等。
if case $- in *i*) true;; *) false;; esac && # interactive shell
[ -z "$ZSH_VERSION" ] && # not running zsh yet
type zsh >/dev/null 2>/dev/null; then # zsh is present
exec zsh
fi
¹SSH 客户端在其非选项参数之间使用空格连接起来,然后通过连接发送结果字符串。SSH协议将命令定义为字符串,而不是字符串列表。
/bin/sh
,然后将远程~/.profile
exec 用作适当的Shell(如果可用)?