【问题标题】:Howto pass a mixed string from php through a pipe to a bash script如何通过管道将混合字符串从 php 传递到 bash 脚本
【发布时间】:2017-04-10 08:00:48
【问题描述】:

我正在寻找一种可能性,在 proc_open(exec、passthru 或其他)的帮助下通过管道将混合 PHP 多行字符串发送到 bash 脚本。最后,在这个脚本中,我想抓取混合的多行字符串并将其存储到一个变量中。

PHP:

// static way
$some_multiline_string = 'some $%§%& mixed &/(/( 
content 
with newlines';

// dynamic way:
// the mixed content is coming from the database
// so actually it is not initialized like in the previous lines, but more like this:
$some_multiline_string = $db_result['some_multiline_string'];

// escaping
$some_multiline_string = escapeshellargs($some_multiline_string);

// execution
$process = proc_open("printf $some_multiline_string | some_script.sh args");
...

重击:

#!/bin/bash
mixed_multiline_string=$(</dev/stdin)
echo -e "$mixed_multiline_string"
...

在命令中使用混合内容之前如何正确转义?我已经尝试过 escapeshellargs 和 escapeshellcmd,但是要么有一个未转义的字符,它正在停止进程,要么它正在工作,但处理时间太长(1.5 分钟)。

这是一个示例混合内容字符串的链接: http://playmobox.com/js/test.txt

非常感谢!

【问题讨论】:

    标签: pipe stdin proc-open multilinestring


    【解决方案1】:

    我不懂 PHP,但是 bash 应该做一些类似于右侧顶部相关的 one post 的事情:

    #!/usr/bin/env bash
    
    declare    line  ; line=
    declare -a line_ ; line_=()
    
    while IFS= read -r line ; do
        line_+=( "${line}" )
    done < /dev/stdin
    
    printf "%s\n" "${line_[@]}"
    

    假设脚本的名称是some_script.sh 你可以这样做

    % echo '&Ω↑ẞÐĦØđ¢ø' | bash some_script.sh
    &Ω↑ẞÐĦØđ¢ø
    

    while IFS= read -r line 在这里解释:Bash, read line by line from file, with IFS 并在bash wiki

    • IFS 设置为空字符串,以防止读取从每行中删除前导和尾随空格。 ——理查德·汉森
    • -r 原始输入 - 在读取的数据中禁用反斜杠转义和行继续的解释

    【讨论】:

    • 非常感谢您的帮助!
    猜你喜欢
    • 2015-06-06
    • 2014-02-19
    • 2018-11-28
    • 2021-09-11
    • 1970-01-01
    • 2018-02-27
    • 2011-10-10
    • 2021-11-07
    • 2018-09-12
    相关资源
    最近更新 更多