जावास्क्रिप्ट में शेल कमांड कैसे निष्पादित करें


127

मैं एक जावास्क्रिप्ट फ़ंक्शन लिखना चाहता हूं जो सिस्टम शेल कमांड्स ( lsउदाहरण के लिए) को निष्पादित करेगा और मान लौटाएगा।

मुझे यह कैसे हासिल होगा?


4
आप क्लाइंट या सर्वर पर इस कमांड को कहां निष्पादित करना चाहेंगे?
Jan Hančič

आप कौनसा ऑपरेटिंग सिस्टम इस्तेमाल कर रहे हैं?
एंडरसन ग्रीन

एक शेल स्क्रिप्ट के लिए नोड.जेएस का उपयोग करने के तरीके के बारे में एक ट्यूटोरियल यहां दिया गया है: Dreamsyssoft.com/javascript-shell-scripting/shell-tutorial.php
रॉकी पुली

7
आपने सबसे अच्छे उत्तर के रूप में सबसे नापसंद जवाब क्यों चुना? o.0
एंड्रे लेवी

कृपया किस प्रकार की जावास्क्रिप्ट पर अधिक विशिष्ट होना चाहिए। यह सर्वर-साइड जावास्क्रिप्ट पर संभव है लेकिन क्लाइंट साइड जावास्क्रिप्ट पर असंभव है।
रेमंड पेंग

जवाबों:


132

अन्य कई उत्तर यहां ब्राउज़र में चल रहे जावास्क्रिप्ट फ़ंक्शन के परिप्रेक्ष्य से इस मुद्दे को संबोधित करते हैं। मैं गोली मारता हूं और यह मानकर जवाब देता हूं कि जब पूछने वाले ने "शेल स्क्रिप्ट" कहा था, तो उसका मतलब था कि एक 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();

उम्मीद है की यह मदद करेगा!


14
एक चीज़ के अलावा। आपको त्रुटि मिलेगी "बच्चा एक फ़ंक्शन नहीं है"। निष्पादित करने के लिए कॉल () कमांड निष्पादित करता है - बच्चे को कॉल करने की आवश्यकता नहीं है ()। दुर्भाग्य से, कॉलबैक तब नहीं कहा जाता है जब भी बच्चे की प्रक्रिया में आउटपुट के लिए कुछ होता है - इसे केवल तभी कहा जाता है जब बच्चा प्रक्रिया से बाहर निकलता है। कभी-कभी यह ठीक है और कभी-कभी यह नहीं है।
जॉन दीघन

2
कॉलबैक से बचने के लिए, आप निष्पादन-प्रणाली का उपयोग कर सकते हैं ।
Dan Dascalescu

1
ब्राउज़र की बात किसने की? यह केवल जावास्क्रिप्ट कहता है, अधिक कुछ नहीं।
वायरस 21२१

49

... कुछ साल बाद ...

ईएस 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

3
यदि आपको केवल एक त्वरित कमांड निष्पादित करने की आवश्यकता है, तो सभी async / प्रतीक्षा समाप्त हो जाती है। आप बस निष्कासन का उपयोग कर सकते हैं ।
Dan Dascalescu

किसी ने Node.js समाधान के लिए नहीं कहा। इसे केवल जावास्क्रिप्ट कहते हैं।
वायरस --२१

43

मुझे नहीं पता कि पिछले जवाबों ने सभी तरह के जटिल समाधान क्यों दिए। यदि आप बस एक त्वरित कमांड निष्पादित करना चाहते हैं 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 फ़ंक्शन को देखें।


19

यह पूरी तरह से जावास्क्रिप्ट वातावरण पर निर्भर करता है। कृपया विस्तार से बताएं।

उदाहरण के लिए, विंडोज स्क्रिप्टिंग में, आप निम्न कार्य करते हैं:

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

18
क्या लिनक्स जैसे यूनिक्स जैसे ऑपरेटिंग सिस्टम में एक ही काम करना संभव है?
एंडरसन ग्रीन

हम इस कमांड को कैसे चलाते हैं: रूट प्रिंट -4 | \ "टैप-विंडोज एडेप्टर \" ढूंढें ?? मैंने कोशिश की लेकिन कुछ भी नहीं लौटा
ikel

1
यही मैं ढूंढ रहा था। यह उन सभी लोगों को परेशान कर रहा है जो अपने Node.js. के बारे में बात कर रहे हैं। यहाँ Node.js के लिए किसने पूछा? किसी ने नहीं किया।
वायरस 10२१

क्या यह काम करेगा यदि जावास्क्रिप्ट एक ब्राउज़र के अंदर है?
अली सज्जाद

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
ऐसा लगता है कि इस वेब ब्राउज़र में कौन से वेब ब्राउज़र चल रहे हैं, लेकिन लोगों को यह एहसास होना चाहिए कि जावास्क्रिप्ट भी पूरी तरह से मान्य विंडोज शेल स्क्रिप्टिंग भाषा है।
क्रेग

6

NodeJS के साथ की तरह सरल है! और यदि आप अपने सर्वर के प्रत्येक बूट पर इस स्क्रिप्ट को चलाना चाहते हैं, तो आप हमेशा के लिए सेवा एप्लिकेशन पर एक नज़र डाल सकते हैं !

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

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

कॉलबैक से बचने के लिए, त्वरित आदेशों के लिए आप एग्जीक्यूट का उपयोग कर सकते हैं ।
डैन डस्केलस्क्यू

5

नोट: ये उत्तर एक ब्राउज़र आधारित क्लाइंट से यूनिक्स आधारित वेब सर्वर पर हैं।

क्लाइंट पर कमांड चलाएँ

आप अनिवार्य रूप से नहीं कर सकते। सुरक्षा का कहना है कि केवल एक ब्राउज़र के भीतर चलता है और कमांड और फाइल सिस्टम तक इसकी पहुंच सीमित है।

सर्वर पर चलाएँ ls

आप एक GET के माध्यम से अपने मापदंडों में गुजरने वाले गतिशील पृष्ठ को पुनः प्राप्त करने के लिए AJAX कॉल का उपयोग कर सकते हैं।

ध्यान रखें कि यह एक सुरक्षा जोखिम भी खोलता है क्योंकि आपको यह सुनिश्चित करने के लिए कुछ करना होगा कि mrs रूज हैकर को चलाने के लिए आपका आवेदन न मिले: / dev / null && rm -rf / ......

तो एक पागल में, जेएस से चल रहा है सिर्फ एक बुरा, बुरा विचार है .... YMMV


आप अनिवार्य रूप से क्रॉस-ब्राउज़र तरीके से नहीं कर सकते मेरा मानना ​​है कि केवल IE में शेल (WSrip / ActiveX के माध्यम से) हुक है।
जस्टिन जॉनसन


3

IE में, आप यह कर सकते हैं:

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

3

यहाँ सरल कमांड है जो ifconfigलिनक्स के शेल कमांड को निष्पादित करता है

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

कॉलबैक से बचने के लिए, आप निष्पादन-प्रणाली का उपयोग कर सकते हैं ।
6

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

नैशर्न के साथ आप इस तरह से एक स्क्रिप्ट लिख सकते हैं:

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

और इसे चलाएं:

jjs -scripting each_file.js

0

यदि आप npm का उपयोग कर रहे हैं तो आप शेलज पैकेज का उपयोग कर सकते हैं

स्थापित करने के लिए: npm install [-g] shelljs

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

और देखें: https://www.npmjs.com/package/shelljs

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.