如何从服务器端禁用 ssh 非交互式命令?

如何从服务器端禁用 ssh 非交互式命令?

目前我有一个安装了 openssh7.1 的服务器,它支持非交互式命令,例如:ssh user@server ls。有没有办法在服务器端禁用此类命令?

答案1

ForceCommand关键字sshd_config

ForceCommand
强制执行 ForceCommand 指定的命令,忽略客户端提供的任何命令(~/.ssh/rc如果存在)。使用带有-c选项的用户登录 shell 调用该命令。这适用于 shell、命令或子系统执行。它在 Match 块内最有用。客户端最初提供的命令在SSH_ORIGINAL_COMMAND环境变量中可用。[…]

来源

如果你像这样使用它:

ForceCommand    exec /bin/sh -i

那么你将强制使用 interactive sh。这种简单的方法至少存在两个问题:

  1. 我还没有找到任何简单的方法通过配置服务器来强制分配 tty。客户端可以选择,服务器可以允许或拒绝(使用PermitTTY)。当强制交互时sh,强制分配 tty 应该是好的。我可能漏掉了一些东西;这没关系,因为另一方面……
  2. 尝试运行非交互式命令的客户端不期望交互式 shell。禁用此类命令的更好方法是使其失败。这可能就是您想要的。

所以:

ForceCommand    if [ "$SSH_ORIGINAL_COMMAND" ]; then echo "this server rejects non-interactive ssh usage" >&2; exit 1; else exec "$SHELL" -i; fi

笔记:

  • ForceCommand使用带有选项的用户登录 shell -c。我们的命令使用可移植语法,它应该可以在许多 shell 中工作。如果用户可以选择非标准的东西作为其登录 shell,则命令可能会出现问题。考虑将命令放入脚本中(使用适当的 shebang)并执行脚本(ForceCommand /path/to/the_script)。

  • $SHELL很可能会按预期工作,但我认为 POSIX 并不严格要求该变量。您可能更喜欢${SHELL:-/bin/sh}或类似的内容。

相关内容