【问题标题】:Is it a good practice to execute terminal commands from a Perl or PHP script? [duplicate]从 Perl 或 PHP 脚本执行终端命令是一种好习惯吗? [复制]
【发布时间】:2016-05-11 16:48:20
【问题描述】:

就像使用反引号或exec()system() 执行命令一样。

【问题讨论】:

  • 这个范围很广。一般来说,如果语言有一个内置的方法来做某事,你应该使用它而不是产生一个子进程,但是有很多例外,有时你唯一的选择是运行一个外部命令。你有一个具体的例子吗?
  • 最好不要简短回答。但是,如果您必须确保正确筛选用户输入以避免任何包含攻击。并且不以超级用户身份执行任何操作

标签: language-agnostic


【解决方案1】:

是的,这在几乎所有情况下都是不好的做法!如果您有选择,尤其如此。

执行外部命令是:

  • 非常很难正确完成(但很容易获得某种工作)。您不能只是逃避 shell args 并收工,您必须考虑潜在不同语言的潜在多级转义。

  • 。一个 fork+exec 到例如rm 比相应的系统调用慢一千倍。

  • 一个刚性、容易出错且缺乏表达力的集成点。您通常必须将数据转换为字符串的平面列表并返回。您不能使用该语言的功能,例如异常处理、嵌套数据结构或回调。

因此,以下是调用外部命令的不好的原因

  • 不知道如何用您的语言执行 X,但知道它的 shell 命令。一个典型的例子是cp -R foo bar

  • 不知道某些东西是如何工作的,但知道一个 shell oneliner 可以做到这一点。一个典型的例子是foo *.mp4 > >(tee file)

  • 不想学习新的 API,例如json 或 http,而是使用 jqcurl 等 shell 工具。

但是,如果您正在调用的程序执行不平凡的事情,没有本机库或绑定,并且您知道如何使用 execve 语义调用(不是 system 或 perl @987654328 @ 调用 shell 的语义),这是一个有价值的工具。

执行上述所有外部命令的良好用法示例是调用 make 从安装程序构建项目,或运行 java -jar ... 以启动 Minecraft 服务器。

【讨论】:

    【解决方案2】:

    这是一个很棒的*练习。 Perl 和 PHP 在很多事情上都很棒,但它们并不是在所有事情上都很棒,并且有一个在您的项目中使用外部程序和其他工具的用例。但是 Perl 绝对擅长的一件事是将输入和输出格式粘合在一起,让您将几个不同的工具混合到一个项目中,让项目的每个部分都做他们最擅长的事情。

    * 我的意思是,这通常是一种很好的做法。 @files=qx(ls $dir)@txt=qx(cat $textfile) 之类的东西让所有思想正确的 Perl 程序员畏缩不前。

    【讨论】:

      【解决方案3】:

      某些操作系统命令可能具有语言中不可用的内置功能(Perl 的 mkdir() 缺少 *ix mkdir 的 -p)。再说一次,使用语言结构而不是解析输出(readdir() 与 ls)可能更容易做到。

      重要的是要记住,用 Perl 编写的东西可能比调用特定于操作系统的外部程序更容易移植到非 Unix 系统。

      【讨论】:

      • mkdir -p 不是一个很好的例子,因为 Perl 在核心中有 File::Path::make_path
      • 只是指出特别是 gnu 版本的命令有许多开关,这些开关具有 perl 函数中不可用的功能。当然,所有东西都有模块,但你必须包含它们......
      【解决方案4】:

      为什么不呢?

      但是,要小心并转义插入命令中的所有字符串:

      【讨论】:

        猜你喜欢
        • 2015-01-08
        • 1970-01-01
        • 2018-11-20
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 2013-10-21
        相关资源
        最近更新 更多