2009-12-10 48 views
53

Tôi muốn viết một hàm javascript sẽ thực hiện các lệnh hệ vỏ (ví dụ: ls) và trả về giá trị.Làm thế nào để thực hiện lệnh shell trong Javascript

Làm cách nào để đạt được điều này?

+1

nơi bạn muốn thực thi lệnh này, trên máy khách hoặc trên máy chủ? –

+0

Bạn đang sử dụng hệ điều hành nào? –

+0

Dưới đây là hướng dẫn về cách thực hiện việc này bằng cách sử dụng node.js cho tập lệnh shell: http://www.dreamsyssoft.com/javascript-shell-scripting/shell-tutorial.php –

Trả lời

-60

Điều gì sẽ xảy ra nếu khách hàng bạn đang thực hiện javascript này đang chạy Windows? Điều này là để nói rằng những gì bạn đang cố gắng đạt được là không thể. Javascript là một ngôn ngữ kịch bản ứng dụng khách và chạy trong môi trường sandbox thường nằm trong một trình duyệt web để ngăn chặn nó truy cập tài nguyên trên máy tính.

+20

hãy nhớ bạn không nhận được javascript phía máy chủ, vì vậy isn ' t chỉ là một ngôn ngữ máy khách trình duyệt – AutomatedTester

+3

@automatedtester Đúng, nhưng rất có thể là bất cứ điều gì OP đang viết được nhắm mục tiêu vào trình duyệt. –

+13

Điều này chắc chắn không còn là câu trả lời hợp lệ nữa và tôi thậm chí không chắc nó đã vào tháng 12 '09 ... –

-1

Trong java, tùy thuộc vào đặc quyền:

Runtime run = Runtime.getRuntime(); 
Process pr = run.exec("ls"); 

pr.waitFor(); 
BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream())); 

String line = ""; 
while ((line=buf.readLine())!=null) { 
    System.out.println(line); 
} 

Trong JavaScript bạn không thể. Họ thực sự là hai điều khá riêng biệt.

EDIT

phản ứng của tôi được viết khi câu hỏi có các thẻ javajavascript. Vì OP dường như không tạo nên sự khác biệt, tôi không nghĩ rằng tôi có thể nói chắc chắn điều gì đang được yêu cầu ở đây.

13

Điều này phụ thuộc hoàn toàn vào môi trường JavaScript. Xin hãy giải thích.

Ví dụ, trong Windows Scripting, bạn làm những việc như:

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

Có thể làm điều tương tự trong hệ điều hành giống Unix như Linux không? –

16

Tóm lại:

// 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"); 
+3

[ActiveXObject chỉ khả dụng trên trình duyệt IE.] (Http: // stackoverflow.com/questions/11101641/activexobject-is-not-defined-và-cant-find-variable-activexobject # answer-11101655) –

+0

Chỉ để biết thông tin http://www.phpied.com/javascript-shell-scripting/ – Eduplessis

+3

Dường như có rất nhiều vắt tay mà trình duyệt web đang chạy, nhưng mọi người nên nhận ra rằng JavaScript cũng là một ngôn ngữ kịch bản lệnh shell Windows hoàn toàn hợp lệ. – Craig

3

Lưu ý: Những câu trả lời là từ một trình duyệt client dựa vào một máy chủ web dựa trên Unix .

Chạy lệnh trên máy khách

Bạn về cơ bản không thể. Bảo mật cho biết chỉ chạy trong trình duyệt và quyền truy cập vào các lệnh và hệ thống tệp bị giới hạn.

Run ls trên máy chủ

Bạn có thể sử dụng một cuộc gọi AJAX để lấy một qua trang năng động trong các thông số của bạn thông qua một GET.

Hãy lưu ý rằng điều này cũng mở ra một nguy cơ bảo mật vì bạn sẽ phải làm điều gì đó để đảm bảo rằng mrs rouge hacker không nhận được ứng dụng của bạn để nói chạy:/dev/null & & rm -rf/.... ..

Vì vậy, trong một nutshel, chạy từ JS chỉ là một xấu, ý tưởng tồi .... YMMV

+0

Về cơ bản, bạn không thể * theo cách trình duyệt chéo. * Tôi tin rằng chỉ có IE có móc vào vỏ (thông qua WSript/ActiveX). –

71

Nhiều câu trả lời khác ở đây dường như giải quyết vấn đề này từ quan điểm của một hàm JavaScript đang chạy trong trình duyệt. Tôi sẽ quay và trả lời giả định rằng khi người hỏi nói "Shell Script", anh ta ngụ ý một JavaScript phụ trợ Node.js.Có thể sử dụng commander.js để sử dụng mã khung của bạn :)

Bạn có thể sử dụng mô-đun child_proccess từ API của nút. Tôi đã dán mã ví dụ bên dưới.

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

Hy vọng điều này sẽ hữu ích!

+0

bạn đã nói điều đó! –

+3

Ngoại trừ một điều. Bạn sẽ nhận được lỗi "con không phải là một hàm". Lệnh gọi hàm exec() thực thi lệnh - không cần gọi child(). Thật không may, gọi lại không được gọi bất cứ khi nào tiến trình con có cái gì đó để xuất - nó được gọi chỉ khi tiến trình con thoát ra. Đôi khi điều đó ổn và đôi khi không. – user1738579

+0

Cảm ơn một tấn! Đúng thứ tôi cần . –

3

Trong IE, bạn có thể làm điều này:

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

... vài năm sau ...

ES6 has been accepted as a standard và ES7 là xung quanh góc để nó xứng đáng được cập nhật câu trả lời. Chúng tôi sẽ sử dụng ES6 + async/chờ đợi với nodejs + babel làm ví dụ, điều kiện tiên quyết là:

dụ bạn foo.js tập tin có thể trông giống như:

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

Đảm bảo bạn có babel:

npm i babel-cli -g 

Cài đặt sẵn mới nhất:

npm i babel-preset-latest 

Run nó thông qua:

babel-node --presets latest foo.js 
-1

Đây là lệnh đơn giản mà thực hiện ifconfig lệnh shell của Linux

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

Với nashorn bạn có thể viết một tập lệnh như sau:

$EXEC('find -type f'); 
var files = $OUT.split('\n'); 
files.forEach(... 
... 

và chạy nó:

jjs -scripting each_file.js 
2

Với NodeJS là đơn giản như vậy! Và nếu bạn muốn chạy tập lệnh này ở mỗi lần khởi động máy chủ, bạn có thể xem ứng dụng forever-service!

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

exec('php main.php', function (error, stdOut, stdErr) { 
    // do what you want! 
}); 
Các vấn đề liên quan