この質問はこの質問と一致しています。安全な FTP サーバーに接続しようとしていますが、接続できません。奇妙な部分は、ssh を実行してサーバーに接続できることですが、php から実行しようとするといくつかの異なるアプローチを使用したコードですが、機能していません
アプローチ:
- FTP ラッパー
ftp_connect
&ftp_login
ftp_ssl_connect
ssh2_sftp
ssh2-scp-send
&ssh2-scp-receive
-- このアプローチはまだ試していませんが、コメント部分で推奨されているため、これで機能し、後で更新を投稿します。
アプローチ 1 のコード:
$ftp_server = "ftp://username:password@192.168.1.1:21/{$log_file_name}";
$opts = array('ftp' => array('overwrite' => TRUE));
$context = stream_context_create($opts);
$put_file = file_put_contents($ftp_server, $response, LOCK_EX,$context);
ここでも安全な FTP サーバーに接続できません。接続できない理由について何か提案はありますか?
アプローチ 2 のコード:
ftp_server = 'www.server.com';
$conn_id = ftp_connect($ftp_server) or die ("Cannot connect to host");
//Program dies out here and give error message "Cannot connect to host",
//but why ftp_login does not work here, Any Suggestions ?
$ftp_user_name = "login";
$ftp_user_pass = "password";
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// check connection and login result
if ((!$conn_id) || (!$login_result))
{ echo "FTP connection has encountered an error!";
echo "Attempted to connect to $ftp_server for user $ftp_user_name....";
//exit;
} else
{
echo "Connected to $ftp_server, for user $ftp_user_name".".....";
}
アプローチ 3 のコード:
Here am using same code as approach 1 but instead of ftp_connect, am using ftp_ssl_connect
アプローチ 4 のコード:
$connection = ssh2_connect('www.server.com', 22);
ssh2_auth_password($connection, 'login', 'password');
$sftp = ssh2_sftp($connection);
//exit();
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');
上記のアプローチを使用して安全な FTP サーバーに接続できないのに、 ssh を使用して接続できるのはなぜですか?
php を使用して安全な FTP サーバーに接続する他の方法はありますか?
アップデート:
Q1. ftp_connect を使用して再試行しましたが、停止しただけで、なぜ停止するのですか? ftp_connect が停止するシナリオは何ですか?
Q2. サーバーに接続するには、このアプローチしかありませんか、それとも他に実装できる方法はありますか?
Q3. この php 言語は、安全な FTP 接続をサポートしていないことに関連していますか? または、php を使用してこれを行う他の方法があります。そうであれば、非常に役立つため、さまざまなアプローチを提供します。
更新 1:
私はこの問題についてさらにグーグルで検索しようとしていましたが、ftp_connect が機能しない場合、ファイアウォールがその理由の 1 つになっている可能性があります。それが事実であるかどうかは完全にはわかりませんが、私はそれについてさらに調査しており、有用なものが見つかった場合はここに更新を投稿しています.
考えられる解決策:
問題
「or die」を削除すると、次のエラーが表示されます。
Web ページから実行する場合:
警告: ftp_login() は、パラメーター 1 がリソースであると想定します。これは、28 行目の /var/www/ftp_test.php で指定されたブール値です。
var_dump($conn_id); bool(false) を返します。
コマンドラインから /usr/bin/php /var/www/ftp_test.php
var_dump($conn_id); タイプ (FTP バッファー) のリソース (4) を返します。
スクリプトが完了します。
解決策 1
これは1つかもしれませんsolution
:
オフにしてみてください。検索selinux
は、一時的way
または永続的にオフにするために selinux を無効にする方法です。
解決策 2
selinux を完全にオフにしたくない場合は、setseboolコマンドを使用して httpd_can_network_connect を設定するだけで必要なものが得られる場合があります。
以前に「オフ」に設定されていたことを確認します: getsebool httpd_can_network_connect
「オン」に設定します。
setsebool httpd_can_network_connect=1
selinux をオンに戻します: setenforce 1
ftp_connect
httpd で実行している場合でもphp が動作することを確認してください。
ポリシー (-P) を「オン」に設定して、再起動後も保持されるようにします。
setsebool -P httpd_can_network_connect=1
解決策 3
会社のファイアウォールにも問題がある可能性があります。適切に構成され、アクセス権が適切に設定されていることを確認してください。
解決策 4
別のアプローチは、cURL を使用することです: libcurlは、さまざまな種類のプロトコルを持つさまざまな種類のサーバーに接続して通信するために使用できるためです。
解決策 5
FTP サーバーへの安全な接続を確立するためにも使用できるPHP Secure Communication Library (phpspeclib)と呼ばれるオープン ソース プロジェクトがあります。