4

我无法将命令参数远程传递给 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 真的支持这个吗?如果是的话,有什么关于我如何使它工作的建议吗?

谢谢。

4

3 回答 3

3

我找到了答案。远程服务器捕获参数字符串并将其保存在“$SSH_ORIGINAL_COMMAND”环境变量中。

于 2014-08-20T21:04:49.537 回答
0

正如已经回答的那样,从 ssh 客户端发送的命令行被放入 SSH_ORIGINAL_COMMAND 环境变量中,只执行 ForcedCommand。

如果您在 ForcedCommand 中使用 SSH_ORIGINAL_COMMAND 中的信息,则必须注意安全隐患。; rm -rf /攻击者可以通过在命令行末尾发送例如任意附加命令来增强您的命令。

本文展示了一个通用脚本,可用于锁定允许的参数。它还包含相关信息的链接。

所描述的方法(“唯一”脚本)的工作原理如下:

  1. 将“唯一”脚本设为 ForcedCommand,并将允许的命令作为其参数。请注意,可以使用一个以上允许的命令。

  2. .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' 在服务器上查找命令并使用其名称来匹配规则。如果这些检查中的任何一个失败,则不会运行该命令。

于 2017-03-12T21:22:05.823 回答
0

[披露:我写了下面描述的 sshdo]

有一个名为 sshdo 的程序可以做到这一点。它控制哪些命令可以通过传入的 ssh 连接执行。可在以下位置下载:

http://raf.org/sshdo/ (read manual pages here)
https://github.com/raforg/sshdo/

它有一个学习模式来允许所有尝试的命令,以及一个 --learn 选项来生成永久允许学习命令所需的配置。然后可以关闭学习模式,并且不会执行任何其他命令。

它还有一个 --unlearn 选项来停止允许不再使用的命令,以便在需求随时间变化时保持严格的最低权限。

也可以手动配置。

它对它允许的内容非常挑剔。它不允许带有任何参数的命令。只能允许完整的 shell 命令。但它确实支持简单的模式来表示类似的命令,这些命令仅在命令行上出现的数字(例如序列号或日期/时间戳)中有所不同。

它就像 ssh 命令的防火墙或白名单控制。

于 2019-04-23T02:07:08.027 回答