wget を使用してリモート ファイルをサーバーにダウンロードする小さなリモート ダウンロード スクリプトを作成しました。これがどのように機能するかです: ユーザーが必要に応じて認証するために、URL、宛先ファイル名、およびオプションでユーザー名とパスワードを入力できる html フォームがあります。フォームは AJAX を使用して php スクリプトを呼び出し、php スクリプトは情報をシェル スクリプトに渡します。問題は、ローカルの 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
言及する価値があるかもしれませんが、私は共有サーバーを所有しています。
ありがとう
EDIT:サーバーにインストールされているwgetのバージョンがhttp認証をサポートしていない可能性はありますか???
編集 2: wget の出力を次のようなファイルにパイプしました。
wget -O "$2" --http-user="$3" --http-password="$4" $1 | echo >> output
しかし、出力は空です。つまり、wget からメッセージが出力されていません!!! そして、渡された資格情報が問題ないかどうかを確認するために、これも行いました。
echo "$3 | $4" >> credentials
そして、それは大丈夫でした。
これは、シェル スクリプトを実行する 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 &");
}
}