UNIXコマンドをhubotで実行する
UNIXコマンドを、赤外線発信の構文(sendメッセージ)の中で実行する方法を説明する。
https://gyazo.com/a12691276187ca3e80be02ff77592b86
できること
UNIXコマンドがあれば、できることの幅がかなり広がる。
例えば、
赤外線では操作できないスマート家電を、WebAPIから操作したり、
といったことを、赤外線の発信と組み合わせながら、実現することができるようになる。
準備
応用例(その1)スマート家電の操作
例えば、WebAPIで操作できるスマート家電を考えてみよう。
このスマート家電の電源をONにするWebAPIのURLが、
https://SMART.DEVICE/API/on
だとすると、以下のようなUNIXコマンド:
curl -s https://SMART.DEVICE/API/on
を実行すれば、電源をONにできる。
このUNIXコマンドを、sendメッセージで扱えるようにするには、
command smart:on curl -s https://SMART.DEVICE/API/on
というメッセージを hubot に送ればよい。
これにより、このUNIXコマンドは smart:on という名前で hubot が覚えてくれる。
あとは、赤外線家電のときと同じように、
send smart:on()
というメッセージを hubot に送れば、hubot が先ほどのUNIXコマンドを実行してくれるので、スマート家電がONになる。
なお、UNIXコマンドの場合は、名前の後に()をつけることに注意。
(後で述べるが、UNIXコマンドには、引数も渡せる。)
スマート家電と赤外線家電を、ひとつのsendメッセージで、まとめて操作することもできる。
send smart:on() tv:on light:on
このように、RM Mini3 を使えば、ひとつのsendメッセージや、ひとつのIFTTTアプレットだけでも、多種多様なデバイスを、ひとまとめに、きめ細かく操作できるので、スマートホームの構築が、シンプルで楽になる。 なお、WebAPIの用意されていないスマート家電でも、IFTTTにさえ対応していれば、IFTTT経由でWebhookを作成できる。
応用例(その2)twitterの通知をGoogle Homeに喋らせる
次に、このUNIXコマンドを say という名で hubot に登録する。すると、喋らせたいテキストをsayに与えて、
send say(花子さんからフォローされました!)
というメッセージをhubotに送るだけで、Google Homeに「花子さんからフォローされました」と喋ってもらうことができる。
あとは、IFTTT アプレットを用意して、twitter アカウントがフォローされたら、Slack にsend say({{FullName}}さんからフォローされました)を送るようにするだけで、twitterでフォローされたらGoogle Homeが喋ってくれるようになる。 UNIXコマンドに与える引数のサニタイズ
セキュリティに関する、少し難しい話をする。
UNIXコマンドに悪意のある引数を与えると、hubotが動いてるサーバで、悪意のあるコマンドが実行されてしまう恐れがある。
それを防ぐために、このシステムでは、引数をUNIXコマンドに渡す前に、引数はサニタイズ(消毒)される。
サニタイズでは、すべての半角記号と制御文字を空白に置き換える。
例えば、rm -rf /という引数をサニタイズすると、半角記号 -と/が に置き換わって、rm rf になる。
上述のsayは、bin/say.js "#"というコマンドを実行することを思い出してほしい。
例えば、悪意のある引数 " ; rm -rf / ; echo " が与えれた場合、もしサニタイズされないまま、引数をコマンドに埋め込んでしまうと、
bin/say.js " " ; rm -rf / ; echo " "
が実行されてしまう。
しかし、このシステムでは、引数は自動的にサニタイズされるので、
bin/say.js " rm rf echo "
が実行され、悪意のあるコマンドは実行されずに済む。
このシステムには、以上のようなセキュリティ対策が施されているので、安心してsayコマンドを使うことができる。
UNIXコマンドを自作する際の注意点(引数の無害化)
UNIXコマンドを自作する際には、悪意のある引数を無害化するために、#がコマンドとして実行されないように、"や'できちんと囲む必要がある。
command my:cmd bin/my_command ..."#"...
極端な話、もし誤って、
command my:cmd #
などというUNIXコマンドを自作してしまうと、#はそのまま、こまんどとして実行されてしまう。
例えば、rm importantというような危険なコマンドは、サニタイズだけでは無害化できず、
send my:cmd(rm important)
を実行すると、rm importantがそのまま実行されてしまう。
記法の仕様変更
バージョン0.6.0以降の hubot-broadlink-rm では、鉤括弧で[2500ms]などと記述するように、仕様を変更した。
0.6.0以降でも、丸括弧で記述することはできるが、非推奨(deprecated)な記法にした。
2018/1/19