Skip to main content
 首页 » 编程设计

linux之Bash 命令未在 Apache CGI Shell 中运行

2023年11月22日21lexus

我有一个脚本,当我在我的 linux 机器上的 http 服务器上单击一个按钮时运行。 该文件在 cgi-bin 中并且是可执行的。

但是这个脚本的两行似乎不起作用

#!/bin/bash 
 
IPADDR=`echo "$QUERY_STRING" | sed -n 's/^.*IPADDR=\([^&]*\).*$/\1/p' | sed "s/+/ /g"` 
SUBNET=`echo "$QUERY_STRING" | sed -n 's/^.*SUBNET=\([^&]*\).*$/\1/p' | sed "s/+/ /g"` 
DHCP=`echo "$QUERY_STRING" | sed -n 's/^.*DHCP=\([^&]*\).*$/\1/p' | sed "s/+/ /g"` 

(2 条线路不工作)

sed -i.bak "s/IPADDR=.*/IPADDR=$IPADDR/g" test 
sed -i.bak "s/NETMASK=.*/NETMASK=$SUBNET/g" test 
 
echo "Content-type: text/html" 
echo "" 
DHCP=`echo "$QUERY_STRING" | sed -n 's/^.*DHCP=\([^&]*\).*$/\1/p' | sed "s/+/ /g"` 
echo "<html><head><title>IP CHANGED</title></head>" 
echo "<body>IP changed to: " 
echo "$IPADDR <br>" 
echo "<body>SUBNET changed to: " 
echo "$SUBNET <br>" 
echo "DHCP $DHCP" 
echo "</body></html>" 

文件测试内容

DEVICE=p32p1 
BOOTPROTO=static 
DHCPCLASS= 
HWADDR=00:01:2e:48:f0:f3 
IPADDR=3333333333 
NETMASK=4444444444 
ONBOOT=yes 

sed 从不更改文件。

这也是我的 HTML

<form action="cgi-bin/IPChange.sh" method="get"> 
Enter an IP Address: <input type="text" name="IPADDR"></input><br> 
Enter a Subnet Mask: <input type="text" name="SUBNET"></input><br> 
<input type="radio" name="DHCP" value="on">Enable DHCP 
<input type="radio" name="DHCP" value="off">Disable DHCP<br> 
<input type="submit" name="subbtn" value="Submit"> 
<form> 

请您参考如下方法:

这一定是文件系统权限和 SELinux 配置问题的结合。

文件系统部分更容易修复。您的 Web 服务器进程可能作为 apache 用户运行,因此请确保它对您要重写的文件具有正确的权限。确认文件系统权限没问题,暂时禁用 SELinux 并检查写入是否有效:

echo 0 >/selinux/enforce 

如果可行,则重新打开 SELinux:

echo 1 >/selinux/enforce 

然后修复您的 SELinux 设置。以下是来自 this other answer 的一些提示,特别是:

You must either give the directory structure a context of httpd_sys_rw_content_t, or give them a context of public_content_rw_t and enable allow_httpd_anon_write and/or allow_httpd_sys_script_anon_write. See the httpd_selinux(8) man page for details.

另外,我会像这样重写你的脚本:

#!/bin/bash 
config=/var/www/net.config 
 
while IFS== read name value; do 
    case $name in 
        IPADDR) IPADDR=$value ;; 
        SUBNET) SUBNET=$value ;; 
        DHCP) DHCP=$value ;; 
    esac 
done < <(sed -e 's/&/\n/g' <<< $QUERY_STRING) 
 
is_valid() { 
    # todo: validate the input params 
    return 1 
} 
 
if is_valid; then 
    sed -i.bak e "s/IPADDR=.*/IPADDR=$IPADDR/g" -e "s/NETMASK=.*/NETMASK=$SUBNET/g" $config 
    title='IP CHANGED' 
    body=$(cat << EOF 
IP changed to: $IPADDR <br> 
SUBNET changed to: $SUBNET <br> 
DHCP $DHCP 
EOF 
) 
else 
    body='What are you trying to pull, mister?' 
fi 
 
cat << EOF 
Content-type: text/html 
 
<html><head><title>$title</title></head> 
<body>$body</body></html> 
EOF