我有一个脚本,当我在我的 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 ofpublic_content_rw_t
and enableallow_httpd_anon_write
and/orallow_httpd_sys_script_anon_write
. See thehttpd_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