0

我创建了一个小型远程下载脚本,它使用 wget 将远程文件下载到我的服务器。下面是它的工作原理:我有一个 html 表单,用户可以输入 URL、目标文件名以及可选的用户名和密码以进行身份​​验证,以备不时之需。表单使用 AJAX 调用 php 脚本,而 php 脚本将信息传递给 shell 脚本。现在的问题是,shell 脚本在我的本地 linux 机器上完美运行,但在我的服务器上,它不适用于身份验证(没有身份验证,它工作得很好。)

#!/bin/bash

if test $# -eq 2
then
    wget -O "$2" $1
elif test $# -eq 4
then
    wget -O "$2" --http-user="$3" --http-password="$4" $1
else
    wget $1
fi

值得一提的是,我拥有一台共享服务器。

谢谢

编辑:服务器上安装的 wget 版本是否可能不支持 http 身份验证???

编辑 2: 我将 wget 的输出通过管道传输到这样的文件:

wget -O "$2" --http-user="$3" --http-password="$4" $1 | echo >> output

但是输出是空的,即没有从 wget 打印消息!!!我也这样做了,以检查传递的凭据是否正常:

echo "$3 | $4" >> credentials

没关系。

这是运行 shell 脚本的 php 代码:

if(isset($_POST["startdownload"]))
{
    list($url, $dest, $user, $pass) = explode("|", urldecode($_POST["data"]));
    $filelen = file_len($url);
    $freespace = getRemainingSpace();
    //die( "( Free: $freespace, File: $filelen )" );
    if($filelen > $freespace - 10000)
    {
        $result = json_encode(array("error" => true, 
                        "message" => "There is not enough space to download this file. ( Free: $freespace, File: $filelen )"));
        die($result);
    }
    else
    {
            if($user != "NULL" && $pass != "NULL")
            {
                execInBackground("../dl.sh '{$url}' '../{$dest}' '{$user}' '{$pass}'| at now");
            }
            else
            {
        execInBackground("../dl.sh '{$url}' '../{$dest}' | at now");    
            }
            $result = json_encode(array("error" => false, "message" => "Starting download..."));
            die($result);
    }
}
function execInBackground($cmd) 
{
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r")); 
    }
    else {
        exec($cmd . " > /dev/null &");  
    }
} 
4

1 回答 1

0

好吧,通过 system/exec/shell_exec 或任何其他方式运行此脚本,无论如何可能会“阻止”PHP 脚本的其余部分。但作为答案,请查看:http ://www.zarafa.com/wiki/index.php/Using_wget_and_HTTP_authentication_for_supported_downloads

wget -O "$2" --user="$3" --ask-password="$4" $1
于 2013-05-15T11:38:07.190 回答