如果这有用,这是我的环境: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)的人,看看我是否可以用它来“解析”但不执行命令,但到目前为止,我一无所获。
我是否需要从头开始编写解析器?
感谢您的阅读,我为我糟糕的英语道歉:这不是我的母语(感谢谷歌翻译......)。
答案 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中已经存在数十年的历史和知识......)