当我阅读How do I use shell variables in an awk script?的答案时,我不确定如何正确编写使用shell变量的特定awk命令的脚本。
已接受的答案表明,在awk
命令中插入shell变量将很容易导致恶意代码注入,尽管我能够重现演示,但以下两种方法都找不到相同的问题两个命令:
#HWLINK=enp10s0
ip -o route | awk '/'$HWLINK'/ && ! /default/ {print $1}'
ip -o route | awk "/$HWLINK/"' && ! /default/ {print $1}'
因此,主要问题是这些(或两者)中的任何一个是否易受攻击。
第二个问题是哪种形式是首选。我尝试了ip -o route | awk -v hwlink="$HWLINK" '/hwlink/ && ! /default/ {print $1}'
,但这没用。
p.s。这是重构;原始命令是ip -o route | grep $HWLINK | grep -v default | awk '{print $1}'
。
答案 0 :(得分:4)
您的想法是正确的,让外壳变量在awk
内插可以允许恶意代码注入。正确指出的是使用-v
语法,但是您的尝试失败了,因为带有变量的模式匹配无法以/../
的形式工作,请使用直接~
匹配
ip -o route | awk -v hwlink="$HWLINK" '$0 ~ hwlink && ! /default/ {print $1}'
建议清理传递给awk
的变量的方法是使用ARGV
数组或ENVIRON
变量。通过这种方式传递的变量不会由外壳进行扩展
value='foo\n\n'
awk 'BEGIN {var=ARGV[1]; delete ARGV[1]}' "$value"
如果您将var
的值打印在awk
内,它将是文字foo\n\n
,而 not 多行字符串通常会在外壳将其展开。
答案 1 :(得分:4)
当然,两者都很容易受到攻击,但第一个则不那么容易。
这会打断您的第二行:
HWLINK="/{}BEGIN{print \"Your mother was a hamster and your father smelt of elderberries\"}/"
它不会中断第一行的唯一原因是,为了能够注入到第一行中,它不能包含空格。
HWLINK="/{}BEGIN{print\"Your_mother_was_a_hamster_and_your_father_smelt_of_elderberries\"}/"
我看到您已经使用了正确的语法:)