2011年4月4日月曜日

node.js express ejs でUNIXのコマンド実行ツールを作ってみた!

サーバでコマンドを実行し、Webで結果を表示するツールを作ってみた。
ただ、セキュリティ考えれば、サーバに入れて公開してはいけません。
あくまでローカルで、node.jsの動作確認用です。ご注意を!(当たり前ですね)




index.ejs (viewsディレクトリに入れる)

 <html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>kcmd</title>
<script type="text/javascript">
<!--
var cwd;
function check(){
  cwd = document.getElementById('cwd');
  cwd.value = cwd.value;
  return true; // 「OK」時は送信を実行
}
// -->
</script>
</head>


<body>
<form name="kform" method="GET" action="/command" onSubmit="return check()">
作業ディレクトリ:<input type="text" id="cwd" name="kcwd" value="/users"><p>
UNIXコマンドを入力してください: 例 ls -l<p>
$<input type="text" name="kcmdline" size="80"> 
<input type="submit" id="kcmdbtn" value="コマンド実行"><p>
</form>
<div id="dbs">実行結果</div><p>
<h2 style="color:green;background-color:black">
  <% if (message) { %>
    <pre><%= message %></pre>
  <% } %>
</h2>
</body>
</html>



app.js ( $node app で起動する)

var app = require('express').createServer();

app.set('view options', { layout: false });
app.set('view engine', 'ejs');

app.get('/', function(req, res){
  res.render('index.ejs', {
    locals: {
      message: ''
    }
  });
});

//コマンド実行サブミット処理
app.get("/command", function(req, res){
  var cmdstr;

  var util = require('util'),
      exec = require('child_process').exec,
      child;

    var kcwd = req.param("kcwd");
    var kcmdline = req.param("kcmdline");
    console.log('input command is:' + kcmdline);
    console.log('at:' + kcwd);

    child = exec(kcmdline,
    { encoding: 'utf8',
    timeout: 0,
    maxBuffer: 200*1024,
    killSignal: 'SIGTERM',
    cwd: kcwd,
    env: null },

    function (error, stdout, stderr) {
      console.log('stdout: ' + stdout);
      cmdstr = stdout;
      console.log('stderr: ' + stderr);
      res.render('index.ejs', {
        locals: { 
          message: cmdstr
        }
      });
      if (error !== null) {
        console.log('exec error: ' + error);
      }
    }
  );
});

app.listen(8124);
console.log('kcmd: Server running at http://127.0.0.1:8124/');



node.js 手軽でツールとしても面白いね!

0 件のコメント: