在 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
失败。
您应该清理您的输入数据或使用大大减少攻击范围的工具。
我想在 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
失败。
您应该清理您的输入数据或使用大大减少攻击范围的工具。