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"
我不知道你想在這裏做什麼,而是你怎麼從'貓的/ dev/null的期待>/usr/lib中/的cgi-bin/resultat;'?這將清除您創建的文件。 – terdon
是每回合while循環(每次檢測到網絡接口))都將清除包含與之前的網絡接口文件相關的IP地址的內容的結果。 然後它會進行一次新的搜索(ping),並將該地址存儲在文件「resultat $ – tmedtcom
」當我從終端運行該腳本時,它的工作原理是從網頁中用php shell_exec()命令發生了什麼問題 – tmedtcom