【问题标题】:Escaping a lengthy Bash command to use with PHP exec()转义一个冗长的 Bash 命令以与 PHP exec() 一起使用
【发布时间】:2014-01-08 08:02:43
【问题描述】:

我有一个半长的 shell 命令,我需要在 php.ini 中执行它。我觉得我已经正确地转义了所有内容,但是从 php 的 exec() 函数执行时它无法正常工作。当我使用 exec() 运行命令时,它会无错误地退出,但无法正常运行。

我正在将包含电子邮件地址的列表文件与其他管道分隔信息与包含 md5 版本电子邮件地址的文本文件进行比较,以从原始列表中抑制。

这里是 bash 命令:

while read line ; do email=`echo "$line" | cut -d '|' -f1` ; if [ $(E=`echo -en "$email" | md5sum | awk '{print $1}'`; grep $E /path/to/suppressions | head -1 ;) ] ; then continue ; else echo $line ; fi done < /path/to/emails

/path/to/suppressions 是一个文本文件,包含要抑制的电子邮件地址的 md5 版本(它包含“emailtosuppress@domain.com”的 md5:

edb5feb3be7d0a4e1e250ccdf0c04ace

/path/to/emails 是一个文本文件,其中包含电子邮件地址列表以及其他一些分隔信息:

emailtokeep@domain.com|1000|1
emailtosuppress@domain.com|1000|1

当命令在 bash 中执行时,输出只是在抑制列表中不存在的电子邮件地址,并且它完美无缺:

emailtokeep@domain.com|1000|1

我遇到的问题是,当我在 php 中使用 exec() 执行相同的命令时,它会输出“电子邮件”文件中的所有行,而不会抑制抑制文件中的任何匹配项。

$supCommand = 'while read line ; do email=`echo "$line" | cut -d \'|\' -f1` ; if [ $(E=`echo -en "$email" | md5sum | awk \'{print $1}\'`; grep $E /path/to/suppressions | head -1 ;) ] ; then continue ; else echo $line ; fi done < /path/to/emails' ;
exec($supCommand, $supStatus) ;
print_r($supStatus) ;

我将命令用单引号括起来,并转义了命令中的四个单引号实例。如果有人有任何想法,我将非常感激。

提前致谢:)

【问题讨论】:

  • 你不能在php中做所有这些吗?

标签: php linux bash shell


【解决方案1】:

这似乎有效:

<?php
    $bash = '
        mapfile -t md5sums < suppressions
        function md5 { printf "%s" "$1" | md5sum | cut -f1 -d" "; }
        while IFS="|" read -r email b c; do 
            this_md5=$(md5 "$email")
            for suppress in "${md5sums[@]}"; do
                [[ $this_md5 == $suppress ]] && continue 2
            done
            echo "$email|$b|$c" 
        done < emails
    ';
    $cmd = "bash -c '$bash'";
    $keep = passthru($cmd);
    print($keep);
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多