【问题标题】:Create an executable that calls another executable?创建一个调用另一个可执行文件的可执行文件?
【发布时间】:2014-07-03 16:24:49
【问题描述】:

我想制作一个小应用程序,针对不同的输入参数多次运行另一个应用程序。

  1. 这已经完成了吗?
  2. 每次调用都使用system("myAp param")是不是错了(当然param值不同)?

我在 Linux-Ubuntu 上使用 kdevelop。

从您的 cmets 中,我了解到,而不是:

system("path/to/just_testing p1 p2");

我将使用:

execl("path/to/just_testing", "path/to/just_testing", "p1", "p2", (char *) 0);

这是真的吗?你是说execlsystem更安全,更好用?

【问题讨论】:

  • 这就是xargs 的用途。
  • 执行此操作的传统方式类似于forkexec,但system 也同样有效。
  • 如果“myAp”或“param”来自潜在的恶意用户,则可能存在问题。
  • @Sneftel 你能发布一个使用 xargs 的示例的链接吗?听起来不错

标签: c++ linux gcc


【解决方案1】:

系统和执行之间的差异

  • system() 将调用默认命令 shell,该命令将执行作为参数传递的命令。

    你的程序会停止,直到命令被执行,然后它会继续。

    返回的值不是命令本身的成功,而是命令shell的正确打开。

    system() 的一个优点是它是part of the standard library

  • 使用exec(),您的进程(调用进程)被替换。此外,您不能调用脚本或内部命令。你可以遵循一个常用的技巧:Differences between fork and exec

所以它们是完全不同的(有关更多详细信息,您可以查看:Difference between "system" and "exec" in Linux?)。

正确的比较是在 POSIX spawn()system() 之间进行。 spawn() 更复杂,但它允许读取外部命令的返回码。

安全

system()(或popen())可能存在安全风险,因为可以修改某些环境变量(如$IFS / $PATH),以便您的程序将执行您从未打算执行的外部程序(即命令指定时没有路径名,攻击者可以访问命令处理器路径名解析机制。

system() 函数也可能导致可利用的漏洞:

  • 在传递源自受污染源的未经处理或处理不当的命令字符串时;
  • 如果指定了可执行文件的相对路径并且攻击者可以访问对当前工作目录的控制;
  • 如果指定的可执行程序可以被攻击者欺骗。

更多详情:ENV33-C. Do not call system()

无论如何...我喜欢 Somberdon 的回答。

【讨论】:

    【解决方案2】:

    在非专业领域,使用system() 是完全可以接受的,但请注意,人们总是会告诉你这是“错误的”。这没有错,这是一种解决问题的方法,不会变得太复杂。是的,这有点草率,但肯定仍然是一个可用的(如果不那么便携)选项。 system() 调用返回的数据将是您正在调用的应用程序的返回值。根据您帖子中的有限信息,我认为这就是您真正想知道的全部内容。

    【讨论】:

    • 在一个伟大的想法,是的。但是如何使用其他方法呢?
    • 人们喜欢安全软件,system() 是一个等待被利用的巨大安全漏洞
    • 我必须同意上面的 Rook:forkexec 是运行另一个程序并访问其数据的最典型的方式。不过,我对 Unix 的了解有点生疏,所以我不愿意为每个人提供详细的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多