识别shell命令文本中的未加引号的特殊字符

时间:2011-04-15 12:44:01

标签: c shell posix special-characters

我正在实现wordexp函数,该函数需要识别并可选地拒绝命令替换的出现(即$(...)或反引号),并且从质量的角度来看,还应识别并拒绝未加引号每当禁用命令替换时,都会出现特殊字符|&;<>

我正在寻找的是一种识别这些特殊字符存在的简单方法,而无需复制大量的shell逻辑。有什么想法吗?

验证字符串后,我将其传递给sh并带有以下-c参数:

printf '%s\0' [string inserted here]

构建了一个很好的多字符串,可供C代码使用。

1 个答案:

答案 0 :(得分:0)

这种方法似乎是正确的,但如果错误,我会欢迎更正:

如果未指定WRDE_NOCMD标志,请不要进行任何检查。 wordexp的规范说明了应用程序

  

应确保单词不包含不带引号的字符或任何未加引号的shell特殊字符......

当已经允许命令替换时,检查命令替换上下文之外的伪特殊字符肯定没有获得安全性好处。

现在,如果指定了WRDE_NOCMD,则按顺序处理字符串,并保留一个标记,表明我们是在单引号还是双引号上下文中。

  • 在非单引号上下文中遇到反斜杠会跳过下一个字符。
  • 在非双引号上下文中遇到单引号切换单引号上下文。
  • 在非单引号上下文中遇到双引号会切换双引号上下文。
  • 在非单引号的上下文中遇到反引号或$(没有立即跟随另一个(会产生WRDE_CMDSUB
  • 在非引用的上下文中遇到任何特殊字符会产生WRDE_BADCHAR

由于我们要禁止所有命令替换,因此不需要担心嵌套的$(上下文;进入第一级已经产生错误。

我在这里犯过任何愚蠢(或微妙而不那么愚蠢)的错误吗?