web-dev-qa-db-ja.com

WordPressがプラグインを転送するためにWebサーバー上でftpサーバーを実行する必要があるのはなぜですか?

スーパーユーザーで 関連する質問 を聞きました。

FTP経由でファイルを「受信」するシステムのユースケースは、例えば、WordPressが1クリックでインストールされ、そこではWordPressがftpを使ってリモートのWordPressプラグインリポジトリからローカルLinuxボックスへのファイル転送を開始する方法です

より具体的にはこの画面:

WP asking for ftp info during plugin install

私が最初に知っていたのは、WordPressがWordPressプラグインリポジトリからファイルを転送するということです。FTPクライアントが行う方法と同じです。しかし、 チャットについてのさらなる議論 をすると、WordPressがWebサーバーのFTP詳細を要求するのはなぜなのか混乱してしまいますか?

私はここで何が足りないのですか?

3
Sathyajith Bhat

あなたがWordPressにファイルシステムへの書き込みを要求する何かをするとき、それはそれが一時ファイルを書くことによってそうする許可を持っているかどうか見るチェックをします。このチェックが失敗した場合は、ファイルをサーバーに書き込むためにFTPの詳細を要求します。

EDIT

このチェックを行うwp-admin/includes/file.php関数については、get_filesystem_methodの843行を見てください。

2
Milo

wp-admin/includes/file.php** get_filesystem_method()**は、ファイルに書き込めるかどうかを判断するために誤ったテストを行います。 853行目で

if ( getmyuid() == @fileowner($temp_file_name) )

getmyuid()の使用はunixにとっては間違っています - 代わりにそれはposix_getuid()であるべきです。問題は、getmyuid()がスクリプトを実行しているユーザーではなく、スクリプトファイルの所有者を返すことです。 UNIXでは、ファイルがrootでインストールされ、Webサーバがユーザwww-dataとして実行されている場合、テスト中にファイルが書き込まれたとしてもtestは失敗します。

そのため、修正するには、getmyuid()の行を次のように変更します。

if ( posix_getuid() == @fileowner($temp_file_name) )
2
a9k

ミロの 答え は正しいです。 get_filesystem_method() が2011年から少し変更されたため)確認方法についての詳細を追加したいと思いました。

まず、FS_METHODwp-config.php'direct''ssh2''ftpext'または'ftpsockets'に定義することで、このチェックを完全に無効にすることができます。

この定数が設定されていない場合、WPは使用する方法を決定しようとします。これは、wp-content/temp-write-test-1434788954という名前の一時ファイルを作成しようとすることで行われます(最後の数字は現在のタイムスタンプです)。このファイルを作成できない場合は、ssh2ftpext、またはftpsocketsメソッド(つまり、認証資格情報を必要とする煩わしいもの)を使用します。

ファイルが作成できる場合、WPはそのファイルの所有者とwp-admin/includes/file.phpの所有者を比較します。これらが同じであれば、すべてが問題ないのでdirectメソッドを使用できます。


TL; DR:Webサーバーユーザーはwp-content/への書き込みを許可され、wp-admin/includes/file.phpの所有者である必要があります。

0
Sam Wilson