如何将PHP变量传递给Shell?

时间:2014-12-23 19:41:06

标签: php shell

我有两个文件:

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

我该怎么做?

2 个答案:

答案 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);