How to pass the value of a variable to the stdin of a command?
我正在编写一个shell脚本,它应该有点安全,即不通过命令的参数传递安全数据,最好不使用临时文件。如何将变量传递给命令的stdin?或者,如果不可能,如何正确地使用这些任务的临时文件?
- 攻击者是否可以更改$PATH?使cat可以替换为/bin/cat"$@" | tee /attacker/can/read/this/file。
通过对输入值A AA AA:简单的冰
1
| your-command <<<"$your_variable" |
确保你总是把quotes在变量的表达式。
- 据我所知,这里的字符串<<<不保证可用,它们不在posix库中。只要你只在bash上运行它们,它们就会按预期工作。我只提到它,因为他们说的是"贝壳"而不是"巴什"。尽管他确实把这个问题贴上了bash的标签…所以这仍然是一个可以接受的答案。
- 尽管如此,但如果使用echo方法,由于管道的创建,敏感信息可能更容易泄漏。HereString命令将完全由bash处理,尽管在这种情况下(如前所述),您最好知道它将在您的bash上工作,否则由于不支持HereStrigs而产生的任何错误消息也会泄漏所述信息。
- @stevenlu等等,echo是内置的。那里没有管道,对吗?它是Unix,但不能有那么多Unix。
- @卡米洛马丁,我不知道巴什是否会接受,例如,埃多克斯1〔17〕和埃多克斯1〔18〕一样对待它……
- @stevenlu printf '%s
'"$var"产生的结果与echo"$var"相同,但如果(例如)var=-en不需要bash,则不会中断。
- @卡米洛马丁是的,我发现了自己并编辑了我的评论。
- 我试过用"和!在字符串中。它失败了。我再次尝试使用"$your_variable"来代替,但它起作用了。
- 我认为这是这个问题上显示的唯一一个方法,在这个方法中,环境在任何时候都不会通过进程表。
AA AA:简单的事。
- 注意变量中的空格:echo"$blah"更好。
- @乔纳森:这是一个很好的观点。相应地更新了答案…
- 即使在$blah中有一个"也能工作吗?
- 如果变量包含换行符,那么(cat <的回答也有效。
- 让我们看看你如何处理blah=-n和blah=-e…用printf代替。unix.stackexchange.com/questions/65803/&hellip;
- 如果字符串中有空字节,则不起作用
- 这看起来很脆弱,容易出错,不是吗?
- 6年过去了,如果我能删除这个答案,我会(但我不能,因为它已经被接受了…)
注意,"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。
- ( echo"$LIST"; cat - ) | sed 1q这对我有用,但我运行这个脚本时需要按ctrl d?
- 是的;cat -继续从键盘读取直到eof或中断,所以您需要通过键入control-d来告诉它eof。
- 有没有办法避开爆炸物爆炸?赛德需要猫
- 如果您不需要终端输入(如在第一行),则完全不必使用cat。也可以使用cat列出文件。或者…如果您希望命令读取终端输入,则必须在它到达输入末尾时通知它。或者您可以使用( echo"$var"; sed /quit/q - ) | command;这将一直持续到您键入包含"quit"的行为止。你可以用自己的方式无限地创造。当心一个古老的城市传说,当用户开始与厄瓜多尔合作时,程序停止工作。他们输入首都基多的名字,程序就退出了。
- 这对我有用
- 好吧,如果你这么说。但为什么不只是echo"$LIST" | sed 1q | ...?这完全取决于你在做什么。<表示法应该要求在文件下面某个位置的行的开头有一个eof。我不想用它,我想-但我仍然不确定你想达到什么目的。一个简单的echo"$LIST" | command或echo $LIST | command在实践中可能就足够了(重要的是你要知道两者之间的区别的重要性)。
- echo"$LIST" | head -n1起作用,但echo"$LIST" | sed 1q不起作用?
- 不知道,它们应该是等效的。
1 2 3 4
| (cat <<END
$passwd
END
) | command |
"不,不是真的需要cat冰的,但它helps两种结构的代码更好的和允许你使用更多的parentheses commands作为输入你的命令。
- 但是这个方法允许您将多行代码传递给您的命令,并且还允许在$passwd中使用空格。
- 这是迄今为止最好的答案,它不会将变量内容泄漏到管道或进程监听中。
喜欢马丁的回答,但它有一些问题取决于什么是可变的。这
1
| your-command <<<"""$your_variable""" |
如果你变的更好的冰或包含"!
- 但是为什么呢?而且,我不能再制造任何问题:foo1=-; foo2='"'; foo3=\!; cat<<<"$foo1"; cat<<<"$foo2"; cat<<<"$foo3"对我来说很好。三个"具体做什么?afaik你只是在准备和附加一个空字符串。
- 尝试一些真实的东西。就像你的命令是ssh somehost。您的变量是一个shell脚本。
根据马丁的回答,有一个叫bash的特征。(在这里,它是一个变的更widely支持文件(特征)。
www.gnu.org http:/ / / / /软件/ bashref.html bash手册#在这儿。
3.6.7 Here Strings
A variant of here documents, the format is:
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 |
- 但是当echo运行时,contents$变量是否会出现在ps -u的输出中?
- 不,不会的。echo是内置的,所以没有在ps中显示的过程。
- 注意变量中的空格:echo"$variable"更好。
- 没错,巴什吃的是双倍空间,聪明的贝壳吃不到。
这个强大的和可移植的方式已经出现在他的评论。它应该是一个独立的答案。
1
| printf '%s'"$var" | my_cmd |
或
1 2
| printf '%s
'"$var" | my_cmd |
注:
我做的:
1
| printf"$my_var" | my_cmd |
如果是不包含的空间则可能是omitted quotes。 如果你使用bash也可以做:
1
| echo -n"$my_var" | my_cmd |
避免使用无回声型,因为它会管的vraiable和linebreak比的增加。
- 如果$my'u var是%s,则不起作用,printf不会打印任何内容。my_var="%s"; printf"$my_var"; —可以试试printf"%s""$my_var" | my_cmd?