使用多个参数调用 shell 命令

2023-12-02

我正在尝试通过 Perl 脚本自动创建证书。

我要运行的命令是:

easyrsa build-client-full $clientname nopass

我认为应该在 Perl 中完成的方式是:

   my $arguments = ("build-client-full $clientname nopass");       
   my $cmd = "$easyrsa_path/easyrsa"." "."$arguments";
   system("bash", $cmd);

然而,这会产生

“文件未找到”

关于执行。我三次检查路径是否正确。

如果我尝试这样:

   my @arguments = ("bash", $easyrsa_path,"build-client-full $clientname nopass");
   system(@arguments);

重击回归

“未知命令‘build-client-full test nopass’。无需命令即可运行 以获得使用帮助。”


背景

当你使用system(LIST) where LIST如果有多个元素,Perl 不会调用 shell,而是直接调用第一个元素给出的程序LIST,并使用列表的其余部分作为要传递的命令行参数verbatim, with no由 shell 进行插值,包括no根据空格分割参数。

所以在你的第一个例子中,Perl 正在运行命令bash并传递字符串"$easyrsa_path/easyrsa build-client-full $clientname nopass",字面意思是one很长的参数,在你的第二个例子中,它正在运行命令bash并传递两个参数$easyrsa_path and "build-client-full $clientname nopass"。但是,我假设easyrsa需要将三个参数作为其参数列表中的单独字符串,shell 通常会将其拆分,但由于您的两次调用system没有使用 shell,它不起作用。

