Node.jsで他のPCからコマンドでPCを操作するようなコード（？）を書いてみた

# はじめに
今回はChild_Process(Node.js)を使って、pcを他のpcからコマンドで操作するようなコード（？）を書きます

:::note warn
自分以外のpcで実行しないでください。
あとセキュリティ性を無視して書いてるので、実行することをあまりおすすめしません。
:::
# 必要なモジュール
以下のコマンドを実行してください。
```:cmd, powershell
npm install express cors child_process
```

# フォルダ構成
```:フォルダ構成
-------------|
             |---public|
             |         |---index.html
             |
             |--app.js
             |
             |--run.bat

```
※...run.batは起動時にタスクスケジューラで開始するために書いたものなので、OS起動時にapp.jsを実行したくない人はコピペしなくても大丈夫です

# コードのコピペ
以下のコードをコピペしてください。
```javascript:app.js
/* ローカルネットワーク内でコマンドを実行するためのファイル
   ちなみに使用できるコマンドはOSに左右されます
   注意：決して悪用しないでください。法に触れる可能性があります */

   const express = require('express');
   const cors = require('cors');
   const path = require('path');
   const { exec } = require('child_process');
   
   const app = express();
   app.use(express.static(path.join(__dirname, 'public')));
   app.use(cors());
   app.use(express.json());
   
   exec("chcp 65001", (error, stdout, stderr) => {
        if(error || stderr) {
            console.error(`error: ${error}, \nstderr: ${stderr}`)
        }
    })

   app.get('/', (req, res) => {
       res.sendFile(path.join(__dirname, 'public', 'index.html'));
   });
   

   app.post('/crun', (req, res) => {
       const cs = req.body.cname; // 実行したいコマンド名
   
       if (!cs) {
           return res.json({ error: "command is null" });
       }
   
       exec(cs, { encoding: 'utf8' }, (error, stdout, stderr) => {
           if (error) {
               console.error(`command execute error: ${cs}\nError Code: ${error.code}\nStderr: ${stderr}`);
               return res.json({
                   error: `command execute error: ${cs}\nerrorcode: ${error.code}\n${stderr}`
               });
           }
   
           if (stderr.length > 0) {
               console.warn(`command warning: ${cs}\nStderr: ${stderr}`);
               return res.json({
                   warning: `error\n${stderr}`
               });
           }
   
           console.log(`user executed command: ${cs}, \nresult: ${stdout}`);
   
           res.json({
               success: `command success: ${cs}`,
               logs: stdout
           });
       });
   });
   
   app.listen(80, '<Your_address>', () => { //自分のIPアドレスなどに変更
       console.log('server running on default. listener Count:', app.listenerCount());
   });
   
   ```
   index.html(コマンドを指定するページ):
   ```html:index.html
   <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Remote Execute commands</title>
</head>
<body>
    
    <center>
        <h1>run command</h1>
        <p>コマンドの詳細はCtrl+Shift+I⇒consoleから確認できます</p>
        <input type="text"  id="command">
        <p id="navigation"></p>
    </center>
</body>
<script>
    const navi = document.getElementById('navigation');
    const command = document.getElementById('command');
    window.onload = function()  {
        command.addEventListener('keydown', (event) => {
            if(event.key === "Enter") {
            fetch('/crun', {
                method: 'POST',
                headers: {
                    "content-type": "application/json"
                }, body: JSON.stringify({
                    cname: command.value
                })
            })
            .then(response => response.json())
            .then(data => {
                if(data.error) {
                    console.log(data.error);
                    navi.style.color = "red";
                    navi.textContent = `Error: ${data.error}`
                    return;
                }
                    navi.style.color = "black";
                    navi.textContent = `${data.success}`
                    console.log(data.logs); //ログの表示
                
            })
            }
        })
    }
</script>
</html>
```

run.bat(ちなみに動作確認してないので、必要に応じて修正してください。)
```bat:run.bat
chcp 65001 ::pathに日本語が含まれていたときにcdが正しく実行されないから
cd <Your_path>
node app.js
```

# 使い方
app.jsを編集して、<Your_address>のところを操作されるpc側のアドレスに置き換えてください。その後に`node app.js`を実行してください。
ちなみに自分の場合は `192.168.11.22`に置き換えました。

# 最後に
今回はChild_process(Node.js)を使ってコマンドで他のpcを操作するようなコードを書いてみました。ちなみに他の人のpcでは実行しないでください。
それではまたお会いしましょう。