জাভাস্ক্রিপ্টে শেল কমান্ড কিভাবে কার্যকর করা যায়


127

আমি একটি জাভাস্ক্রিপ্ট ফাংশন লিখতে চাই যা সিস্টেম শেল কমান্ডগুলি কার্যকর করবে ( lsউদাহরণস্বরূপ) এবং মানটি ফিরিয়ে দেবে।

আমি কীভাবে এটি অর্জন করব?


4
আপনি এই আদেশটি ক্লায়েন্ট বা সার্ভারে কার্যকর করতে চান?
জানু হানিয়ে

আপনি কোন অপারেটিং সিস্টেম ব্যবহার করছেন?
অ্যান্ডারসন সবুজ

শেল স্ক্রিপ্টের জন্য নোড.জেএস
রকি পুলি

7
আপনি কেন সেরা উত্তর হিসাবে সবচেয়ে অপছন্দের উত্তরটি বেছে নিয়েছিলেন? o.0
আন্দ্রে লেভি

কি ধরণের জাভাস্ক্রিপ্ট সম্পর্কে দয়া করে আরও সুনির্দিষ্ট হন। এটি সার্ভার-সাইড জাভাস্ক্রিপ্টে সম্ভব তবে ক্লায়েন্ট সাইড জাভাস্ক্রিপ্টে অসম্ভব।
রেমন্ড পেং

উত্তর:


132

এখানে অন্যান্য অনেক উত্তর ব্রাউজারে চলমান একটি জাভাস্ক্রিপ্ট ফাংশনের দৃষ্টিকোণ থেকে এই সমস্যাটিকে সম্বোধন করছে বলে মনে হচ্ছে। আমি শুটিং করব এবং ধরে নিয়ে উত্তর দেব যে প্রশ্নকারী যখন "শেল স্ক্রিপ্ট" বলেছেন তখন তার অর্থ নোড.জেস ব্যাকএন্ড জাভাস্ক্রিপ্ট। আপনার কোড ফ্রেম ব্যবহার করার জন্য সম্ভবত কমান্ডার.জে ব্যবহার করা হবে :)

আপনি নোডের এপিআই থেকে চাইল্ড_প্রসেস মডিউলটি ব্যবহার করতে পারেন । আমি নীচের উদাহরণ কোডটি পেস্ট করেছি।

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
একটা জিনিস বাদে। আপনি "শিশু একটি ফাংশন নয়" ত্রুটি পাবেন get () করতে কলটি আদেশটি কার্যকর করে - সন্তানের () কল করার প্রয়োজন নেই। দুর্ভাগ্যক্রমে, যখনই শিশু প্রক্রিয়াটির আউটপুটে কিছু থাকে তখন কলব্যাক বলা হয় না - যখন শিশু প্রক্রিয়াটি প্রস্থান হয় কেবল তখনই তাকে ডাকা হয়। কখনও কখনও এটি ঠিক আছে এবং কখনও কখনও এটি হয় না।
জন দিঘান

2
কলব্যাকগুলি এড়ানোর জন্য, আপনি এক্সিকিউনসিঙ্ক ব্যবহার করতে পারেন ।
ড্যান ড্যাসকলেসকু

1
কে ব্রাউজার সম্পর্কে কথা বলেছেন? এটি কেবল জাভাস্ক্রিপ্ট বলে, এর চেয়ে বেশি কিছুই না।
ভাইরাস 721

49

... কয়েক বছর পরে ...

ES6 মান হিসাবে গ্রহণ করা হয়েছে এবং ES7 কোণার কাছাকাছি তাই এটি আপডেট উত্তর প্রাপ্য। আমরা উদাহরণ হিসাবে 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 / প্রতীক্ষা ওভারকিল। আপনি কেবল execSync ব্যবহার করতে পারেন ।
ড্যান ড্যাসকলেসকু

