在 sed 中使用变量

Using variables within sed

我想在 sed 中使用一个变量,但无法解决。我试过了

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

但不幸的是,它只是将 myname 替换为“$name”。 有其他方法吗?

问题是 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 失败。

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