【问题标题】:Perl qx() command not working as expectedPerl qx() 命令未按预期工作
【发布时间】:2019-10-31 16:47:29
【问题描述】:

我有一个如下的 perl 脚本,我想使用 rsh 从 linux 机器访问远程 windows 机器上的网络路径。

$cmd = "rsh -l $username $host \"pushd \\\\network\\path\\to\\the\\directory && dir\"";
print $cmd, "\n";
print qx($cmd);

当我运行脚本时,第三行打印输出 The system cannot find the path specified. 但是,如果我直接从终端运行第二行打印的命令,它工作正常。

我无法理解为什么脚本不起作用。如果命令从终端运行,它也应该使用 qx() 运行。

【问题讨论】:

  • 目前尚不清楚从命令行运行的具体内容。如果这是您在$cmd = "rsh ...." 中的确切行,那么您可能需要添加另一层转义,因为双引号将\\path 解释为\path
  • 当我从终端运行第二行打印的命令(即字符串值$cmd)时,它运行良好。但是,第三行(即qx($cmd))给出了问题中提到的错误。我已经在路径的开头使用了四个反斜杠 `\\\\`,并将所有其他反斜杠转义为 `\\`。
  • 就个人而言,我会使用 String::ShellQuote 和 Win32::ShellQuote 的组合来构建命令

标签: perl terminal remote-connection rsh qx


【解决方案1】:

当您通过双引号和远程 shell 对元字符进行插值时,qx 本身可能会再次插入字符串,在这种情况下,您可能需要添加另一个级别的转义。来自the documentation of qx

一个字符串(可能)插值,然后作为系统命令使用 /bin/sh 或其等效命令执行。 ...
如何评估该字符串完全取决于系统上的命令解释器。在大多数平台上,您必须保护 shell 元字符,如果您想按字面意思对待它们。这在实践中很难做到,因为不清楚如何转义哪些字符。有关手动 fork() 和 exec() 以安全地模拟反引号的干净且安全的示例,请参阅 perlsec。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 2018-09-16
    • 2021-11-25
    • 2020-05-23
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多