incron 和带圆括号的文件

incron 和带圆括号的文件

我已经安装了 incron 和以下 incrontab。

/inputdir IN_ALL_EVENTS /root/jobs/monitor $@ $% $#

这是在所有事件上调用的监视脚本。

!/bin/bash
#
LOG=/var/log/incron.log
TS="$(date '+%Y-%m-%d %H:%M:%S')"

# $1 - monitored dir
# $2 - action
# $3 - file in action
#
echo -e "${TS}  ${1} : ${2} : ${3}" >> ${LOG}

一旦我将文件复制到 /inputdir,我就会收到 incron.log 中的日志条目。这是预期的行为。

但如果我复制一个带圆括号的文件,例如 test(1).pdf,什么也没有发生。虽然 journald 中有一个条目,但监控脚本并未被调用,我的 incron.log 中也没有条目。

我认为这是一个错误。有人知道如何修复吗?

答案1

我看了一下代码,incron的工作方式是:

  1. 文件名中的空格和反斜杠转义(IncronTabEntry::GetSafePath
  2. 在命令行中替换目录名称、文件名等
  3. 使用以下任一方式运行已处理的命令行/bin/sh -csystem()使用根用户) 或者/bin/bash -c对于普通用户来说 -UserTable::RunAsUser

在任何情况下,不转义(都是)不安全的。(不仅仅是这些,还有其他特殊字符,如;*[/ ]&&$( ... )等。)这是一个等待被利用的命令注入漏洞。例如,参见这篇 Unix 和 Linux 文章或者这个避免将文件名直接嵌入到 shell 命令字符串中。Arch Linux 有补丁扩展转义的字符集,这将解决您的特定问题,因为它包含(),但仍然错过*、、等;|

您可以通过尝试在以下命令中引用命令行来解决这个问题incrontab

/inputdir IN_ALL_EVENTS /root/jobs/monitor '$@' $% '$#'

但对于包含 的文件名,这仍然会失败'。您真正能做的就是提交错误报告,要求更多转义,或者要求他们使用execve和系列直接运行命令,而不是使用system()或运行/bin/bash -c '...'。问题是他们必须以不同的方式解析命令行,将其拆分为单词,并实现转义机制等。

相关内容