मैं एक जावास्क्रिप्ट फ़ंक्शन लिखना चाहता हूं जो सिस्टम शेल कमांड्स ( lsउदाहरण के लिए) को निष्पादित करेगा और मान लौटाएगा।
मुझे यह कैसे हासिल होगा?
मैं एक जावास्क्रिप्ट फ़ंक्शन लिखना चाहता हूं जो सिस्टम शेल कमांड्स ( lsउदाहरण के लिए) को निष्पादित करेगा और मान लौटाएगा।
मुझे यह कैसे हासिल होगा?
जवाबों:
अन्य कई उत्तर यहां ब्राउज़र में चल रहे जावास्क्रिप्ट फ़ंक्शन के परिप्रेक्ष्य से इस मुद्दे को संबोधित करते हैं। मैं गोली मारता हूं और यह मानकर जवाब देता हूं कि जब पूछने वाले ने "शेल स्क्रिप्ट" कहा था, तो उसका मतलब था कि एक Node.js जावास्क्रिप्ट का समर्थन करता है। संभवतः का उपयोग कर commander.js अपने कोड फ्रेम का उपयोग करने के :)
आप नोड के एपीआई से 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();
उम्मीद है की यह मदद करेगा!
... कुछ साल बाद ...
ईएस 6 को एक मानक के रूप में स्वीकार किया गया है और ईएस 7 कोने के आसपास है इसलिए यह अद्यतन जवाब के योग्य है। हम एक उदाहरण के रूप में नोड्स + बेबेल के साथ ES6 + async / प्रतीक्षा का उपयोग करेंगे, पूर्वापेक्षाएँ हैं:
आपकी उदाहरण 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, तो आपको async / प्रतीक्षा या कॉलबैक या कुछ भी करने की आवश्यकता नहीं है। यहाँ आप सभी की जरूरत है - निष्पादन :
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 फ़ंक्शन को देखें।
यह पूरी तरह से जावास्क्रिप्ट वातावरण पर निर्भर करता है। कृपया विस्तार से बताएं।
उदाहरण के लिए, विंडोज स्क्रिप्टिंग में, आप निम्न कार्य करते हैं:
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!
});
नोट: ये उत्तर एक ब्राउज़र आधारित क्लाइंट से यूनिक्स आधारित वेब सर्वर पर हैं।
क्लाइंट पर कमांड चलाएँ
आप अनिवार्य रूप से नहीं कर सकते। सुरक्षा का कहना है कि केवल एक ब्राउज़र के भीतर चलता है और कमांड और फाइल सिस्टम तक इसकी पहुंच सीमित है।
सर्वर पर चलाएँ ls
आप एक GET के माध्यम से अपने मापदंडों में गुजरने वाले गतिशील पृष्ठ को पुनः प्राप्त करने के लिए AJAX कॉल का उपयोग कर सकते हैं।
ध्यान रखें कि यह एक सुरक्षा जोखिम भी खोलता है क्योंकि आपको यह सुनिश्चित करने के लिए कुछ करना होगा कि mrs रूज हैकर को चलाने के लिए आपका आवेदन न मिले: / dev / null && rm -rf / ......
तो एक पागल में, जेएस से चल रहा है सिर्फ एक बुरा, बुरा विचार है .... YMMV
एक अच्छा jQuery / Ajax / PHP समाधान के साथ इस विषय पर एक और पोस्ट:
यहाँ सरल कमांड है जो ifconfigलिनक्स के शेल कमांड को निष्पादित करता है
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
नैशर्न के साथ आप इस तरह से एक स्क्रिप्ट लिख सकते हैं:
$EXEC('find -type f');
var files = $OUT.split('\n');
files.forEach(...
...
और इसे चलाएं:
jjs -scripting each_file.js
यदि आप npm का उपयोग कर रहे हैं तो आप शेलज पैकेज का उपयोग कर सकते हैं
स्थापित करने के लिए: npm install [-g] shelljs
var shell = require('shelljs');
shell.ls('*.js').forEach(function (file) {
// do something
});
और देखें: https://www.npmjs.com/package/shelljs