スーパーユーザーで 関連する質問 を聞きました。
FTP経由でファイルを「受信」するシステムのユースケースは、例えば、WordPressが1クリックでインストールされ、そこではWordPressがftpを使ってリモートのWordPressプラグインリポジトリからローカルLinuxボックスへのファイル転送を開始する方法です
より具体的にはこの画面:
私が最初に知っていたのは、WordPressがWordPressプラグインリポジトリからファイルを転送するということです。FTPクライアントが行う方法と同じです。しかし、 チャットについてのさらなる議論 をすると、WordPressがWebサーバーのFTP詳細を要求するのはなぜなのか混乱してしまいますか?
私はここで何が足りないのですか?
あなたがWordPressにファイルシステムへの書き込みを要求する何かをするとき、それはそれが一時ファイルを書くことによってそうする許可を持っているかどうか見るチェックをします。このチェックが失敗した場合は、ファイルをサーバーに書き込むためにFTPの詳細を要求します。
EDIT
このチェックを行うwp-admin/includes/file.php
関数については、get_filesystem_method
の843行を見てください。
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) )
ミロの 答え は正しいです。 get_filesystem_method()
が2011年から少し変更されたため)確認方法についての詳細を追加したいと思いました。
まず、FS_METHOD
のwp-config.php
を'direct'
、'ssh2'
、'ftpext'
または'ftpsockets'
に定義することで、このチェックを完全に無効にすることができます。
この定数が設定されていない場合、WPは使用する方法を決定しようとします。これは、wp-content/temp-write-test-1434788954
という名前の一時ファイルを作成しようとすることで行われます(最後の数字は現在のタイムスタンプです)。このファイルを作成できない場合は、ssh2
、ftpext
、またはftpsockets
メソッド(つまり、認証資格情報を必要とする煩わしいもの)を使用します。
ファイルが作成できる場合、WPはそのファイルの所有者とwp-admin/includes/file.php
の所有者を比較します。これらが同じであれば、すべてが問題ないのでdirect
メソッドを使用できます。
TL; DR:Webサーバーユーザーはwp-content/
への書き込みを許可され、はwp-admin/includes/file.php
の所有者である必要があります。