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

标签 c shell posix special-characters

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

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

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

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

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

最佳答案

这种做法似乎是正确的,但如果不对,欢迎指正:

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

shall ensure that words does not contain an unquoted character or any of the unquoted shell special characters ...

而且当已经允许命令替换时,在命令替换上下文之外检查伪造的特殊字符肯定不会带来安全优势。

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

  • 在非单引号上下文中遇到反斜杠会跳过下一个字符。
  • 在非双引号上下文中遇到单引号会切换单引号上下文。
  • 在非单引号上下文中遇到双引号会切换双引号上下文。
  • 遇到反引号,或者 $( 后面没有紧接着另一个 (,在非单引号上下文中会导致 WRDE_CMDSUB .
  • 在非引号上下文中遇到任何特殊字符会导致 WRDE_BADCHAR

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

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

关于c - 识别 shell 命令文本中未加引号的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5676919/

相关文章:

c - 从函数返回指针

Linux shell脚本,检查用户的输入

bash - 找不到生成命令

c - Kill() 错误 : no such process?

c++ - 我可以完全禁用#include 查找吗?

C、topper段错误

c - VS2015 中 C 代码中的无作用域枚举

linux - 不想按 Ctrl +D 来结束文件。任何替代方案

c - 使用 -lrt 的 Posix 信号量编译错误

c - Posix 套接字 : Find out greatest number of file descriptors