Saya ingin menulis fungsi JavaScript yang akan menjalankan perintah shell sistem ( lsmisalnya) dan mengembalikan nilainya.
Bagaimana saya mencapai ini?
Saya ingin menulis fungsi JavaScript yang akan menjalankan perintah shell sistem ( lsmisalnya) dan mengembalikan nilainya.
Bagaimana saya mencapai ini?
Jawaban:
Banyak dari jawaban lain di sini tampaknya mengatasi masalah ini dari perspektif fungsi JavaScript yang berjalan di browser. Saya akan menembak dan menjawab dengan asumsi bahwa ketika penanya mengatakan "Shell Script" yang dia maksud adalah JavaScript backend Node.js. Mungkin menggunakan commander.js untuk menggunakan bingkai kode Anda :)
Anda dapat menggunakan modul child_process dari node API. Saya menempelkan kode contoh di bawah ini.
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();
Semoga ini membantu!
... beberapa tahun kemudian ...
ES6 telah diterima sebagai standar dan ES7 sudah dekat sehingga layak mendapatkan jawaban yang diperbarui. Kami akan menggunakan ES6 + async / await dengan nodejs + babel sebagai contoh, prasyaratnya adalah:
foo.jsFile contoh Anda mungkin terlihat seperti ini:
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();
Pastikan Anda memiliki babel:
npm i babel-cli -g
Instal preset terbaru:
npm i babel-preset-latest
Jalankan melalui:
babel-node --presets latest foo.js
Saya tidak tahu mengapa jawaban sebelumnya memberikan segala macam solusi yang rumit. Jika Anda hanya ingin menjalankan perintah cepat seperti ls, Anda tidak perlu async / await atau callback atau apa pun. Ini semua yang Anda butuhkan - 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);
Untuk penanganan kesalahan, tambahkan try/ catchblok di sekitar pernyataan.
Jika Anda menjalankan perintah yang membutuhkan waktu lama untuk menyelesaikannya, ya, lihat fungsi asynchronousexec .
Ini sepenuhnya bergantung pada lingkungan JavaScript. Tolong jelaskan.
Misalnya, di Windows Scripting, Anda melakukan hal-hal seperti:
var shell = WScript.CreateObject("WScript.Shell");
shell.Run("command here");
Pendeknya:
// 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");
Dengan NodeJS sesederhana itu! Dan jika Anda ingin menjalankan skrip ini di setiap boot server Anda, Anda dapat melihat aplikasi layanan selamanya !
var exec = require('child_process').exec;
exec('php main.php', function (error, stdOut, stdErr) {
// do what you want!
});
Catatan: Jawaban ini berasal dari klien berbasis browser ke server web berbasis Unix.
Jalankan perintah pada klien
Anda pada dasarnya tidak bisa. Keamanan mengatakan hanya berjalan di dalam browser dan aksesnya ke perintah dan sistem file dibatasi.
Jalankan ls di server
Anda dapat menggunakan panggilan AJAX untuk mengambil halaman dinamis yang meneruskan parameter Anda melalui GET.
Ketahuilah bahwa ini juga membuka risiko keamanan karena Anda harus melakukan sesuatu untuk memastikan bahwa mrs rouge hacker tidak membuat aplikasi Anda mengatakan run: / dev / null && rm -rf / ......
Singkatnya, menjalankan dari JS hanyalah ide yang buruk dan buruk .... YMMV
Posting lain tentang topik ini dengan solusi jQuery / Ajax / PHP yang bagus:
Berikut adalah perintah sederhana yang menjalankan ifconfigperintah shell Linux
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);
}
Fungsi ini dapat digunakan dengan mudah seperti:
exec('echo test');
//output:
//test
exec('echo test', function(err, stdout){console.log(stdout+stdout+stdout)});
//output:
//testtesttest
Dengan nashorn Anda dapat menulis skrip seperti ini:
$EXEC('find -type f');
var files = $OUT.split('\n');
files.forEach(...
...
dan jalankan:
jjs -scripting each_file.js
Jika Anda menggunakan npm, Anda dapat menggunakan paket shelljs
Untuk memasang: npm install [-g] shelljs
var shell = require('shelljs');
shell.ls('*.js').forEach(function (file) {
// do something
});
Lihat lebih lanjut: https://www.npmjs.com/package/shelljs