我创建了一个小型远程下载脚本,它使用 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 &");
}
}