2013-05-29 27 views
4

我做了一個shell腳本,它檢測網絡接口,然後爲它檢測到IP地址,掩碼,廣播地址的每個接口,然後ping這個網絡接口的所有IP地址。shell_exec在php web應用程序中不工作

該腳本具有執行權限。通常,腳本會將網絡接口列表(eth0 eth1 wlan0)保存在名爲「resultat」的文件中,但是當我使用php的shell_exec命令(echo 'password for www-data user' |/usr/lib/cgi-bin/sudo -S global.sh bin/bash/")從網頁運行此腳本時,不會生成輸出。

如果我在終端中運行與用戶www-data相同的腳本,結果文件被正確填充。

腳本:

#!/bin/bash 
    ##### paramères relatives au connexion à la base de données 
    HOST_BDD="localhost" 
    LOGIN="root" 
    PASSWD="password" 
    NOM_BDD="dbnessus" 
    ##### ces requettes pour vider les tables avant de faire la detection 
    vider2="TRUNCATE machine_connecte" 
    echo $vider2 | /usr/bin/mysql -h $HOST_BDD 
    -u $LOGIN -p$PASSWD -s $NOM_BDD 

    vider1="TRUNCATE interfaces" 
    echo $vider1 | /usr/bin/mysql -h $HOST_BDD 
    -u $LOGIN -p$PASSWD -s $NOM_BDD 

    initialise="ALTER TABLE machine_connecte AUTO_INCREMENT=0" 
    echo $initialise | /usr/bin/mysql -h $HOST_BDD 
    -u $LOGIN -p$PASSWD -s $NOM_BDD 
    ####################################################### 

    /usr/lib/cgi-bin/get_interface.sh > /usr/lib/cgi-bin/liste_interfaces 
    while read line; 
    do 

    ip=$(/usr/lib/cgi-bin/get_ip.sh $line) 
    mask=$(/usr/lib/cgi-bin/get_netmask.sh $line) 
    bcast=$(/usr/lib/cgi-bin/get_bcast.sh $line) 


    ###fonction is_alive_ping 
    is_alive_ping() 
    { 
    ping -i 100 -c 1 $1 > /dev/null 2> /dev/null 
    [ $? -eq 0 ] && echo $i >>/usr/lib/cgi-bin/resultat 
    } 
    cat /dev/null >/usr/lib/cgi-bin/resultat; 
    ######### 


    ###division des octet d'adresse de broadcst 
    if [ "$ip" != "" ] 
    then 
    i1="$(echo $bcast |cut -d"." -f1)" 
    i2="$(echo $bcast |cut -d"." -f2)" 
    i3="$(echo $bcast |cut -d"." -f3)" 
    i4="$(echo $bcast |cut -d"." -f4)" 
    fi 
    ### { HostID/NetworkID }/classe du réseau 

    ##################### A.255.255.255 Classe A 
    if [ "$i2" == "255" ] 
    then 
for i in "$i1".{1..254}.{1..254}.{1..254} 
do 
is_alive_ping $i & disown 
done 
    fi 
    ##################### A.B.255.255 Classe B 
    if [ "$i2" != "255" ] && [ "$i3" == "255" ] 
    then 
for i in "$i1.$i2".{1..254}.{1..254} 
do 
is_alive_ping $i & disown 
done 
    fi 
    ##################### A.B.C.255 Classe C 
    if [ "$i2" != "255" ] && [ "$i3" != "255" ]&& [ "$i4" == "255" ] 
    then 
for i in "$i1.$i2.$i3".{1..254} 
do 
is_alive_ping $i & disown 
    done 
    fi 
    ################ 
while read ip_up; 
do 
hostname=$(/usr/bin/resolveip -s $ip_up 2>/dev/null) 
if [ "$hostname" == "" ] 
then 
hostname="*" 
fi 
mac=$(/usr/sbin/arp -a $ip_up |cut -d" " -f4) 
if [ "$ip_up" == "$ip" ] 
then 
mac=$(/sbin/ifconfig $line |grep 'HWaddr'|grep -v '127.0.0.1'|awk '{ print $5}') 
fi 
OS=$(/usr/bin/nmap -A $ip_up |grep "Service Info:" |awk '{print $4,$5}') 
if [ "$OS" == "Unix, Linux" ] || [ "$OS" == "Linux" ] 
then 
OS="Linux" 
elif [ "$OS" == "Windows " ] 
then 
OS="Windows" 
else 
OS="*" 
fi 
#sql1="INSERT INTO dbnessus.interfaces (nom_interface)VALUES ('$line');" 
sql1="INSERT IGNORE INTO dbnessus.interfaces (nom_interface)VALUES ('$line');" 
sql2="INSERT INTO dbnessus.machine_connecte (idmachine ,ip_mach ,mask_mach, 
nom_mach,mac_mach ,os_mach ,interfaces_nom_interface)VALUES (NULL, '$ip_up', 
'$mask', '$hostname', '$mac', '$OS', '$line');" 


echo $sql1 | /usr/bin/mysql -h $HOST_BDD -u $LOGIN -p$PASSWD -s $NOM_BDD 
echo $sql2 | /usr/bin/mysql -h $HOST_BDD -u $LOGIN -p$PASSWD -s $NOM_BDD 




    done < /usr/lib/cgi-bin/resultat 
    ip="" 
    done < /usr/lib/cgi-bin/liste_interfaces 
    echo "cbon" 
+0

我不知道你想在這裏做什麼,而是你怎麼從'貓的/ dev/null的期待>/usr/lib中/的cgi-bin/resultat;'?這將清除您創建的文件。 – terdon

+0

是每回合while循環(每次檢測到網絡接口))都將清除包含與之前的網絡接口文件相關的IP地址的內容的結果。 然後它會進行一次新的搜索(ping),並將該地址存儲在文件「resultat $ – tmedtcom

+0

」當我從終端運行該腳本時,它的工作原理是從網頁中用php shell_exec()命令發生了什麼問題 – tmedtcom

回答

1

幾個思路:

  1. 檢查shell_execphp.inidisabled_functions (php.ini中:disabled_functions)
  2. 確保PHP不運行安全模式 (php.ini:safe_mode
  3. 確保php-fpm pr (如果使用php-fpm)或https(如果使用apxs)在足夠的權限下運行(運行shell腳本並在腳本中執行這些命令) (在這種情況下,您可以向該用戶請求並查看是否可以運行它從bash)的

對不起,我不能多想那麼遠,