关于安全性:如何将变量的值传递给命令的stdin?

How to pass the value of a variable to the stdin of a command?

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


通过对输入值A AA AA:简单的冰

1
your-command <<<"$your_variable"

确保你总是把quotes在变量的表达式。


AA AA:简单的事。

1
echo"$blah" | my_cmd


注意,"echo"$var" | command操作均是标准输入两个冰淇淋有限公司echoed线(S)。如果你也想要的终端是连通的,那么你会需要两个fancier:

1
2
3
{ echo"$var"; cat - ; } | command

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

这意味一线(S)将"contents of $var残,但会从cat来阅读它的标准输入。如果命令不太喜欢做什么(两个简单的命令行编辑的转折,或运行状vim。)然后它会好的。否则,你真的喜欢我想要…我认为expect及其衍生物或一个冰可能是适当的。

在命令行notations是practically identical,但是在第二个半结肠必要的牙套,冰与冰槽与它的尽头parentheses。


1
2
3
4
(cat <<END
$passwd
END

) | command

"不,不是真的需要cat冰的,但它helps两种结构的代码更好的和允许你使用更多的parentheses commands作为输入你的命令。


喜欢马丁的回答,但它有一些问题取决于什么是可变的。这

1
your-command <<<"""$your_variable"""

如果你变的更好的冰或包含"!


根据马丁的回答,有一个叫bash的特征。(在这里,它是一个变的更widely支持文件(特征)。

www.gnu.org http:/ / / / /软件/ bashref.html bash手册#在这儿。

3.6.7 Here Strings

A variant of here documents, the format is:

1
<<< word

The word is expanded and supplied to the command on its standard
input.

注意,这里就有两个。appear bash只读,所以,为了提高便携性,也许是你的最好离这里文件与原始特征,根据poltos的回答:

1
2
3
4
( cat <<EOF
$variable
EOF

) | cmd

一个简单的变体或以上的:

1
2
3
4
(cmd <<EOF
$variable
EOF

)

你可以omit (),除非你想让它继续到其他redirected commands。


试试这个:

1
echo"$variable" | command


这个强大的和可移植的方式已经出现在他的评论。它应该是一个独立的答案。

1
printf '%s'"$var" | my_cmd

1
2
printf '%s
'
"$var" | my_cmd

注:

  • 它的更好的echo丹瑞,原因是:为什么这里的冰比echoprintf更好吗?
  • printf"$var"冰了。第一参数的格式在不同序列的冰状或是%s
    interpreted。通过对《两个变量,它必须不被interpreted AS的格式。
  • 通常不包含变量的trailing newlines。《命令与%s形式)的网络服务变为冰。然而,用文本工具工作可能忽视或不完全是个complain线(见我为什么要比文本文件和一个换行符?)所以你可能想要的。(《命令与%s
    笑声)这一appends换行字符内容的两个变量。非明显的事实:

    • 这里的字符串在bash(<<<"$var" my_cmd)是一append换行符。
    • 任何方法,结果在一appends换行符的非空my_cmd标准输入(stdin),即使是空的或undefined变量。

我做的:

1
printf"$my_var" | my_cmd

如果是不包含的空间则可能是omitted quotes。 如果你使用bash也可以做:

1
echo -n"$my_var" | my_cmd

避免使用无回声型,因为它会管的vraiable和linebreak比的增加。