JavaScriptでシェルコマンドを実行する方法


127

システムシェルコマンド(lsたとえば)を実行して値を返すJavaScript関数を記述したいと思います。

どうすればこれを達成できますか?


4
このコマンドをクライアントまたはサーバーのどこで実行しますか?
JanHančičDec

どのオペレーティングシステムを使用していますか?
Anderson Green

ここでは、シェルスクリプトのためのNode.jsを使用して行う方法についてのチュートリアルです:dreamsyssoft.com/javascript-shell-scripting/shell-tutorial.php
ロッキープーリー

7
嫌いな答えをベストアンサーとして選んだのはなぜですか?o.0
アンドレ・レヴィ

どのタイプのJavaScriptかを具体的に説明してください。これはサーバー側のJavaScriptでは可能ですが、クライアント側のJavaScriptでは不可能です。
Raymond Peng

回答:


132

ここでの他の回答の多くは、ブラウザーで実行されているJavaScript関数の観点からこの問題に対処しているようです。質問者が「シェルスクリプト」と言ったとき、彼はNode.jsバックエンドJavaScriptを意味すると想定して、撮影して回答します。おそらくcommander.jsを使用してコードのフレームを作成します:)

ノードのAPIからchild_processモジュールを使用できます。以下のサンプルコードを貼り付けました。

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

child = exec('cat *.js bad_file | wc -l',
    function (error, stdout, stderr) {
        console.log('stdout: ' + stdout);
        console.log('stderr: ' + stderr);
        if (error !== null) {
             console.log('exec error: ' + error);
        }
    });
 child();

お役に立てれば!


14
1つのことを除いて。「子は関数ではありません」というエラーが表示されます。exec()を呼び出すと、コマンドが実行されます-child()を呼び出す必要はありません。残念ながら、コールバックは、子プロセスが出力するものを持っているときはいつでも呼び出されません-子プロセスが終了したときにのみ呼び出されます。時にはそれは大丈夫ですが、時にはそうではありません。
John Deighan 16

2
コールバックを回避するには、execSyncを使用できます。
Dan Dascalescu 2018

1
誰がブラウザについて話しましたか?それはJavaScriptを言うだけで、それ以上はありません。
Virus721

49

...数年後...

ES6は標準として受け入れられており、ES7はもうすぐですので、更新された回答に値します。例としてES6 + async / awaitとnodejs + babelを使用します。前提条件は次のとおりです。

サンプルfoo.jsファイルは次のようになります。

import { exec } from 'child_process';

/**
 * Execute simple shell command (async wrapper).
 * @param {String} cmd
 * @return {Object} { stdout: String, stderr: String }
 */
async function sh(cmd) {
  return new Promise(function (resolve, reject) {
    exec(cmd, (err, stdout, stderr) => {
      if (err) {
        reject(err);
      } else {
        resolve({ stdout, stderr });
      }
    });
  });
}

async function main() {
  let { stdout } = await sh('ls');
  for (let line of stdout.split('\n')) {
    console.log(`ls: ${line}`);
  }
}

main();

バベルがあることを確認してください:

npm i babel-cli -g

最新のプリセットをインストール:

npm i babel-preset-latest

次の方法で実行します。

babel-node --presets latest foo.js

3
クイックコマンドのみを実行する必要がある場合、すべての非同期/待機はやりすぎです。execSyncだけを使用できます。
Dan Dascalescu 2018

Node.jsソリューションを求める人はいませんでした。それはJavaScriptを言うだけです。
Virus721

43

以前の回答であらゆる種類の複雑な解決策が得られた理由はわかりません。のようなクイックコマンドを実行するだけの場合はls、非同期/待機やコールバックなどは必要ありません。必要なものは次のとおりです-execSync

const execSync = require('child_process').execSync;
// import { execSync } from 'child_process';  // replace ^ if using ES modules
const output = execSync('ls', { encoding: 'utf-8' });  // the default is 'buffer'
console.log('Output was:\n', output);

エラー処理を行うには、ステートメントをtry/ catchブロックで囲みます。

