WP-CLIを使ってみてディレクトリのユーザーグループとパーミッションで躓く。

WordPress コンピュータ
WordPress

WP-CLIというWordPressをコマンドラインから操作するスクリプトがあります。

コマンド名はwpとしていますが、中身はPHPスクリプトです。
これを使うとWordPressの導入からメンテナンス、記事の投稿、メディアのアップロードなどをコマンドラインから実行できます。
最終的に記事の自動投稿をするスクリプトを作るつもりです。それでは画像ファイルをアップロード(インポート)するコマンドを実行してみます。

wp media import ~/SAMPLE.PNG

Error: No support for generating images found. Please install the Imagick or GD PHP extensions.

GD PHPをインストールしなさいと言っているようです。

Ubuntuのaptでインストールしてみます。

sudo apt install php7.4-gd

インストール後再度実行

wp media import ~/SAMPLE.PNG
            
Warning: Unable to import file '/home/foobar/SAMPLE.PNG'. Reason: アップロードしたファイルをwp-content/uploads/2020/05に移動できませんでした。
Error: No items imported.

エラーが変わりました。
エラーメッセージからするとスクリプトはおおむねうまく実行できたが、最後にファイルを所定の位置に移動できませんでしたと読み取れます。
そういえばwordpressをインストールしたディレクトリのユーザーとグループを「www-data」にした記憶があります。

コマンドをひとひねりして実行

sudo -u www-data wp media import ~/SAMPLE.PNG

成功しました。

実行ユーザーがファイルのアップロード先のディレクトリに書き込む権限が無かったようです。
原因は特定できましたが、毎回毎回sudoをするのもどうかと思います。
特にcronなどで実行させたい場合sudoではpasswordをどうするか問題です。
なんとなくやり方がそもそも違っているような気がします。
ユーザーを「www-data」で実行する方法もありますが、「www-data」はログインして使うタイプのユーザーではないので、出来るかもしれませんがやりたくありません。

というわけで実行ユーザーをwww-dataグループに所属させ、wordpressのディレクトリを書き込めるようにしたいと思います。

Ubuntuでグループに追加してみる

sudo usermod -aG www-data ユーザー名
            
wp media import ~/SAMPLE.PNG

Warning: Unable to import file '/home/foobar/SAMPLE.PNG'. Reason: アップロードしたファイルをwp-content/uploads/2020/05に移動できませんでした。
Error: No items imported.

駄目のようです。

ではwp-content/uploads/2020/05の属性を見てみます。

drwxr-xr-x 2 www-data www-data

グループに書き込み権限が無いようです。
さて困った。

sudo chmod -R 775 /var/www/html/wordpress/wp-content/uploads

とでもすれば良さそうですが、uploads下の年月のディレクトリは月が変わると新しく作成されますのが、そのパーミッションが何になるか?
ディレクトリが作成される都度chmodするのは避けたいところです。
情報をネットで検索しましたが見つかりませんでした。wordpressのソースを追いかければよいのかもしれませんが、年月のディレクトリを作成しているコードがどこか特定出来そうにないです。

それでも大雑把に以下のコマンドを実行してみました。

grep mkdir --include '*.php' -r

そうしたところwp-includes/functions.php内にfunction wp_mkdir_p( $target )という共通関数のようなものを見つけました。
その関数を見た感じでは基本的に$targetの親ディレクトリのパーミッションを引き継ぐ形でディレクトリを作成しているようですが、条件によってはその限りではない。
といった感じでした。
年月のディレクトリをその関数を使っていることを確認していませんし、その他条件によりうまくいかないかもしれませんが、親ディレクトリであるuploadsのパーミッションを775に変更して6月を待ちたいと思います。

sudo chmod -R 775 /var/www/html/wordpress/wp-content/uploads

wp media import ~/SAMPLE.PNG

Warning: Unable to import file '/home/foobar/SAMPLE.PNG'. Reason: アップロードしたファイルをwp-content/uploads/2020/05に移動できませんでした。
Error: No items imported.

あれ、ダメだ。

実行ユーザーをusermodでwww-dataグループに所属させた後一度もログアウトしていませんでした。

変更を適用するため再度ログインしなおして実行してみます。

wp media import ~/SAMPLE.PNG
Imported file '/home/foobar/SAMPLE.PNG' as attachment ID 113.
Success: Imported 1 of 1 items.

成功しました。

attachment ID 113.

多分このIDが画像の固有のIDで記事との紐づけなどに使われると思われます。
画面に出力されるということは標準出力だと思いますので、これを拾って正規表現を駆使すればIDを他のスクリプトで利用できそうです。

wp(WP-CLI)コマンド自体PHPのスクリプトなので、PHPを使えばよいとは思いますが、wordpressのコードを読むのは大変そうなので、他のスクリプト言語でwpを外部コマンドとして実行したいと考えています。

注意)ローカルネットワーク内にサーバーを立てて実行しています。パーミッションの変更はセキュリティ上の問題が生じる場合がありますのでよく考えて実行しましょう。

コメント