如何使用非默认登录Shell进行ssh登录


9

我目前正在使用LDAP进行身份验证的网络中工作。设置zsh为登录外壳后,我遇到了一个问题,即可以远程访问ssh网络上显然没有zsh安装的其中一台计算机。登录失败并显示

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

因此,问题基本上是:我如何告诉远程计算机使用与LDAP中配置的登录外壳不同的登录外壳?

OpenSSH_6.0p1 Debian-4 + deb7u2,OpenSSL 1.0.1e


您是否考虑过将LDAP Shell更改为更通用的名称,例如/bin/sh,然后将远程~/.profileexec 用作适当的Shell(如果可用)?
罗伯特·L

那将是一个选择,但不是一个很干净的选择,所以我宁愿避免使用它。
Sascha 2015年

Answers:


11

如果您的登录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协议将命令定义为字符串,而不是字符串列表。


感谢您的详细解释。看起来这是唯一的方法,它不涉及在远程计算机上安装zsh,而且效果很好,因此我会坚持下去。
Sascha 2015年

我还建议添加一个测试[ "0$SHLVL" -lt 2 ],以防默认登录外壳程序支持,$SHLVL以便bash -l在需要时可以运行另一个外壳程序(例如,如果zsh由于某种原因失败)。这样ssh -t host bash -l就可以在bash不执行zsh的情况下运行登录shell。另外,我将替换为exec zshexec zsh -l以使.zlogin文件来源。
vinc17

2

如果您可以通过其他方式访问该外壳,则必须将其安装在指定的计算机上,或者要求管理员为您执行此操作,或者将ldap中的外壳更改为远程计算机上存在的外壳。

(open)sshd将始终检查用户外壳程序,并将始终执行该外壳程序,无论传递了什么内容来执行。如果传递了另一个外壳程序来执行,它将执行该外壳程序作为参数传递给用户外壳程序,例如,用户外壳程序是'/ bin / sh',而您将csh shell作为参数传递给它,则它将运行“ / bin / sh -c / bin / csh'。


阅读redfast评论。openssh确实允许您绕过默认Shell。
Rui F Ribeiro

@Rui F Ribeiro如果这样做的话,将删除将shell设置为“ / bin / false”或“ / sbin / nologin”之类的逻辑。如果您指的是在登录后更改shell而不是ok,但是它确实像我上面写的那样(sh -c othersh),如果没有'/ bin / sh',那么您就不走运了。(在Redhat上测试)。
nkms

的确如此,如果passwd的外壳未在/ etc / shells中列出,则无论如何您都不会登录。但是,如果您能够登录,并且除非sshd_config不会强迫您使用特定的shell,那么用户可以运行的任何命令都是公平的游戏。例如,如果再进行几次测试,ssh -l user server "ps ax" | grep bash则很容易注意到默认的外壳并不总是被调用。真正阻止其他解决方案起作用的是zsh不在/ etc / shells中的安全检查
Rui F Ribeiro

@Rui F Ribeiro在服务器端运行strace -f sshd。你会看到类似“的execve(”/斌/庆典“[ ”庆典“, ”-c“, ”PS“] ......”此外,/ sbin目录/ nologin的是一个有效的壳/ etc / shells中。
nkms 2015年

@RuiFRibeiro redfast00的答案是完全错误的。nkms是正确的。
吉尔(Gilles)“所以,别再邪恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.