【问题标题】:How to wrap command arguments with /bin/sh -c and execvpe()如何使用 /bin/sh -c 和 execvpe() 包装命令参数
【发布时间】:2014-06-16 23:40:41
【问题描述】:

目前我正在尝试编写一个程序,该程序接受来自用户的自定义命令和参数并执行它。

我正在尝试使用可以同时传入命令参数和环境的 execvpe。

但是,在我的情况下,我无法弄清楚调用 execvpe 的正确方法是什么。

例如这个命令输入:ps aux

我不想构建命令字符串,因为我需要小心转义引号和分号(即:JSON 字符串),理想情况下只是将其作为数组中的一个 arg 传递。

我看到我可以直接在 bash 中运行它的唯一方法是这样的:

/bin/sh -c "ps \$0" aux

但是,我尝试将其转换为 execvpe:

char * argv[] = { "sh", "-c", "\"ps \\$0\"", "aux", NULL };
execve("/bin/sh", (char **)argv, NULL);

但是这给了我一个错误:

aux: ps $0: command not found

用 execvpe 制定这个的正确方法是什么?

【问题讨论】:

    标签: c linux bash shell


    【解决方案1】:

    您在 C 代码中所做的相当于:

    $ bash -c '"ps \$0"' aux
    aux: ps $0: command not found
    

    您不能反斜杠双引号和美元符号。试试这个:{ "sh", "-c", "ps $0", "aux", NULL }

    附:我能闻到你正在尝试做的事情非常脆弱。

    【讨论】:

    • PPS。 strace 非常方便调试 execve 问题。
    • 我实际上尝试过不使用斜线,但也没有用。是的,它有点脆弱,但我们确实在这些方面有额外的安全措施。
    猜你喜欢
    • 2021-10-16
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2016-05-17
    • 2020-06-03
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多