我在Centos7(SELinux)上使用apache httpd,我正在尝试创建一个输出过滤器来修改所有提供的html页面。我已经浏览了一些关于如何创建它们的教程,但是在我进入编码部分之前,我仍然在第一步磕磕绊绊。
目前我的httpd.conf
中有这个ExtFilterDefine portal_header mode=output intype=text/html cmd="/var/www/root/main/portal/portal.php"
SetOutputFilter portal_header
为了查明我的问题我暂时删除了文件/var/www/root/main/portal/portal.php中的所有实际代码,目前它看起来像这样
#!/usr/bin/php
<php?
/* test */
?>
但是当我知道尝试访问服务器上的任何html时,我得到“500内部服务器错误”。在httpd.conf中注释掉SetOutputFilter行之后,这些页面会起作用,因此过滤器会生成错误。
在我的错误日志中,它会显示
[Fri Feb 10 14:36:55.458174 2017] [ext_filter:error] [pid 171495] (13)Permission denied: [client 10.2.8.109:49278] AH01458: couldn't create child process to run `/var/www/root/main/portal/portal.php'
[Fri Feb 10 14:36:55.458215 2017] [ext_filter:error] [pid 171495] (13)Permission denied: [client 10.2.8.109:49278] AH01467: can't initialise output filter portal_header: aborting
我至少
但以上都没有任何效果。问题的唯一变化是,当我故意错误拼写文件名时,我得到了“没有这样的文件或目录”错误。
有没有人知道我应该做些什么来使这项工作?目前我很高兴看到剧本甚至什么都不做,如果它没有破坏,只是之后又添加了一些功能。
更新:我能够确定SELinux政策的问题,因为在禁用它们(setenforce 0)后,错误就消失了。所以目前我正在试图弄清楚我应该如何改变政策。
答案 0 :(得分:1)
当尝试改进一个简单的sed filter命令时,我遇到了类似的问题。 根据{{3}}文档,应该可以使用sed之类的命令作为过滤器,并且确实可以:
以下过滤器对我有用,并替换了指向本地链接的全局链接,以便我可以将docker映像与现有站点中的数据一起使用。
# Filter configuration
# mod_ext_filter directive to define a filter which
# replaces text in the response
#
ExtFilterDefine fixtext mode=output intype=text/html \
cmd="/bin/sed s#http://ceur.ws.org#http://capri:8880#g"
<Location "/">
# core directive to cause the fixtext filter to
# be run on output
SetOutputFilter fixtext
</Location>
当尝试用访问脚本替换sed命令时
"cmd=/root/bin/filter.sh"
我收到错误消息:
AH01458: couldn't create child process to run `/root/bin/filter.sh'
AH01467: can't initialise output filter fixtext: aborting
这是您提出问题的原始原因。
现在我也在寻找更好的解决方案并尝试过:
cmd="/bin/bash /root/bin/filter.sh"
假设https://httpd.apache.org/docs/2.4/mod/mod_ext_filter.html可能是罪魁祸首。有趣的是,我得到了:
AH01461: apr_file_write(child input), len 0
AH01468: ef_unified_filter() failed
这就是为什么我已经发布此答案的原因,希望我会尽快找到合适的解决方案,否则其他人可能会因为shebang resolving在此问答环节中变得越来越长而有所帮助。
有关相关源代码,请参见the list of related AH014## error codes。
我假设apr_proc_create无法使用shebang调用脚本。所以我的解决方法是
工作中的Apache filter.conf
# Filter configuration
# mod_ext_filter directive to define a filter which
# replaces text in the response
#
ExtFilterDefine fixtext mode=output intype=text/html \
cmd="/usr/bin/awk -f /var/www/filter.awk"
<Location "/">
# core directive to cause the fixtext filter to
# be run on output
SetOutputFilter fixtext
</Location>
使用awk脚本过滤链接
# WF 2020-06-03
#
# filter HTML output thru this awk script to fix global links to local ones
#
# you might want to try out this filter from the command line with
# cat /var/www/html/index.html | awk -f filter.awk
#
# setup the replacement
BEGIN {
port=8880
host="capri"
sourceServer="http://ceur-ws.org"
targetServer=sprintf("http://%s:%s",host,port)
}
# for each line
{
# get the line
line=$0
# replace any sourceServer reference with the targetServer reference
gsub(sourceServer,targetServer,line)
# output the modified line
print line
}
/root/bin/filters.sh
#!/bin/bash
# WF 2020-06-02
# filter all html output thru this script
port=8880
host=capri
# substitute all hard links in CEUR-WS with a local link
/bin/sed s#http://ceur.ws.org#http://$host:$port#g
# try out this filter with
# cat /var/www/html/index.html | /root/bin/filter.sh | grep capri