在sed中使用变量

时间:2015-04-27 13:30:06

标签: sed

我试图在sed中使用一个变量但是无法解决它。我试过了

read -p " enter your name" name
sed -i 's/myname/$name/g' file

但不幸的是,它只是用" $ name"替换了myname。 还有另一种方法吗?

1 个答案:

答案 0 :(得分:-2)

问题是bash shell不会在单引号内进行变量扩展。例如:

pax> name=paxdiablo
pax> echo 'Hello, $name, how are you?'
Hello, $name, how are you?

对于像这样的简单案例,你可以使用双引号:

pax> echo "Hello, $name, how are you?"
Hello, paxdiablo, how are you?

话虽如此,仅使用像这样展开的任意数据存在一些严重问题。一个聪明的攻击者可以给出一个包含字符的名称,这些字符会导致sed做你可能不想要的事情(通过注入攻击):

pax@paxbox$ name='/; e printenv; echo '
pax@paxbox$ echo 'Hello, myname' | sed "s/myname/$name/"
LESSOPEN=| /usr/bin/lesspipe %s
USER=pax
: (lots of other stuff about my environment I don't want people to see)
HOSTTYPE=x86_64
/
Hello,

它甚至 都不聪明 - 任何人输入包含/的名称几乎肯定会导致sed失败。

您应该清理您的输入数据,或者使用可以大大减少攻击范围的工具。