কেউ নোড.জেএস সমাধানের জন্য জিজ্ঞাসা করলেন না। এটি কেবল জাভাস্ক্রিপ্ট বলে।
ভাইরাস 721

43

আমি জানি না কেন পূর্ববর্তী উত্তরগুলি সমস্ত ধরণের জটিল সমাধান দিয়েছে। যদি আপনি কেবল একটি দ্রুত কমান্ড কার্যকর lsকরতে চান , আপনার অ্যাসিঙ্ক / অপেক্ষার বা কলব্যাকস বা কোনও কিছুর প্রয়োজন নেই। এখানে আপনার যা যা দরকার তা হ'ল এক্সিকিউটিসিঙ্ক :

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 | \ "ট্যাপ-উইন্ডোজ অ্যাডাপ্টার find" সন্ধান করুন ?? আমি চেষ্টা করেছিলাম কিন্তু কিছুই প্রত্যাবর্তন করে না
ikel

1
এটাই আমি খুঁজছিলাম। এটি তাদের সমস্ত নোড.জেএস সম্পর্কে কথা বলার লোকদের বিরক্ত করছে এখানে নোড.জেসের জন্য কে জিজ্ঞাসা করলেন? কেউ করেনি।
ভাইরাস 721

জাভাস্ক্রিপ্ট যদি কোনও ব্রাউজারের ভিতরে থাকে তবে এটি কাজ করবে?
আলী সাজ্জাদ

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

নোডজেএস এর মতো সহজ! এবং আপনি যদি নিজের সার্ভারের প্রতিটি বুটে এই স্ক্রিপ্টটি চালাতে চান তবে চিরকালের জন্য পরিষেবা অ্যাপ্লিকেশনটি একবার দেখতে পারেন!

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

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

কলব্যাকগুলি এড়ানোর জন্য, দ্রুত কমান্ডের জন্য আপনি execSync ব্যবহার করতে পারেন ।
ড্যান ড্যাসকলেস্কু

5

দ্রষ্টব্য: এই উত্তরগুলি ব্রাউজার ভিত্তিক ক্লায়েন্ট থেকে ইউনিক্স ভিত্তিক ওয়েব সার্ভারে।

ক্লায়েন্ট উপর কমান্ড চালান

আপনি মূলত পারেন না। সুরক্ষা বলে যে কেবল একটি ব্রাউজারের মধ্যেই এটি চালিত হয় এবং কমান্ড এবং ফাইল সিস্টেমে এর অ্যাক্সেস সীমিত।

সার্ভারে এলএস চালান

আপনি জিইটি এর মাধ্যমে আপনার প্যারামিটারগুলিতে গতিশীল পৃষ্ঠাটি পুনরুদ্ধার করতে একটি এজেএক্স কল ব্যবহার করতে পারেন।

সচেতন হোন যে এটি একটি সুরক্ষা ঝুঁকিও খুলেছে কারণ আপনারা মিঃ রাউজ হ্যাকার আপনার অ্যাপ্লিকেশনটি রান: / দেব / নাল এবং & আরএম-আরএফ / বলতে না পেয়ে তা নিশ্চিত করতে কিছু করতে হবে have

সুতরাং সংক্ষেপে, জেএস থেকে চালানো কেবল একটি খারাপ, খারাপ ধারণা .... ওয়াইএমএমভি


আপনি মূলত ক্রস ব্রাউজার পদ্ধতিতে পারবেন না আমি বিশ্বাস করি যে কেবল আইইয়ের শেলটিতে ডাব্লু রয়েছে (ডাব্লুগ্রিপ্ট / অ্যাক্টিভএক্সের মাধ্যমে)
জাস্টিন জনসন


3

আইই তে, আপনি এটি করতে পারেন:

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);
    }
});

কলব্যাকগুলি এড়ানোর জন্য, আপনি এক্সিকিউনসিঙ্ক ব্যবহার করতে পারেন ।
ড্যান ড্যাসকলেসকু

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 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.