2017-02-28 10 views
2

私は1ヶ月前に仕事をしていたことを知っているPHP経由でFTPを実行しているPCを持っていますが、もはや働いていません。私はPCを使用していることは知っていますが、変更された可能性は考えられません。PHPのftp_putが "データ接続を構築できません:接続が拒否されました"

PHPは、データ接続を構築することができません

を読んで、エラーメッセージを投げている:私はftp_put()機能を使用するときに接続が...

を拒否しました。

私が使用してい伐採コードは次のとおりです。

<?php 

$trackErrors = ini_get('track_errors'); 
ini_set('track_errors', 1); 

$server="***.***.***.***"; 
$port=21; 
echo "<LI>Connecting to $server:$port<BR>"; 
$conn_id = ftp_connect($server,$port,9999999) or die("<BR>Unable to connect to ".$server.":$port server."); 
if (!$conn_id) { 
    $errmsg = $php_errormsg; 
    echo "<BR><LI>ERR:$errmsg"; 
} 
else { 
    $passive=false; 
    echo "<LI>Setting Passive Mode=$passive"; 
    ftp_pasv($conn_id, $passive); 

    $user="*********"; 
    $pass="*********"; 
    echo "<LI>Connecting as $user/*****"; 
    if (!ftp_login($conn_id, $user, $pass)) { 
     $msg = "Failed to login to $selected_server as $user; <BR>check logincredentials in the Settings"; 
     echo "<BR><LI>$msg"; 

     $errmsg = $php_errormsg; 
     echo "<LI>ERR:$errmsg"; 
     return $msg; 
    } 

    ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 10000); 


    if ([email protected]_put($conn_id, "test.txt", "C:......test.txt", FTP_BINARY)) { 
     echo "<BR><LI>ftp_put failed"; 

     $errmsg = $php_errormsg; 
     echo "<LI>ERR:$errmsg"; 
    } 
    echo "<HR>Done"; 
} 
?> 

出力Webページが

Connecting to ***.***.***.***:21 
Setting Passive Mode= 
Connecting as *******/***** 
ftp_put failed 
ERR:ftp_put(): Unable to build data connection: Connection refused 
Done 

結果がftp_put()がエラーメッセージを与えることで、ゼロを残しているとして、これを実行しているとき(0)バイトのファイルをサーバー上の正しいファイル名に置き換えます。

奇妙なことがあるが

  1. 同じコード/接続情報は、[OK]を別のラップトップ上で動作することである
  2. 問題がいくつかで発生したファイルを押すと同じ接続情報は、FileZillaをを使用して[OK]を作品
  3. サーバー(つまり、問題のある特定の宛先だけではありません)

また、これはパッシブモードとは関係がないようですこれを有効にしてください)

誰にも提案はありますか?
ありがとう
Abe

+0

コマンドラインでnetstat -nを使用して、ftp_close()の直前でポート20と21が開いていることがわかります。 PHPのドキュメントには、ポート20がデータチャネルであることが示唆されていますが、問題が発生しているINBOUNDの問題(サーバーからPC)について話しています。 INBOUNDでポート20と21を開くためのファイアウォールルールを追加したので、PHPが動作することがわかります。しかし、PHPがポート20を望んでいる理由(Filezillaはしませんが)、(b)他のPCに同じ問題がない理由(どちらも会社のPC、同じモデル/年齢/ビルド)、 (c)私が採用すべきファイアウォールの修正(もしあれば)。 – user1432181

+0

FileZillaはデフォルトでパッシブモードを使用しているので、重複した質問の答えが示唆するように、あなたは何をすべきでしょうか。 –

+0

冗長なFileZillaログを表示します。 –

答えて

1

アクティブFTPモードを使用しています。アクティブモードでは、サーバーはクライアントに接続しようとします。ほとんどのネットワーク構成では、クライアントマシンが通常ファイアウォールの内側にあるため不可能です。

サーバがで失敗理由です:

データ接続を構築することができません

に:接続は、それは、特にこのような状況のためにProFTPDのエラーメッセージです

を拒否しました。

詳細はactive and passive FTP connection modesの記事をご覧ください。彼らが無効にファイアウォールがある場合や、彼らが非特権ポート上の着信トラフィックを許可するルールを持っている場合


コードは、他のマシン上で動作することができます。

FileZillaはデフォルトのパッシブモード(最新のFTPクライアントのように)のため動作します。


パッシブモードも試したことがありますが、同じエラーメッセージが表示されています。

これは、ftp_pasvコールを間違って使用しているためです。

ftp_loginの後にコールを移動する必要があります。

$user = "*********"; 
$pass = "*********"; 
echo "<LI>Connecting as $user/*****"; 
if (!ftp_login($conn_id, $user, $pass)) { 
    // ... 
} 

$passive = true; 
echo "<LI>Setting Passive Mode=$passive"; 
ftp_pasv($conn_id, $passive); 

The documentation明確にそれを示唆:

(そのftp_pasvに注意してください)が唯一のログインに成功した後、またはそれ以外の場合は失敗します呼び出すことができます。 (ジャストピュア-FTPDと)同様の問題については


PHP upload via FTP - ftp_put() I won't open a connection to x.x.x.x (only to y.y.y.y)を参照してください。

関連する問題