[javascript] 자바 스크립트에서 쉘 명령을 실행하는 방법

시스템 셸 명령 ( ls예 :)을 실행 하고 값을 반환 하는 JavaScript 함수를 작성하고 싶습니다 .

어떻게해야합니까?



답변

여기에있는 다른 많은 답변은 브라우저에서 실행되는 JavaScript 함수의 관점에서이 문제를 해결하는 것 같습니다. 나는 질문자가 “Shell Script”라고 말했을 때 그가 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하려면 async / await 또는 콜백 등이 필요하지 않습니다. 여기에 필요한 모든 것이 있습니다 -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를 사용하면 그렇게 간단합니다! 그리고 서버를 부팅 할 때마다이 스크립트를 실행하려면 forever-service 애플리케이션을 !

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

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


답변

참고 :이 답변은 브라우저 기반 클라이언트에서 Unix 기반 웹 서버까지입니다.

클라이언트에서 명령 실행

당신은 본질적으로 할 수 없습니다. 보안은 브라우저 내에서만 실행되며 명령 및 파일 시스템에 대한 액세스가 제한되어 있습니다.

서버에서 ls 실행

AJAX 호출을 사용하여 GET을 통해 매개 변수를 전달하는 동적 페이지를 검색 할 수 있습니다.

루즈 해커 부인이 응용 프로그램이 다음을 실행하지 않도록하기 위해 무언가를해야하므로 보안 위험이 발생할 수도 있습니다. / dev / null && rm -rf / ……

그래서 말도 안되는 상황에서 JS에서 실행하는 것은 나쁜 생각입니다 …. YMMV