bash脚本-awk不处理作为正则表达式传递的变量

bash脚本-awk不处理作为正则表达式传递的变量,bash,variables,awk,Bash,Variables,Awk,我正在写一个bash脚本。即使存在匹配项,以下awk命令也不会打印任何内容。 我复制了awk行,当我用真实数据替换$SEARCH\u QUERY时,它在交互式shell中成功执行。这使我相信awk没有正确地转换变量$SEARCH\u查询中的数据。 有没有办法解决这个问题,或者我应该阅读哪些bash主题来理解它为什么不起作用?多谢各位 search_contacts() { echo "Enter contact Name:" read SEARCH_QUERY awk '

我正在写一个bash脚本。即使存在匹配项,以下awk命令也不会打印任何内容。 我复制了awk行,当我用真实数据替换$SEARCH\u QUERY时,它在交互式shell中成功执行。这使我相信awk没有正确地转换变量$SEARCH\u查询中的数据。 有没有办法解决这个问题,或者我应该阅读哪些bash主题来理解它为什么不起作用?多谢各位

search_contacts()
{
    echo "Enter contact Name:"
    read SEARCH_QUERY
    awk ' /$SEARCH_QUERY/ { print $0 }' contacts.db
}
就原始代码被破坏的原因而言,单引号抑制了参数扩展,因此
awk
$SEARCH\u QUERY
视为正则表达式本身,也就是说,在其结束后寻找字符串
SEARCH\u QUERY
的行,这是一个不可能匹配的正则表达式

因此,最简单的方法是更改引用类型,以便实际进行预期的替换:

# THIS IS DANGEROUSLY INSECURE; DON'T DO THIS EVER
awk "/$SEARCH_QUERY/" contacts.db
然而,根据评论,上述情况是不安全的;如果您的
SEARCH\u查询
值结束了正则表达式(包括
/
),那么它就可以运行所需的任意awk代码
nonmatch/| | | |系统(“rm-rf~”)| |/任何东西
都会做非常糟糕的事情


根据最佳实践--数据应该从代码带外传递:

awk -v search_query="$SEARCH_QUERY" '$0 ~ search_query' contacts.db
就原始代码被破坏的原因而言,单引号抑制了参数扩展,因此
awk
$SEARCH\u QUERY
视为正则表达式本身,也就是说,在其结束后寻找字符串
SEARCH\u QUERY
的行,这是一个不可能匹配的正则表达式

因此,最简单的方法是更改引用类型,以便实际进行预期的替换:

# THIS IS DANGEROUSLY INSECURE; DON'T DO THIS EVER
awk "/$SEARCH_QUERY/" contacts.db
然而,根据评论,上述情况是不安全的;如果您的
SEARCH\u查询
值结束了正则表达式(包括
/
),那么它就可以运行所需的任意awk代码
nonmatch/| | | |系统(“rm-rf~”)| |/任何东西
都会做非常糟糕的事情


根据最佳实践--数据应该从代码带外传递:

awk -v search_query="$SEARCH_QUERY" '$0 ~ search_query' contacts.db

不要在shell中为自己的变量使用所有大写名称——这些名称用于对操作系统或shell本身有意义的变量,而小写名称保证不会与shell的设置或操作冲突。请参阅,第四段。至于您的原始代码不起作用——直接的问题是使用单引号(抑制扩展),然后使用扩展将数据替换到awk代码中。然而,最严重的问题是使用字符串替换将数据替换为代码——其核心是,这是注入漏洞的来源;就像SQL注入一样,shell注入和awk注入也是存在的。因为awk可以运行shell命令,所以让某人将任意内容替换为awk脚本相当于让他们在您的系统上运行任意命令。谢谢Charles。使用awk选项:search\u query是否可以防止令人讨厌的用户注入代码被awk执行的风险?您是指
-v var=“$var”
方法吗?这确保了该值被严格视为数据而不是代码,因此可以避免注入攻击。(
jq
可以对
--arg var“$var”
做同样的事情;其他几种语言/工具可以让数据在带外环境中传递)。回答很好。再次感谢您不要在shell中为您自己的变量使用所有大写名称——此类名称用于对操作系统或shell本身有意义的变量,而小写名称保证不会与shell的设置或操作冲突。请参阅,第四段。至于您的原始代码不起作用——直接的问题是使用单引号(抑制扩展),然后使用扩展将数据替换到awk代码中。然而,最严重的问题是使用字符串替换将数据替换为代码——其核心是,这是注入漏洞的来源;就像SQL注入一样,shell注入和awk注入也是存在的。因为awk可以运行shell命令,所以让某人将任意内容替换为awk脚本相当于让他们在您的系统上运行任意命令。谢谢Charles。使用awk选项:search\u query是否可以防止令人讨厌的用户注入代码被awk执行的风险?您是指
-v var=“$var”
方法吗?这确保了该值被严格视为数据而不是代码,因此可以避免注入攻击。(
jq
可以对
--arg var“$var”
做同样的事情;其他几种语言/工具可以让数据在带外环境中传递)。回答很好。再次感谢你