【问题标题】:Postcat not working in Perl but works on CLIPostcat 在 Perl 中不工作,但在 CLI 上工作
【发布时间】:2014-03-30 15:24:17
【问题描述】:

我在 Perl 脚本中的错误:

“邮件ID:D3B921090 postcat:致命:打开 D3B921090:没有这样的文件或目录”

“主题:”

CLI 上的这个命令完美运行: "root@mail:/var/spool/postfix/deferred# postcat D3B921090|egrep "^Subject"

“主题:测试”

当我把它放在我的 Perl 脚本中时,有些东西会中断。我在这里看不到任何错误,因为它甚至显示文件 MailID,但错误表明它不存在?

                   my $num = 0;
                   opendir my $dh, '/var/spool/postfix/deferred/' or die "Can't open directory: $!\n";
                    while ( my $node = readdir($dh) )
                    {
                            next if $node =~ /^\./;
                            print "MailID: $node\n";
                            my $subject = `postcat $node|egrep "^Subject"`;#Line of error
                            print "Subject: $subject\n";
                            $num++;
                    }
                    print "\nTotal: $num\n\n";

【问题讨论】:

  • 如果成功的命令和您构建的命令之间存在差异,首先认为您应该检查两者之间的差异!

标签: perl


【解决方案1】:

在 CLI 中,您位于目录 /var/spool/postfix/deferred 中,并在此目录中使用带有文件的 postcat。在 perl 脚本中,您可能不在此目录中,但仅使用带有 postcat 的文件名,而不给出完整路径(readdir 给出的名称没有路径)。

尝试使用/var/spool/postfix/deferred/$node 而不是$node

顺便说一句,如果有人将一个名为 ";rm -rf /" 的文件放入目录中,你就完蛋了,因为生成的命令将是 "postcat; rm -rf / | .... " - 不好笑(命令注入)。

【讨论】:

  • Nit: ;rm -rf / 不是合法的文件名。不过; chdir .. ; chdir .. ; chdir .. ; chdir .. ; chdir .. ; rm -rf . 是。
  • 你可以使用 String::ShellQuote 的shell_quote 来解决这个问题。
  • Nit:它确实需要是一个文件名,分号关闭当前语句(postcat)并开始一个新语句。只需在命令行上尝试postcat; rm -rf / :)
  • 回到你身边:尝试创建; rm -rf /。我不知道你在说什么。我认为你完全没有抓住重点。我是说文件名中不允许使用/,所以我提出了一个合法的等效文件名(即不使用NUL或/)。
  • @SteffenUllrich:您可能需要小心使用 "nit"。在美国以外,它意味着白痴傻瓜
猜你喜欢
  • 1970-01-01
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2022-11-10
相关资源
最近更新 更多