我刚刚从 RHEL 5 升级到 6.5 并fail2ban
重新设置。我现在似乎无法让我的自定义操作正常工作,据说是因为权限问题。我不想知道我做错了什么,以及如何才能fail2ban
成功运行脚本。
我fail2ban
设置了一个操作来运行通用 shell 脚本。我更喜欢这样的事情。
actionstart = <script> <jail> start
<script>
文件中指定的位置jail.local
:
action = run-script[jail=drupal-reg-lim,script=/path/to/script.sh]
但是当我尝试运行脚本时,我得到了 126 退出代码,根据tldp.org,意味着存在“权限问题或命令不是可执行文件”。
无论内容script.sh
是完全空的,还是只有一个 shebang ( #!/bin/sh
),都会发生这种情况。尝试运行sudo /path/to/script.sh
作品。
我尝试更改actionstart
以使其记录,并将脚本放置为/etc/fail2ban/action.d/script.sh
:
actionstart = <script> <jail> start || logger -dit fail2ban-run-script <script> <jail> start failed: exitcode = $?
实际上将以下内容输出到/var/log/messages
:
Apr 23 05:49:25 xx1 fail2ban-run-script[8236]: /etc/fail2ban/action.d/script.sh drupal-reg-lim start failed: exitcode = 126
也在尝试运行sh
作品。仅运行脚本失败。我也尝试过chmod 777 script.sh
:
-rwxrwxrwx. 1 root root 10 Apr 23 05:12 script.sh
另一个想法是,这可能与 SELinux 安全上下文有关(日志输出id
给了我uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:system_r:fail2ban_t:s0
),但我没有成功地测试这个(sudo -t fail2ban_t -r system_r /bin/sh
失败,Permission denied
即使fail2ban
可以运行sh
;我可能在我的中做错了什么sudo
)。
了解一下可能有用的事情是fail2ban
使用 Pythonos.system()
来执行命令。但我尝试以这种方式重新创建它也失败了:
>>> import os
>>> print os.system('/etc/fail2ban/action.d/script.sh || echo "No"')
0
这一切让我一无所有。我很高兴得到任何形式的帮助。
(旁注:实际上,fail2ban
由于某种原因没有得到 126 退出代码,只是吐出代码为 0x7e00 的错误,这意味着进程已停止,但退出代码为零。我花了一些时间才弄清楚,所以我想分享一下。)
答案1
与往常一样,除了我尝试运行的脚本中的错误之外,它与任何其他事情都没有任何关系!
具体来说,我调用的脚本试图运行位于同一目录中的另一个脚本。要获取公共目录的名称,而不是使用BASE_DIR=$(dirname $(readlink -f "$0"))
我意外编写的BASE_DIR=$(readlink -f "$0")
,不用说,"${BASE_DIR}/another_script.sh arg1 arg2..."
失败了(它试图运行不存在的无意义路径/path/to/script.sh/another_script.sh
),状态代码为 126。