我目前在使用 LDAP 进行身份验证的网络中工作。设置zsh为我的登录 shell 后,我遇到了通过远程访问ssh网络上一台显然没有zsh安装的机器的问题。登录失败
Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist
所以问题基本上是:如何告诉远程机器使用与 LDAP 中配置的不同的登录 shell?
OpenSSH_6.0p1 Debian-4+deb7u2,OpenSSL 1.0.1e
Gil*_*il' 12
如果您的登录 shell 无法在某些机器上执行,那么您将无法通过 SSH 或大多数其他方法登录它。SSH 服务器始终执行您的登录 shell。如果您在ssh命令行上传递命令,则登录 shell 将使用-c命令字符串¹作为参数执行;否则登录 shell 将作为没有参数的登录 shell 执行。
如果有办法绕过登录shell,那将是一个安全漏洞。可以将帐户配置为受限帐户,方法是将其登录 shell 设置为仅执行一项特定任务的程序;例如,登录 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
Run Code Online (Sandbox Code Playgroud)
当您使用它时,这可以让您避免对zsh.
if SHELL=$(command -v zsh); then
export SHELL
else
unset SHELL
fi
Run Code Online (Sandbox Code Playgroud)
要让 zsh 为文本模式登录自动运行,请从您的.profile. 如果您想用于.zprofile设置,请将其设置为登录 shell(但是在没有 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
Run Code Online (Sandbox Code Playgroud)
¹ SSH 客户端使用其间的空格连接其非选项参数,并通过连接发送结果字符串。SSH 协议将命令定义为字符串,而不是字符串列表。