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

标签 linux apache bash shell sed

我有一个脚本,当我在我的 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

关于linux - Bash 命令未在 Apache CGI Shell 中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20590478/

相关文章:

php - getenv(ENVIRONMENT VARIABLE) 什么也没得到

c - 简单的 Bash-C 通信

bash - 如何打印$@

linux - scp 文件没有设置正确的所有者

linux - addr2line 在 Ubuntu 16.10 上不工作?

c++ - 使用 cmake 配置代码覆盖率

C++ Linux获取MAC地址在同一台计算机上返回不同的值

mysql - symfony2 : MySQL server error when trying to create a database

php - 此PHP代码是否会使其他人的Apache崩溃?

linux - 如何在没有扩展名的情况下运行linux命令