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


127

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

어떻게해야합니까?


4
클라이언트 또는 서버에서이 명령을 어디에서 실행 하시겠습니까?
Jan Hančič 2009

어떤 운영 체제를 사용하고 있습니까?
Anderson Green

여기 쉘 스크립트 Node.js를를 사용하는 방법에 대한 자습서는 다음과 같습니다 dreamsyssoft.com/javascript-shell-scripting/shell-tutorial.php
록키 풀리

7
가장 싫어하는 답변을 베스트 답변으로 선택한 이유는 무엇입니까? o.0
André Levy

어떤 유형의 자바 스크립트에 대해 자세히 설명해주세요. 이것은 서버 측 자바 스크립트에서는 가능하지만 클라이언트 측 자바 스크립트에서는 불가능합니다.
Raymond Peng

답변:


132

여기에있는 다른 많은 답변은 브라우저에서 실행되는 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();

도움이 되었기를 바랍니다!


14
한 가지만 빼고. "하위가 함수가 아닙니다"라는 오류 메시지가 표시됩니다. exec ()에 대한 호출은 명령을 실행합니다. child ()를 호출 할 필요가 없습니다. 불행히도 콜백은 자식 프로세스에 출력 할 내용이있을 때마다 호출되지 않습니다. 자식 프로세스가 종료 될 때만 호출됩니다. 때로는 괜찮고 때로는 그렇지 않습니다.
John Deighan 2016-04-26

2
콜백을 피하기 위해 execSync 를 사용할 수 있습니다 .
Dan Dascalescu

1
누가 브라우저에 대해 이야기 했습니까? 그것은 단지 JavaScript라고 말하고 있습니다.
Virus721

49

... 몇 년 후 ...

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

3
빠른 명령 만 실행해야하는 경우 모든 async / await가 과도합니다. execSync를 사용할 수 있습니다 .
Dan Dascalescu

아무도 Node.js 솔루션을 요구하지 않았습니다. JavaScript 라고만되어 있습니다.
Virus721

43

이전 답변이 모든 종류의 복잡한 솔루션을 제공 한 이유를 모르겠습니다. 와 같은 빠른 명령을 실행 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 함수를 살펴보십시오 .


19

이것은 전적으로 JavaScript 환경에 달려 있습니다. 자세히 설명 해주세요.

예를 들어 Windows 스크립팅에서 다음과 같은 작업을 수행합니다.

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

18
Linux와 같은 Unix와 유사한 운영 체제에서 동일한 작업을 수행 할 수 있습니까?
Anderson Green

이 명령을 실행하는 방법 : route print -4 | \ "TAP-Windows 어댑터 \"찾기 ?? 나는 시도했지만 아무것도 반환하지 않습니다
ikel

1
그게 제가 찾던 것입니다. Node.js에 대해 말하는 모든 사람들을 짜증나게합니다. 누가 여기서 Node.js를 요청 했습니까? 아무도하지 않았습니다.
Virus721

JavaScript가 브라우저 내에 있으면 작동합니까?
Ali Sajjad

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
이것이 실행되는 웹 브라우저에 대해 많은 수작업이있는 것 같지만, 사람들은 JavaScript가 또한 완벽하게 유효한 Windows 쉘 스크립팅 언어라는 것을 인식해야합니다.
Craig

6

NodeJS를 사용하면 그렇게 간단합니다! 그리고 서버를 부팅 할 때마다이 스크립트를 실행하려면 forever-service 애플리케이션을 !

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

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

콜백을 피하기 위해 빠른 명령을 위해 execSync 를 사용할 수 있습니다 .
Dan Dascalescu

5

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

클라이언트에서 명령 실행

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

서버에서 ls 실행

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

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

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


기본적 으로 브라우저 간 방식으로는 할 수 없습니다 . IE만이 WSript / ActiveX를 통해 쉘에 후크를 가지고 있다고 생각합니다.
Justin Johnson


3

IE에서는 다음과 같이 할 수 있습니다.

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

3

다음은 ifconfigLinux의 쉘 명령 을 실행하는 간단한 명령입니다.

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

콜백을 피하기 위해 execSync 를 사용할 수 있습니다 .
Dan Dascalescu

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을 사용하는 경우 shelljs 패키지를 사용할 수 있습니다.

설치하기 위해서: 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.