システムシェルコマンド(lsたとえば)を実行して値を返すJavaScript関数を記述したいと思います。
どうすればこれを達成できますか?
システムシェルコマンド(lsたとえば)を実行して値を返すJavaScript関数を記述したいと思います。
どうすればこれを達成できますか?
回答:
ここでの他の回答の多くは、ブラウザーで実行されている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();
お役に立てれば!
...数年後...
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
以前の回答であらゆる種類の複雑な解決策が得られた理由はわかりません。のようなクイックコマンドを実行するだけの場合は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関数を確認してください。
これは完全にJavaScript環境に依存します。詳しく説明してください。
たとえば、Windowsスクリプトでは、次のようなことを行います。
var shell = WScript.CreateObject("WScript.Shell");
shell.Run("command here");
一言で言えば:
// 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");
NodeJSを使用すると、そのように簡単です!また、サーバーの起動ごとにこのスクリプトを実行する場合は、永久サービスアプリケーションを確認できます。
var exec = require('child_process').exec;
exec('php main.php', function (error, stdOut, stdErr) {
// do what you want!
});
注:これらの回答は、ブラウザーベースのクライアントからUnixベースのWebサーバーへのものです。
クライアントでコマンドを実行する
あなたは本質的にできません。セキュリティによると、ブラウザー内でのみ実行され、コマンドとファイルシステムへのアクセスは制限されています。
サーバーでlsを実行します
AJAX呼び出しを使用して、GETを介してパラメーターを渡す動的ページを取得できます。
mrs rougeハッカーがアプリケーションにrunと言わせないようにするために何かをする必要があるので、これはセキュリティリスクも開くことに注意してください:/ dev / null && rm -rf / ......
つまり、一言で言えば、JSからの実行は単に悪い、悪い考えです... YMMV
このトピックに関する別の投稿で、jQuery / Ajax / PHPソリューションが優れています。
ifconfigLinuxのシェルコマンドを実行する簡単なコマンドはこちら
var process = require('child_process');
process.exec('ifconfig',function (err,stdout,stderr) {
if (err) {
console.log("\n"+stderr);
} else {
console.log(stdout);
}
});
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
ではnashornあなたはこのようなスクリプトを書くことができます。
$EXEC('find -type f');
var files = $OUT.split('\n');
files.forEach(...
...
そしてそれを実行します:
jjs -scripting each_file.js
npmを使用している場合は、shelljsパッケージを使用できます
インストールするには: npm install [-g] shelljs
var shell = require('shelljs');
shell.ls('*.js').forEach(function (file) {
// do something
});