お疲れ様です。
お盆は過ぎましたが、まだまだ暑い日が続きますね。でも確実に季節は進んでいるのか、あれだけけたたましく泣いていた蝉も静かになりました。
鳴いていた頃はやかましかったですが、いざ聞こえなくなると物悲しいものですね。
さて、筆者はよくPHPでスクリプトを書いてコマンドラインで実行し、標準出力に出力された結果をコピーして貼り付けたりします。
しかし、毎度毎度、出力結果の該当部分をマウスでつつーっと選択してクリップボードにコピーするという操作がつらい。肩がこる。
ということで、PHPで出力した結果を直接クリップボードに出力するようにしてみたので、その方法を記事にしてみます。
ここで解説すること
PHPで実行した結果を標準出力だけでなく、直接実行端末のクリップボードに出力します。
計算したデータのハッシュ値をコピーしたいときや、SQLを生成したときなどに、コピペが捗ります。
筆者の環境
本記事を記載している時点での筆者の環境は以下のとおりです。PHPはHomeBrew版を利用しています。
OS | Mac 13.4.1 (c) |
PHP | PHP 8.2.9 (cli) |
ソース
まずは実際のソースです。この関数の第一引数にクリップボードへ送りたいデータを指定します。
function toClipBoard(int|float|string $dat) : void
{
exec("echo " . escapeshellarg($dat) . "|pbcopy");
}
使用例
以下のように使います。これで$resultの変数に与えられた文字列がクリップボードに転送されます。
$resultの変数にヒアドキュメント内の4行目は、コマンドインジェクションが発生しないかを軽く検証するための文字列です。
toClipBoard.php
<?php
$result =<<< EOF
吾輩は猫である。
名前はまだ無い。
どこで生れたかとんと見当がつかぬ。
echo hello world'"!;/\|
EOF;
toClipBoard($result);
function toClipBoard(int|float|string $dat) : void
{
exec("echo " . escapeshellarg($dat) . "|pbcopy");
}
実行例
ターミナルで以下のようにコマンド実行します。実行しても一見何も起こりませんが、任意のエディタなどに貼り付けを行うと「吾輩は猫である。」から始まる$result変数内のデータが貼りつけられると思います。
php toClipBoard.php
簡単な解説
exec関数
PHPの標準関数のexecです。コマンドラインで利用可能なコマンドをPHPから呼び出すことができます。
この関数を利用している時点で詳しい方にはもうタネがバレていることでしょう。
escapeshellarg関数
こちらもPHPの標準関数のescapeshellargです。toClipBoard関数に与えられた引数の文字列データは外部からやってくるデータなので、100%信用することができません。
exec関数はなんでもできてしまうため、サニタイズ(入力データの無害化)をしなければ、想定外のコードが実行されるRCE(Remote Code Execution : リモートコード実行)攻撃が成立してしまう可能性があります。
そのサニタイズをしてくれる関数がこの関数です。
個人で使う分には、入力データに対する信用なんて関係ないかもしれません。しかし、exec関数など危険な関数を利用するときは常にサニタイズする癖をつけておいた方が無難です。そのうちexec関数を見たときにサニタイズがされていないと無性に不安になるようになります。(私だけかな?)
echoコマンド
お馴染みのコンソールのコマンドです。引数に指定された文字列をそのまま標準出力に出力します。
pbcopyコマンド
クリップボードにテキストを転送してくれるコンソールのコマンドです。通常、Macにインストールされていると思います。
|(パイプ)で任意のコマンドの後ろにこのコマンドを繋ぐことで、前に繋いだコマンドの標準出力の結果をpbcopyが受け取り、クリップボードに転送してくれます。
Windowsの場合、このコマンドを「clip」に書き換えてもらえば動作すると思います。
exec(“echo ” . escapeshellarg($dat) . “|pbcopy”);
サニタイズされた出力対象の文字列を、echoコマンドを使って一度標準出力に出力し、その出力内容をpbcopyコマンドに送って、クリップボードにデータを転送しています。
注意点
PHPイコールWEBアプリケーションというイメージをお持ちの方がいるかもしれませんが、この関数はWEBアプリケーションでは動作しません。(たぶん、pbcopyというコマンドがないというエラーになるか、一見何も起こりません。)
WEBアプリケーションに訪問してくれたユーザーのクリップボードに何かしらのデータを転送したい場合、そのような機能がJavaScriptにあるので、そちらを利用しましょう。
最後に
欲しいと思ってサッと調べて見つからなかったので、自作してみました。ただ、見つからないということは需要が少ないということかもしれませんね。
何かの参考になれば幸いです。