目前我有一个安装了 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
。这种简单的方法至少存在两个问题:
- 我还没有找到任何简单的方法通过配置服务器来强制分配 tty。客户端可以选择,服务器可以允许或拒绝(使用
PermitTTY
)。当强制交互时sh
,强制分配 tty 应该是好的。我可能漏掉了一些东西;这没关系,因为另一方面…… - 尝试运行非交互式命令的客户端不期望交互式 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}
或类似的内容。