我无法将命令参数远程传递给ssh中的“ForceCommand”程序。
在我的远程服务器中,我在sshd_config中有这个配置:
Match User user_1
ForceCommand /home/user_1/user_1_shell
user_1_shell程序限制用户可以执行的命令,在这种情况下,我只允许用户执行“set_new_mode param1 param2”。任何其他命令都将被忽略。
所以我希望当客户端通过ssh登录时,例如:
ssh user_1@remotehost "set_new_mode param1 param2"
似乎执行了user_1_shell程序,但似乎没有传递参数字符串。
也许,我应该问,ForceCommand真的支持这个吗?如果是,有关如何使其工作的任何建议?
谢谢。
我找到了答案。远程服务器捕获参数字符串并将其保存在“$ SSH_ORIGINAL_COMMAND”环境变量中。
正如已经回答的那样,从ssh客户端发送的命令行被放入SSH_ORIGINAL_COMMAND环境变量中,只执行ForcedCommand。
如果您在ForcedCommand中使用SSH_ORIGINAL_COMMAND中的信息,则必须注意安全隐患。攻击者可以通过发送例如任意附加命令来增强您的命令。 ; rm -rf /
在命令行的末尾。
This article显示了一个通用脚本,可用于锁定允许的参数。它还包含相关信息的链接。
描述的方法('only'脚本)的工作原理如下:
.onlyrules
文件放入user_1
的主目录中,并使用与ssh客户端发送的命令行匹配的规则(正则表达式)填充它。你的例子看起来像:
Match User user_1
ForceCommand /usr/local/bin/only /home/user_1/user_1_shell
例如,如果你想仅允许“set_new_mode”参数只包含两个字母数字任意参数,那么.onlyrules
文件将如下所示:
\:^/home/user_1/user_1_shell set_new_mode [[:alnum:]]\{1,\} [[:alnum:]]\{1,\}$:{p;q}
请注意,要将命令发送到服务器,您必须使用整个命令行:
/home/user_1/user_1_shell set_new_mode param1 param2
'only'在服务器上查找命令并使用其名称来匹配规则。如果其中任何一项检查失败,则不会运行该命令。
[披露:我写了sshdo,如下所述]
这是一个名为sshdo的程序。它控制可以通过传入的ssh连接执行哪些命令。它可以从以下网址下载:
http://raf.org/sshdo/ (read manual pages here)
https://github.com/raforg/sshdo/
它具有允许尝试所有命令的学习模式,以及--learn选项,以生成永久允许学习命令所需的配置。然后可以关闭学习模式,并且不会执行任何其他命令。
它还有一个--unlearn选项,可以停止允许不再使用的命令,以便在需求随时间变化时保持严格的最小权限。
它也可以手动配置。
对于它允许的内容非常挑剔。它不允许带有任何参数的命令。只允许完成shell命令。但它确实支持简单的模式来表示类似的命令,这些命令仅在命令行上出现的数字(例如序列号或日期/时间戳)之间变化。
它就像是ssh命令的防火墙或白名单控件。