2013-12-15 2 views
0

Linux 컴퓨터에서 http 서버의 버튼을 클릭 할 때 실행되는 스크립트가 있습니다. 파일은 cgi-bin에 있으며 실행 가능합니다.Apache CGI 쉘에서 Bash 명령이 실행되지 않습니다.

그러나 그것은 결코 변화하지

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

가 나오지

#!/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"` 

(작업이 arent 헤드 개) 파일 테스트

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>" 

내용 작업이 arent이 스크립트의 두 줄 것 같다 파일.

또한 여기에이 파일 시스템 권한 및 SELinux를 구성 문제의 조합이어야 내 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> 
+0

아파치는 파일을 편집 할 수있는 권한이 없습니다. 그 외에, bash 스크립트를 웹 프로세스에서 실행하도록하는 것은 끔찍한 생각처럼 들린다. – mvp

+0

Im을 구현하는 간단한 경우, 어떻게 아파치 사용 권한을 부여 할 수 있습니까? – user758114

+0

아파치의 권한을 높이는 대신 모든 사용자에게'test' 파일에 쓰기 권한을 부여하는 것이 좋습니다. chmod a + x/path/to/test – mti2935

답변

1

입니다.

파일 시스템 부분을 수정하는 것이 더 쉽습니다. 웹 서버 프로세스는 apache 사용자로 실행되므로 재 작성하려는 파일에 대한 올바른 권한이 있는지 확인하십시오. 사용 권한이 확인되는 파일 시스템을 확인하기 위해 일시적으로 SELinux를 사용하지 않도록 설정하고 쓰기가 작동하는지 확인하십시오

echo 1 >/selinux/enforce 

를 다음의 SELinux 설정을 수정 :

echo 0 >/selinux/enforce 

을이 작동하는 경우, 다음 다시 SELinux를 켜십시오. 여기에 몇 가지 힌트는 특히 this other answer에서있다 :

당신은 디렉토리 구조를 httpd_sys_rw_content_t의 컨텍스트를 제공하거나 그들에게 public_content_rw_t의 문맥을주고 allow_httpd_anon_write 및/또는 allow_httpd_sys_script_anon_write를 사용하도록 설정해야 하나. 자세한 내용은 httpd_selinux(8) 매뉴얼 페이지를 참조하십시오.

또한,이 같은 스크립트를 다시 작성합니다 :

#!/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 
+0

파일에 대한 사용 권한을 다른 사람이 편집 할 수있는 위치로 변경했지만 여전히 작동하지 않습니다. – user758114

+0

구성 파일을'/ tmp/net.config' 파일로 복사하고 스크립트를 변경하면'config =/tmp/net.config를 누른 다음 작동합니다. – janos

+0

예 여전히 작동하지 않습니다. 아파치가 루트 권한을 가지고 있어야합니까? – user758114

관련 문제