完了するまでに時間がかかるコマンドを実行している場合は、はい、非同期exec関数を確認してください。


19

これは完全にJavaScript環境に依存します。詳しく説明してください。

たとえば、Windowsスクリプトでは、次のようなことを行います。

var shell = WScript.CreateObject("WScript.Shell");
shell.Run("command here");

18
LinuxなどのUnixライクなオペレーティングシステムで同じことを行うことはできますか?
Anderson Green

このコマンドの実行方法:route print -4 | 「TAP-Windowsアダプタ」を見つけますか?試したが何も返さない
ikel

1
それが私が探していたものです。Node.jsについて話しているすべての人々を困らせています。ここでNode.jsを要求したのは誰ですか?誰もしなかった。
Virus721

JavaScriptがブラウザー内にある場合、これは機能しますか?
Ali Sajjad

14

一言で言えば:

// Instantiate the Shell object and invoke its execute method.
var oShell = new ActiveXObject("Shell.Application");

var commandtoRun = "C:\\Winnt\\Notepad.exe";
if (inputparms != "") {
  var commandParms = document.Form1.filename.value;
}

// Invoke the execute method.  
oShell.ShellExecute(commandtoRun, commandParms, "", "open", "1");


5
これがどのWebブラウザーで実行されているかについては多くの手書きのようですが、JavaScriptも完全に有効なWindowsシェルスクリプト言語であることを理解する必要があります。
クレイグ、

6

NodeJSを使用すると、そのように簡単です!また、サーバーの起動ごとにこのスクリプトを実行する場合は、永久サービスアプリケーションを確認できます。

var exec = require('child_process').exec;

exec('php main.php', function (error, stdOut, stdErr) {
    // do what you want!
});

コールバックを回避するために、簡単なコマンドにはexecSyncを使用できます。
Dan Dascalescu 2018

5

注:これらの回答は、ブラウザーベースのクライアントからUnixベースのWebサーバーへのものです。

クライアントでコマンドを実行する

あなたは本質的にできません。セキュリティによると、ブラウザー内でのみ実行され、コマンドとファイルシステムへのアクセスは制限されています。

サーバーでlsを実行します

AJAX呼び出しを使用して、GETを介してパラメーターを渡す動的ページを取得できます。

mrs rougeハッカーがアプリケーションにrunと​​言わせないようにするために何かをする必要があるので、これはセキュリティリスクも開くことに注意してください:/ dev / null && rm -rf / ......

つまり、一言で言えば、JSからの実行は単に悪い、悪い考えです... YMMV


本質的に、クロスブラウザーの方法ではできませんIEだけが(WSript / ActiveX経由で)シェルにフックしていると思います。
ジャスティンジョンソン


3

IEでは、これを行うことができます。

var shell = new ActiveXObject("WScript.Shell");
shell.run("cmd /c dir & pause");

3

ifconfigLinuxのシェルコマンドを実行する簡単なコマンドはこちら

var process = require('child_process');
process.exec('ifconfig',function (err,stdout,stderr) {
    if (err) {
        console.log("\n"+stderr);
    } else {
        console.log(stdout);
    }
});

コールバックを回避するには、execSyncを使用できます。
Dan Dascalescu 2018

3
function exec(cmd, handler = function(error, stdout, stderr){console.log(stdout);if(error !== null){console.log(stderr)}})
{
    const childfork = require('child_process');
    return childfork.exec(cmd, handler);
}

この関数は次のように簡単に使用できます。

exec('echo test');
//output:
//test

exec('echo test', function(err, stdout){console.log(stdout+stdout+stdout)});
//output:
//testtesttest

1

ではnashornあなたはこのようなスクリプトを書くことができます。

$EXEC('find -type f');
var files = $OUT.split('\n');
files.forEach(...
...

そしてそれを実行します:

jjs -scripting each_file.js

0

npmを使用している場合は、shelljsパッケージを使用できます

インストールするには: npm install [-g] shelljs

var shell = require('shelljs');
shell.ls('*.js').forEach(function (file) {
// do something
});

詳細:https : //www.npmjs.com/package/shelljs

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.