【发布时间】:2015-11-04 02:13:56
【问题描述】:
如果这有帮助,这是我的环境:debian 8,gcc(使用 std = gnu99)。
我面临以下情况: 在我的 C 程序中,我得到一个字符串(通过套接字的 char*)。 此字符串表示要执行的 bash 命令(如“ls ls”)。 该命令可以是任何 bash,因为它可能很复杂(管道、列表、复合命令、协同进程、shell 函数定义......)。 我不能使用system或popen来执行这个命令,所以我使用current execve。
我担心我必须“过滤”某些命令。 例如,对于 rm 命令,我只能将其应用于“/home/test/”目录。禁止所有其他目的地。
所以我必须阻止命令“rm -r /”但也阻止“ls ls && rm -r /”。 所以我必须解析给我的命令行,找到所有的命令并对它们应用过滤器。
那是我开始真正迷失的时候。
命令可以是任何复杂的,所以如果我想创建管道(一次执行一个命令)或者如果我想找到所有命令来应用我的过滤器,我将不得不开发与之相同的解析器嘘。
我不喜欢再造轮子,尤其是当我把它做成方形的时候。 所以我想知道 C 库(或 gnu 的库)中是否有一个特性。
我听说过 wordexp,但我不知道如何管理管道、重定向或其他(事实上,这似乎不是为此而设计的),我不知道如何检索命令中的所有命令。
我读了 sh(1) 的 man 看看我是否可以用它来“解析”但不能执行命令,但到目前为止,我什么也没找到。
我需要从头开始编写解析器吗?
感谢您的阅读,我为我糟糕的英语道歉:这不是我的母语(感谢谷歌翻译...)。
【问题讨论】:
-
为什么不为您的目录创建一个具有有限权限的用户并使用该用户执行命令?
-
rm 只是一个例子。这个想法是我必须对任何命令应用任何过滤器。过滤器的规则不由我决定,所以如果有一天过滤器说“不能在包含字母'a'的路径上执行ls”,那么我必须应用这个规则。
-
@RemiThomas 我的建议是您下载Source code of Bash 并从中获取您需要的部分(词法分析器、解析器、分叉器、吹笛者),然后在其之上构建一个规则堆栈器(像 ipchains 之类的东西)。从头开始创建所有这些将花费您大量的时间和工作。当然,您始终可以通过将输入字符串拆分为
;、|、&&等然后通过规则堆栈器运行它来创建更简单的词法分析器/解析器版本。 -
感谢您的提示。我认为分析和理解源代码需要很多时间,但它比从头开始编码要短得多。但是我很惊讶这还不可用……我不是第一个想要完整的 sh 解析器的人。我是吗?
-
@RemiThomas Bash 是完整的 SH 解析器。如果您想要 full bash 语法,则必须从中获取代码。否则,您最终只会得到其中的一小部分。我认为你真的应该重新考虑你的程序的设计......为什么不让它成为 bash 的包装器,用它自己的语法呢?换句话说,抽象 BASH。让你拥有自己的语法。喜欢
list foo或delete file.c。包装将使您可以很好地控制执行的内容和不执行的内容。这是学校项目还是个人/工作项目?
标签: c