13

この質問はこの質問と一致してます。安全な FTP サーバーに接続しようとしていますが、接続できません。奇妙な部分は、ssh を実行してサーバーに接続できることですが、php から実行しようとするといくつかの異なるアプローチを使用したコードですが、機能していません

アプローチ:

  1. FTP ラッパー
  2. ftp_connect&ftp_login
  3. ftp_ssl_connect
  4. ssh2_sftp
  5. 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_connecthttpd で実行している場合でもphp が動作することを確認してください。

ポリシー (-P) を「オン」に設定して、再起動後も保持されるようにします。

setsebool -P httpd_can_network_connect=1

解決策 3

会社のファイアウォールにも問題がある可能性があります。適切に構成され、アクセス権が適切に設定されていることを確認してください。

解決策 4

別のアプローチは、cURL を使用することです: libcurlは、さまざまな種類のプロトコルを持つさまざまな種類のサーバーに接続して通信するために使用できるためです。

解決策 5

FTP サーバーへの安全な接続を確立するためにも使用できるPHP Secure Communication Library (phpspeclib)と呼ばれるオープン ソース プロジェクトがあります。

4

5 に答える 5

1
  1. 多くの安価なウェブホスティング業者は ssh を提供せず (したがって ssh 別名 sftp による ftp は提供しません)、ssl で保護された ftp 別名 ftps のみを提供します (こちらを参照)。あなたはその問題を抱えているかもしれません。他の人が示唆したように、filezillaまたは別の ftp クライアントを使用して、クレジットと選択したセキュリティ方法を事前にテストしてください。

  2. ftp_ssl_connect() 少なくとも Windows では、独自の php バイナリをコンパイルする必要があるため、長い道のりになります。ここを参照してください

  3. この php 寄稿者が正当に指摘しているように、有効な証明書による「ピア認証」とも呼ばれる、誰と話しているのかわからない限り、安全な接続は安全ではありません。

  4. phpseclibがおそらく最善の策です。しかし、ピア検証を使用することを確認する方法がわかりません(真実はopenssl.confにあると思います...)

  5. したがって、執筆時点でも、ピア検証済みの ftps (ssl/tls 認証を使用した ftp) が可能であるかどうか、これまで以上に疑問に思っています...私の質問 hereも参照してください。

于 2014-02-19T11:29:45.973 に答える
1

このページにはあなたが求めているものがあります(私はそう思います)

http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/

ここにマニュアルページがあります

http://php.net/manual/en/book.ssh2.php

于 2010-02-01T12:49:43.200 に答える
0

私も、暗号化された接続を処理するときに非常に多くの問題に遭遇しました。

まず、使用しようとしているプロトコルを確認します。セキュアFTPは、最も一般的にFTP over SHHを拒否しますが、SCP、SFTP、またはFTPSを意味する場合もあります。

理解する1つの方法は、filezillaなどのクライアントを使用して接続を確認することです。

プロトコルがPHPモジュールを介して処理される場合、最善のアプローチは実際にそれを使用することです。この場合、プロトコル関連のものに加えて、PHP用にOPENSSLモジュールがインストールされていることを確認する必要があります。

それでもモジュールサポートが機能しない場合があります。この場合、libcurlモジュールを使用することは1つのオプションです。これは、たとえば、クライアント証明書を使用する必要がある場合です。

残念ながら、ここでも、phpモジュールでlibcurlが部分的にサポートされているため、いくつかの問題が発生する可能性があります。私が実験したシナリオの1つは、サーバー証明書がモジュールによって無効であると判断された場合です。

私が通常使用する最後の解決策は、execステートメントからcurlバイナリを実行することです。後者の場合は、「-k」スイッチを使用します。

于 2010-02-02T20:23:31.150 に答える
0

phpseclib ライブラリを試してみましたが、Windows と Linux で動作します。

composer を使用している場合は、require セクションに追加するだけです。

"phpseclib/phpseclib": "0.3.*@dev"

そして、これを行うことができます: http://phpseclib.sourceforge.net/sftp/examples.html#put

于 2014-04-08T17:44:44.877 に答える