system (and exec)根据文档有四种解释其参数的方法:

  1. 如果您传递单个字符串(包括LIST只有一个元素)不包含任何 shell 元字符,它被分割成单词并直接传递给execvp(3)(意味着它绕过了外壳)。Warning:此调用很容易与以下内容混淆 - 单个元字符将导致调用 shell,这可能很危险,尤其是在将未经检查的变量插入命令字符串时。

  2. 如果您传递单个字符串(包括LIST(只有一个元素)确实包含 shell 元字符,整个参数将传递到系统的命令 shell 进行解析。通常情况下,那就是/bin/sh -c在 Unix 平台上,但是“默认 shell”的想法是有问题的,并且当然不能保证它会是bash(虽然它could be).

    Warning:在这个调用中system,您拥有 shell 的全部功能,这也意味着您有责任正确引用和转义任何 shell 元字符和/或空格。我推荐你only如果您使用此表格明确想要shell 的能力,否则,通常最好使用以下两者之一。

  3. 如果有多个参数LIST,这称为execvp(3)与参数LIST,意味着避免使用 shell。 (有关 Windows 上的注意事项,请参阅下文。)

  4. 表格system {EXPR} LIST always运行名为的程序EXPR并避开外壳,无论里面有什么LIST。 (有关 Windows 上的注意事项,请参阅下文。)

如果您想传递 shell 通常会解释的特殊字符,则后两者是可取的,而且我实际上总是建议这样做,因为盲目地将用户输入传递到system可以打开一个安全漏洞 - 我写了一篇更长的文章关于 PerlMonks.

解决方案

@Borodin 和 @AnFi 已经指出:如果你简单地将LIST正确地,它应该可以工作 - 看起来你不需要任何功能bash或这里的任何外壳。并且不要忘记检查错误!

system("$easyrsa_path/easyrsa","build-client-full",$clientname,"nopass") == 0
    or warn "system failed: \$? = $?";

请注意,有一些很好的模块提供了的替代品system and qx,我的首选模块通常是IPC::Run3。如果您想捕获外部命令的输出,这些模块非常有用。在这种情况下,IPC::System::Simple可能会更容易,因为它提供了一个直接替代品system具有更好的错误处理能力,以及systemx它总是避开外壳。 (该模块是什么autodie当你说时使用use autodie ':all';.)

use IPC::System::Simple qw/systemx/;
systemx("$easyrsa_path/easyrsa","build-client-full",$clientname,"nopass");

请注意,如果您really想打电话bash,你需要添加-c选项并说system("bash","-c","--","$easyrsa_path/easyrsa build-client-full $clientname nopass")。但正如我上面所说,我强烈建议不要这样做,因为如果$easyrsa_path or $clientname包含任何 shell 元字符或恶意内容,您最终可能会遇到一个大问题。

Windows

Windows 比上面的更复杂。该文档说,避免调用 shell 的唯一“可靠”方法是system PROGRAM LIST形式,但在 Windows 上,命令行参数不是作为列表传递,而是作为单个大字符串传递,并且由被调用的命令而不是 shell 来解释该字符串,并且不同的命令可能会以不同的方式执行此操作 -see also。 (我听说过一些好消息Win32::ShellQuote, 尽管。)

另外,还有一个特别的system(1, @args)表格记录在perlport.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用多个参数调用 shell 命令 的相关文章

  • 使用 Perl 获取 值

    因此 我有一个报告工具 可以在 HTML 文件中输出作业调度统计信息 并且我希望使用 Perl 来使用这些数据 但我不知道如何单步浏览 HTML 表 我知道如何使用 jQuery 来做到这一点 find tr each function v
  • 根据插入顺序迭代哈希?

    不想对条目进行排序 使用它也不会保留顺序 foreach my val keys hash 默认情况下 Perl 5 中的哈希值是无序的 您可以使用tie http perldoc perl org functions tie html a
  • Perl 的 caller() 函数返回错误的行号

    我在 Perl 5 10 1 上运行了以下脚本 usr bin perl use strict use warnings foreach my x 0 x lt 1 x Line 5 print line Line 6 sub print
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 打包 Perl 应用程序,以便它可以在 Perl 的默认前缀之外工作

    我正在使用 Module Build 尽管我在构建环境上很灵活 来打包我正在编写的一些 Perl 软件 供我工作的内部使用 它包括一些脚本和一些辅助模块 我的计划是这样你就可以指定任何你想要的前缀 即perl默认值之外的东西 INC 在构建
  • 在 Google 表格应用程序中进行身份验证

    我有一个类似批处理的应用程序 由调度程序定期调用 无需人类用户参与 它使用 PerlNet Google 电子表格 http metacpan org pod Net Google Spreadsheets包通过从数据库获取的数据来更新 G
  • 使用正则表达式提取两个短语之间的所有单词[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下正则表达式提取两个短语之间的所有单词 b item W w W 0 2 1 one W w W 0 3 business b b item W w W 0 2 3 three W w W 0 3
  • 在perl中更改多维哈希的第一个键

    我在 perl 中有一个多维哈希 我想更改所选值的第一个键 例如 我有哈希 my Hash1 Hash1 1 12 1 Hash1 1 10 1 Hash1 2 31 1 Hash1 3 52 1 Hash1 3 58 1 Hash1 4
  • 如何打印v字串?

    如何打印v字串 our VERSION v2 1 print VERSION n n 打印笑脸 打印 v 字符串是什么意思 你想要什么输出 你可以这样做 printf vd VERSION prints 2 1 or this print
  • Excel 保存制表符分隔的文件而不换行 (UNIX/Mac os X)

    这是我遇到的一个常见问题 我的解决方案有点鲁莽 所以我正在寻找问题的快速解决和解释 问题是 当我决定将 Excel mac 2011 中的电子表格保存为制表符分隔文件时 它似乎做得很好 直到我尝试使用 Perl 逐行解析文件 由于某种原因
  • 如何在 grep 中每个文件匹配一次?

    是否有任何 grep 选项可以让我控制匹配总数 但在每个文件的第一个匹配处停止 Example 如果我这样做grep ri include coffee re 我明白了 app coffee express require express
  • LibXML findnodes($query)

    我在使用这段代码时遇到了一些问题 my file xml news xml my parser XML LibXML gt new my doc parser gt parse file file my xpc XML LibXML XPa
  • 如何获取可在 \N{} 中使用的所有值来生成特定的代码点?

    在执行调试时这个问题 https stackoverflow com questions 41738241 perl unknown charname nalpha 我问自己 如何找到我可以使用的所有值 N 对于给定的 Unicode 代码
  • 为什么有关严格 subs 的错误仅在 autodie 下触发?

    鉴于这样的代码 我没有收到任何警告 use strict use warnings open STDERR gt STDOUT 鉴于此代码 我收到一个致命错误 use strict use warnings use autodie open
  • 如何引用 Perl 子例程?

    我在弄清楚如何引用外部模块文件中的子例程时遇到了一些麻烦 现在 我正在这样做 外部文件 package settingsGeneral sub printScreen print 0 Main use settingsGeneral my
  • 替换字符串中的重复字符串

    我正在尝试查找 并替换 字符串中重复的字符串 我的字符串可以是这样的 Lorem ipsum dolor 坐阿梅特坐 阿梅特坐 阿梅特坐诺斯特鲁德实习amit situllamco Laboris nisi ut aliquip ex ea
  • Perl 中的 -> 箭头有什么作用?

    我不断看到 gt 在代码中 我不太确定它的含义 例如 top links m gt links 这条线有什么作用 另外 我可以在哪里阅读相关内容 See 箭头操作员 http perldoc perl org perlop html The
  • Perl 中的异常有什么问题?

    中的讨论另一个问题 https stackoverflow com questions 2164614 what should i do if a moose builder method fails让我想知道 其他编程语言的异常系统有哪些
  • 如何使用 Perl 获得两个时间戳的差异?

    在这里我基于一个问题 我有两个格式相同的时间戳 例如 2010年12月14日星期二18 23 19 2010年12月14日星期二17 23 19 我怎样才能得到两个时间戳的小时数之差 请帮我 use Date Parse my t1 Tue
  • PostgreSQL - 插入包含数组的复合类型数组

    我有一个包含 TEXT 数组等的复合类型 我在主表中使用它来创建复合类型的数组 如何生成 INSERT 命令 不使用复合类型的默认字段名称 我可以使用复合数组创建一个临时表 然后将其插入主表吗 例如 DROP TABLE collectio

随机推荐

  • Font Awesome 图标未显示在我使用 Bootstrap4 制作的网页上

    我正在做一个使用 Bootstrap 4 CDN 的网页我打算用FontAwesome 图标用于我的社交媒体链接 但是打开页面时我看到一些蓝色盒子而不是图标和它们是实用的 我只需要显示图标 任何帮助 将不胜感激 以下是必要的片段 1
  • 如何将 IO::Scalar 与 Image::Magick::Read() 一起使用?

    我有一张经过处理的图像GD 图像我想做进一步的操作图片 魔法 我想避免将图像写入磁盘 以便 Image Magick 可以将其读入 Image Magick 的 Read 函数将接受文件句柄作为参数 因此我尝试向其传递 IO Scalar我
  • az acr - 如果单个帐户有多个订阅,则无法找到存储库

    我在用着Azure CLI v2 0 62 我在 Azure 中的单个帐户上确实有多个订阅 S1 S2 S3 S4 我正在执行以下脚本以将动态值插入存储库 az login az acr build ParentStorage platfo
  • 根据 C# 中创建的日期搜索文件

    我有一个函数 用于读取目录并获取具有特定搜索模式的文件 有没有办法使用基于创建日期或修改日期的搜索模式 public static List
  • Android 中的地理围栏触发问题

    我正在使用 Android 设备的本机地理围栏服务 以下是实施细节 跟踪转换类型 ENTER 范围 500 米 1640 英尺 通知响应时间 500ms 添加地理围栏数量 15 20 初始触发 setInitialTrigger 未设置 设
  • 在 g-recaptcha-response 中获取 Null Google 的 reCaptcha

    我正在尝试实现 Google 的 reCaptcha v 2 0 但我在中得到 nullg recaptcha 响应由于此 reCaptcha 无法正常工作 我总是收到以下错误请单击 reCAPTCHA 框 即使我成功提交了验证码 我var
  • gnuplot 指定标签列

    我正在 gnuplot 中做一个多重绘图 我想从某些列中选择点的标签 例如 假设数据文件是 year temp label1 year humidity label2 1990 30 hot 1991 100 wet 1992 25 war
  • PHP 缓存的最佳方式

    目前 我正在尝试编写一个关于电子商务的软件 我的数据通常只是 MySQL 查询 例如语言变量结果 错误号猫 gt No category found 在 PHP 中缓存这些数据的最佳且简单的方法是什么 apc
  • 将字符串列表转换为列表列表,列表列表中的每个元素作为字符串中的每个可迭代字母。全部排成一行

    使用字符串 x 列表 x foo bar 我怎样才能在一行中完成以下操作 y for word in x y append n for n in word print y 导致 f o o b a r With list和简单的列表理解 g
  • 在回调函数中访问 $(this)

    我正在努力将prompt 更改为jPrompt 因为IE阻止prompt 运行 问题是 this 不再正常工作 因为 jPrompt 不返回值 而是使用回调函数 假设我有这样的东西 它有效 a foo click function this
  • Jupyter 笔记本并排显示两个 pandas 表

    我有两个 pandas 数据框 我想在 Jupyter 笔记本中显示它们 做类似的事情 display df1 display df2 将它们显示在另一个下面 我想在第一个数据框的右侧有第二个数据框 有类似的问题 但看起来人们对将它们合并到
  • 使用 JQuery 更改 CSS 属性

    今天我看到了一个非常简单的方法来改变font size使用 jQuery 的元素 它看起来与以下内容非常相似 这显然不起作用 但我想知道缺少什么 我记得这只是一行代码 注 我已经尝试过jQuery document body css fon
  • 我可以使用 ObjectChangeListener 监听任何对象的更改吗?

    我有一个Integer称为x 如果它发生变化 那么我想在 GUI 中更新我的表 听 x 我已经尝试过 ChangeEvent y new javax swing event ChangeEvent x 我实施javax naming eve
  • Netlogo 数组需要文字值

    该数组需要一个文字值 set chrom forage min forage rate share min share rate mating treshold print chrom 我该如何处理 我真的不明白 Netlogo 中的数组
  • DDD 和聚合事务边界

    假设我有一个名为文档的对象 它有一堆图像 音频 视频等形式的子对象 因此 我的应用程序的用户可以通过键入一些文本 添加图像 视频等来创建文档 据我了解在DDD中 文档是一个聚合体 而图像 视频总是与作为根的文档相关联 基于这种理解 我将如何
  • 处理 html 表单提交中的 UTF 字符

    我的 html 表单有一些输入文本字段 这些字段可能会获取中文 日文 欧洲字符 特殊字符 例如 等 简而言之 就是 unicode 字符 为了在服务器端 使用 php 处理这些值 我可以假设所有浏览器在提交表单时默认都以 UTF 8 格式对
  • 使用 Perl 正则表达式确定 URI 是否有效

    对于我正在开发的应用程序 我需要一个 Perl 脚本 它循环遍历大量 CSV 文件并确保每一行都包含有效的 URI 我之前已经问过一个关于解析 CSV 文件的问题 并且我已经开始使用Text CSV让我的生活变得更轻松 现在我面临确保 UR
  • 如何将 jQuery 验证与“chosen”插件一起使用?

    我有一些
  • C#:在 RichTextBox 中粘贴 RTF,但保留颜色和格式(即:粗体、下划线等)

    是否可以将文本粘贴到富文本框中 同时保留粘贴内容在富文本框中使用的字体 换句话说 我想从 Word 中复制一些已格式化的内容 即 使用字体 X 并带有下划线和蓝色的文本 然后将其粘贴到我的 RichTextBox 中 我希望粘贴的内容具有与
  • 使用多个参数调用 shell 命令

    我正在尝试通过 Perl 脚本自动创建证书 我要运行的命令是 easyrsa build client full clientname nopass 我认为应该在 Perl 中完成的方式是 my arguments build client