像执行execve一样执行任何命令行shell

时间:2015-11-03 15:41:01

标签: c

如果这有用,这是我的环境:debian 8,gcc(使用std = gnu99)。

我面临以下情况: 在我的C程序中,我得到一个字符串(char *通过套接字)。 此字符串表示要执行的bash命令(如'ls ls')。 此命令可以是任何bash,因为它可能很复杂(管道,列表,复合命令,协同处理,shell函数定义......)。 我无法使用system或popen来执行此命令,因此我使用当前的execve。

我担心的是我必须“过滤”某些命令。 例如,对于rm命令,我只能在“/ home / test /”目录中应用它。禁止所有其他目的地。

所以我必须阻止命令“rm -r /”,但也要“ls ls&& rm -r /”。 所以我必须解析给我的命令行,找到所有命令并对它们应用过滤器。

那时我才真正迷失方向。

该命令可以是任何复杂的,所以如果我想创建管道(execve一次执行一个命令)或者如果我想找到所有用于应用我的过滤器的命令,我将必须开发与之相同的解析器sh。

我不喜欢再次制作轮子,特别是如果我把它制成方形的话。 所以我想知道C库(或者gnu)中是否有一个功能。

我听说过wordexp,但是我没有看到如何管理管道,重定向或其他(事实上,这似乎没有为此做出)并且我看不出如何在命令行中检索所有命令。 / p>

我读了sh(1)的人,看看我是否可以用它来“解析”但不执行命令,但到目前为止,我一无所获。

我是否需要从头开始编写解析器?

感谢您的阅读,我为我糟糕的英语道歉:这不是我的母语(感谢谷歌翻译......)。

1 个答案:

答案 0 :(得分:0)

你的问题:

  

我遇到以下情况:在我的C程序中,我得到一个字符串   (char *通过套接字)。此字符串表示要执行的bash命令   (比如' ls ls')。此命令可以是任何bash,因为它可能很复杂   (管道,列表,复合命令,协同处理,shell函数   定义......)。

您如何计划验证谁位于套接字连接的另一端?

出于安全考虑,您需要实现命令解析器吗?显然是远程运行命令,如#34所暗示的那样;我得到一个字符串(char *通过套接字)"?

真正的解决方案:

How to set up SSH without passwords

  

您的目标

     

您希望使用Linux和OpenSSH自动执行任务。因此   您需要从主机A /用户a到主机B /用户b自动登录。   您不想输入任何密码,因为您想要调用ssh   来自shell脚本。

严重。

你是如何解决这个问题的:

  

我在套接字上收到一个shell命令,我必须这样做   执行它。但在执行之前,我必须确保没有   一个与所有规则相冲突的命令(例如,仅在此范围内的命令   目录等等)。为了执行命令,我不能使用系统或   popen(我使用execve)。其余的由我决定。

鉴于

  

当我开始迷失的时候。

因为您要求做的是实现安全功能和命令解析。去查看SSH和bash中的代码量。

您的操作系统附带安全功能。 SSH进行身份验证。

不要试图重新发明这些。你不会做得好 - 没人能做到。看看bash和SSH花了多长时间才能获得安全性。 (提示:它已经几十年了因为在第一次编码时,bash和SSH中已经存在数十年的历史和知识......)