Top image

Perl Monk

主にPerlとRaspberryPiの個人的技術研鑽

[Node-RED]SSHで自動ログインしてコマンドを叩き、出力結果をWEBで表示したい編

2020/03/23 20:00
category:サーバ全般

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2020/4/27 追記

node-red-contrib-ssh-v2-reconnection

ですが、2個以上設置した時点で挙動がおかしいのでやめました。

現状は直接execノードとsshpassコマンドで実装しています。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

そしていきなりハマった。すでにくじけそう。

まず、追加ノード:node-red-contrib-ssh-v2-reconnection を利用してみました。なんか他のがうまくいかなかったぽいので。

実行するコマンドはmsg.payloadに入れて渡せばいいんですが、実行後の出力結果を取る情報に関しては全く記載がない。

Usage

Input: msg.payload has to contain the command.

Output: none

て書いてある。none?! どういう事なんだぜ・・・。ノードのソースコードをみたら、msg.stdoutで取れそうなのでdebugで確認した所、恐らくいけそうでした。

ただ、その出力結果をWEBで表示できない。

色々調べたところhttp getが実行された場合、 .req と . res というパラメータができ、それを元にhttpレスポンスを返す仕組みぽいです。これが消えると No response object というエラーがでてうまくいきません。

Node-REDでSSH①

SSHノードを経由するとこれが消えてしまうので、一旦フローの変数に入れてSSHを実行し、.reqと.resを戻してからhttpレスポンスするという荒業でなんとかできました。

もうちょっとスマートなやり方がある気がしてならないけど、いかんせん情報が少ない。これでいいのかすらわからない。Javascriptよく知らんし。

Node-REDでSSH②

まあまだ触り始めただけなので、空いた時間で進めていこうと思います。

以下フロー

[{"id":"cd4d01cc.ea59b","type":"tab","label":"フロー 1","disabled":false,"info":""},{"id":"438e18da.11c058","type":"change","z":"cd4d01cc.ea59b","name":"実行コマンド","rules":[{"t":"set","p":"payload","pt":"msg","to":"date; hostname;","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":580,"y":60,"wires":[["f5a8ba0.4bf3d48"]]},{"id":"f5a8ba0.4bf3d48","type":"ssh-client-v2","z":"cd4d01cc.ea59b","debug":false,"ssh":"/home/centos/ssh-key.pem","hostname":"192.168.10.10","name":"SSHクライアント","x":790,"y":60,"wires":[["3c5212b1.7fcf66"]]},{"id":"49b5cfc0.1f81e","type":"http in","z":"cd4d01cc.ea59b","name":"","url":"/test","method":"get","upload":false,"swaggerDoc":"","x":100,"y":60,"wires":[["82b087ff.421928"]]},{"id":"b9f5e111.efe428","type":"http response","z":"cd4d01cc.ea59b","name":"","statusCode":"","headers":{},"x":830,"y":200,"wires":[]},{"id":"3c5212b1.7fcf66","type":"change","z":"cd4d01cc.ea59b","name":"payload を stdout に代入","rules":[{"t":"set","p":"payload","pt":"msg","to":"stdout","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":250,"y":200,"wires":[["987c9c66.86865"]]},{"id":"82b087ff.421928","type":"change","z":"cd4d01cc.ea59b","name":"reqとresをflowスコープ変数に","rules":[{"t":"set","p":"req","pt":"flow","to":"req","tot":"msg"},{"t":"set","p":"res","pt":"flow","to":"res","tot":"msg"},{"t":"set","p":"payload","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":330,"y":60,"wires":[["438e18da.11c058"]]},{"id":"6d19824e.66b7bc","type":"change","z":"cd4d01cc.ea59b","name":"reqとresを戻す","rules":[{"t":"set","p":"req","pt":"msg","to":"req","tot":"flow"},{"t":"set","p":"res","pt":"msg","to":"res","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":660,"y":200,"wires":[["b9f5e111.efe428"]]},{"id":"987c9c66.86865","type":"template","z":"cd4d01cc.ea59b","name":"HTML生成","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n    <head></head>\n    <body>\n        <h1>DATA</h1>\n        <h1>{{stdout}}</h1>\n    </body>\n</html>","x":470,"y":200,"wires":[["6d19824e.66b7bc"]]}]