如何将变量的值传递给命令的stdin?

时间:2011-01-23 18:24:53

标签: security bash stdin

我正在编写一个应该有些安全的shell脚本,即不通过命令参数传递安全数据,最好不使用临时文件。如何将变量传递给命令的stdin?或者,如果不可能,如何正确使用临时文件进行此类任务?

9 个答案:

答案 0 :(得分:151)

在stdin上传递值非常简单:

your-command <<< "$your_variable"

始终确保在变量表达式周围加上引号!

答案 1 :(得分:65)

简单的事情:

echo "$blah" | my_cmd

答案 2 :(得分:17)

请注意,'echo "$var" | command操作意味着标准输入仅限于回显的线路。如果您还希望连接终端,那么您需要成为更高级的终端:

{ echo "$var"; cat - ; } | command

( echo "$var"; cat -   ) | command

这意味着第一行将是$var的内容,但其余部分将来自cat读取其标准输入。如果命令没有做任何太花哨的事情(尝试打开命令行编辑,或像vim一样运行)那么它会没问题。否则,你需要变得非常花哨 - 我认为expect或其中一个衍生物可能是合适的。

命令行符号实际上是相同的 - 但是第二个分号对于括号是必要的,而不是括号。

答案 3 :(得分:15)

(cat <<END
$passwd
END
) | command

不需要cat,但它有助于更​​好地构造代码,并允许您在括号中使用更多命令作为命令的输入。

答案 4 :(得分:12)

我喜欢Martin的答案,但根据变量中的内容有一些问题。此

your-command <<< """$your_variable"""
如果变量包含“或!

会更好

答案 5 :(得分:7)

根据Martin的回答,有一个名为 Here Strings 的bash功能(它本身是更广泛支持的 Here Documents 功能的变体)。

http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings

  

3.6.7这里的字符串

     

此处文件的变体,格式为:

<<< word
     

该词被扩展并以其标准提供给命令   输入

请注意,Here Strings似乎只是bash,因此,为了提高可移植性,根据PoltoS的回答,您最好使用原始的Here Documents功能:

( cat <<EOF
$variable
EOF
) | cmd

或者,更简单的上述变体:

(cmd <<EOF
$variable
EOF
)

您可以省略(),除非您希望将其重定向到其他命令。

答案 6 :(得分:3)

试试这个:

echo "$variable" | command

答案 7 :(得分:0)

这种健壮和可移植的方式已经出现在评论中。它应该是一个独立的答案。

printf '%s' "$var" | my_cmd

printf '%s\n' "$var" | my_cmd

注意:

  • echo好,原因在这里:Why is printf better than echo?
  • printf "$var"是错误的。第一个参数是格式,其中解释了诸如%s\n之类的各种序列。要正确传递变量,不得将其解释为格式。
  • 通常,变量不包含尾随换行符。前一个命令(带有%s)按原样传递变量。但是,使用文本的工具可能会忽略或抱怨行不完整(请参见Why should text files end with a newline?)。因此,您可能需要后一个命令(带有%s\n),该命令将换行符附加到变量的内容中。非显而易见的事实:

    • Bash(<<<"$var" my_cmd)中的字符串确实附加了换行符。
    • 任何添加换行符的方法都将导致my_cmd的非空stdin,即使该变量为空或未定义。

答案 8 :(得分:-1)

只是做:

printf "$my_var" | my_cmd

如果var不包含空格,则可以省略引号 如果使用bash,那么你也可以这样做:

echo -n "$my_var" | my_cmd

避免在没有-n的情况下使用echo,因为它会在最后添加一个换行符来管道变量。