我已经安装了 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的工作方式是:
- 文件名中的空格和反斜杠转义(
IncronTabEntry::GetSafePath
- 在命令行中替换目录名称、文件名等
- 使用以下任一方式运行已处理的命令行
/bin/sh -c
(system()
使用根用户) 或者/bin/bash -c
(对于普通用户来说 -UserTable::RunAsUser
)
在任何情况下,不转义(
都是)
不安全的。(不仅仅是这些,还有其他特殊字符,如;
、*
、[
/ ]
、&&
、$( ... )
等。)这是一个等待被利用的命令注入漏洞。例如,参见这篇 Unix 和 Linux 文章或者这个避免将文件名直接嵌入到 shell 命令字符串中。Arch Linux 有补丁扩展转义的字符集,这将解决您的特定问题,因为它包含(
和)
,但仍然错过*
、、等;
。|
您可以通过尝试在以下命令中引用命令行来解决这个问题incrontab
:
/inputdir IN_ALL_EVENTS /root/jobs/monitor '$@' $% '$#'
但对于包含 的文件名,这仍然会失败'
。您真正能做的就是提交错误报告,要求更多转义,或者要求他们使用execve
和系列直接运行命令,而不是使用system()
或运行/bin/bash -c '...'
。问题是他们必须以不同的方式解析命令行,将其拆分为单词,并实现转义机制等。