시스템 셸 명령 ( 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
