programing

node.js에서 shell 명령을 실행하여 출력을 가져옵니다.

i4 2023. 9. 13. 22:19
반응형

node.js에서 shell 명령을 실행하여 출력을 가져옵니다.

node.js에서 유닉스 terminal 명령어의 출력을 얻는 방법을 찾고 싶습니다.이것을 할 수 있는 방법이 없을까요?

function getCommandOutput(commandString){
    // now how can I implement this function?
    // getCommandOutput("ls") should print the terminal output of the shell command "ls"
}

이것은 제가 현재 진행 중인 프로젝트에서 사용하고 있는 방법입니다.

var exec = require('child_process').exec;
function execute(command, callback){
    exec(command, function(error, stdout, stderr){ callback(stdout); });
};

git 사용자를 검색하는 예:

module.exports.getGitUser = function(callback){
    execute("git config --global user.name", function(name){
        execute("git config --global user.email", function(email){
            callback({ name: name.replace("\n", ""), email: email.replace("\n", "") });
        });
    });
};

7.6 이후의 노드를 사용하고 있고 콜백 스타일이 마음에 들지 않으면 노드-유틸의 것을 사용할 수도 있습니다.promisify와 함께 일을 보다async / await셸 명령어를 얻어서 깨끗하게 읽습니다.다음은 이 기법을 사용하여 승인된 답변의 예입니다.

const { promisify } = require('util');
const exec = promisify(require('child_process').exec)

module.exports.getGitUser = async function getGitUser () {
  // Exec output contains both stderr and stdout outputs
  const nameOutput = await exec('git config --global user.name')
  const emailOutput = await exec('git config --global user.email')

  return { 
    name: nameOutput.stdout.trim(), 
    email: emailOutput.stdout.trim()
  }
};

이를 통해 실패한 명령에 대해 거부된 약속을 반환할 수 있는 추가적인 이점도 있습니다.try / catch비동기 코드 안에 있습니다.

child_process를 찾고 있습니다.

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

child = exec(command,
   function (error, stdout, stderr) {
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
      if (error !== null) {
          console.log('exec error: ' + error);
      }
   });

Renato가 지적한 바와 같이, 동기화 실행 패키지도 있습니다. 더 많은 것을 찾을 수 있는 동기화 실행을 참조하십시오.단, node.js는 단일 스레드 고성능 네트워크 서버로 설계되어 있으므로, 만약 그것을 사용하고자 한다면, 시작하는 동안에만 사용하지 않는 한 동기화 실행과 같은 것을 멀리해야 합니다.

요구 사항들

이렇게 하려면 Promise 및 Async/Wait을 지원하는 Node.js 7 이상이 필요합니다.

해결책

의 동작을 제어하기 위한 약속을 활용하는 래퍼 함수를 만듭니다.child_process.exec지휘.

설명.

약속과 비동기 기능을 사용하면 셸이 콜백 지옥에 빠지지 않고 꽤 깔끔한 API로 출력을 반환하는 동작을 모방할 수 있습니다.사용.await키워드를 사용하면 쉽게 읽을 수 있는 스크립트를 만들 수 있지만 작업을 얻을 수 있습니다.child_process.exec다 했어요.

코드샘플

const childProcess = require("child_process");

/**
 * @param {string} command A shell command to execute
 * @return {Promise<string>} A promise that resolve to the output of the shell command, or an error
 * @example const output = await execute("ls -alh");
 */
function execute(command) {
  /**
   * @param {Function} resolve A function that resolves the promise
   * @param {Function} reject A function that fails the promise
   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
   */
  return new Promise(function(resolve, reject) {
    /**
     * @param {Error} error An error triggered during the execution of the childProcess.exec command
     * @param {string|Buffer} standardOutput The result of the shell command execution
     * @param {string|Buffer} standardError The error resulting of the shell command execution
     * @see https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
     */
    childProcess.exec(command, function(error, standardOutput, standardError) {
      if (error) {
        reject();

        return;
      }

      if (standardError) {
        reject(standardError);

        return;
      }

      resolve(standardOutput);
    });
  });
}

사용.

async function main() {
  try {
    const passwdContent = await execute("cat /etc/passwd");

    console.log(passwdContent);
  } catch (error) {
    console.error(error.toString());
  }

  try {
    const shadowContent = await execute("cat /etc/shadow");

    console.log(shadowContent);
  } catch (error) {
    console.error(error.toString());
  }
}

main();

샘플 출력

root:x:0:0::/root:/bin/bash
[output trimmed, bottom line it succeeded]

Error: Command failed: cat /etc/shadow
cat: /etc/shadow: Permission denied

온라인으로 해보세요.

Repl.it .

외부자원

약속.

child_process.exec.

Node.js 지원 테이블.

Renato의 답변 덕분에 저는 정말 기본적인 예를 하나 만들었습니다.

const exec = require('child_process').exec

exec('git config --global user.name', (err, stdout, stderr) => console.log(stdout))

그냥 글로벌 git 사용자 이름을 인쇄해 드립니다 :)

nodejs와 함께 제공되는 util 라이브러리를 사용하여 exec 명령에서 약속을 얻고 필요에 따라 해당 출력을 사용할 수 있습니다.파괴를 사용하여 stdout 및 stderrin 변수를 저장합니다.

const util = require('util');
const exec = util.promisify(require('child_process').exec);

async function lsExample() {
  const {
    stdout,
    stderr
  } = await exec('ls');
  console.log('stdout:', stdout);
  console.error('stderr:', stderr);
}
lsExample();

사용가능ShellJS꾸러미의
셸JS는 Node.js API 위에 유닉스 셸 명령을 휴대용으로 구현한 것입니다.
참조: https://www.npmjs.com/package/shelljs#execcommand--options--callback

import * as shell from "shelljs";

//usage:
//exec(command [, options] [, callback])

//example:
const version = shell.exec("node --version", {async: false}).stdout;
console.log("nodejs version", version);

승인된 답변에 대한 비동기 타입스크립트 구현은 다음과 같습니다.

const execute = async (command: string): Promise<any> => {
  return new Promise((resolve, reject) => {
    const exec = require("child_process").exec;
    exec(
      command,
      function (
        error: Error,
        stdout: string | Buffer,
        stderr: string | Buffer
      ) {
        if (error) {
          reject(error);
          return;
        }
        if (stderr) {
          reject(stderr);
          return;
        } else {
          resolve(stdout);
        }
      }
    );
  });
};

언급URL : https://stackoverflow.com/questions/12941083/execute-and-get-the-output-of-a-shell-command-in-node-js

반응형