我试图在sed中使用一个变量但是无法解决它。我试过了
read -p " enter your name" name
sed -i 's/myname/$name/g' file
但不幸的是,它只是用" $ name"替换了myname。 还有另一种方法吗?
答案 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
失败。
您应该清理您的输入数据,或者使用可以大大减少攻击范围的工具。