我有两个文件:
wget.php
<?php
include 'theme.php';
/*ceklogin();*/
css();
if($_POST['wget-send'])
{
$dir=$_POST['dir'];
$link=$_POST['link'];
exec('touch /tmp/wget-download-link.txt',$out);
exec('echo "'.$link.'" >> /tmp/wget-download-link.txt',$out);
exec('/www/wget_download.sh,$out);
echo $out[2];
exit();
}
echo "<form action=\"".$PHP_SELF."\" method=\"post\">";
echo "Download directory:<br><input type=\"text\" name=\"dir\" size=\"15\" value=\"/mnt/usb/\"/><br>";
echo '<br>Download link (one URL per line):<br>';
echo ("<textarea name=\"link\" rows=\"13\" cols=\"60\"></textarea><br><br>");
echo '<input type="submit" name="wget-send" value="Send" />';
echo "</form></div>";
foot();
echo '
</div>
</body>
</div>
</html>';
?>
wget_download.sh
while [ true ] ; do
urlfile=$( ls /tmp/wget-download-link.txt | head -n 1 )
if [ "$urlfile" = "" ] ; then
sleep 30
continue
fi
url=$( head -n 1 $urlfile )
if [ "$url" = "" ] ; then
mv $urlfile $urlfile.invalid
continue
fi
mv $urlfile $urlfile.busy
wget $url -o /tmp/wget.log -P $dir
mv $urlfile.busy $urlfile.done
done
如何将PHP中$ dir的变量传递给shell中的$ dir?所以例如我的PHP中的$ dir是:
/mnt/usb
我希望在/mnt/usb
中执行wget_download.sh
所以它会是这样的:
wget $url -o /tmp/wget.log -P /mnt/usb
我该怎么做?
答案 0 :(得分:0)
首先,这非常非常危险。确保您完全信任能够在您的服务器上运行任意命令的任何人都可以访问您的站点。我建议确保SSL和正确的密码验证。
有了这个警告,你可以putenv("DIR=".$dir);
看到&#34; http://php.net/manual/en/function.putenv.php&#34;获取可能需要的限制和配置列表。您可能需要在变量名前加上&#34; PHP _&#34;在php和shell脚本中。
答案 1 :(得分:0)
我第二次Daniels警告。那说我只是把它作为一个论点:
dir="$1"
while [ true ] ; do
urlfile=$( ls /tmp/wget-download-link.txt | head -n 1 )
if [ "$urlfile" = "" ] ; then
sleep 30
continue
fi
url=$( head -n 1 $urlfile )
if [ "$url" = "" ] ; then
mv $urlfile $urlfile.invalid
continue
fi
mv $urlfile $urlfile.busy
wget $url -o /tmp/wget.log -P $dir
mv $urlfile.busy $urlfile.done
done
哪会改变你的执行电话:
// the command would actually look like:
// /www/wget_download.sh /path/to/dir
exec('/www/wget_download.sh ' . escapeshellarg($dir),$out);