2009-12-10 14 views
53

Chcę napisać funkcję javascript, która wykona komendy powłoki systemowej (na przykład ls) i zwróci wartość.Jak wykonać polecenie powłoki w JavaScript

Jak to osiągnąć?

+1

gdzie chcesz wykonać to polecenie na kliencie lub serwerze? –

+0

Z jakiego systemu operacyjnego korzystasz? –

+0

Oto samouczek, jak to zrobić przy użyciu pliku node.js dla skryptu powłoki: http://www.dreamsyssoft.com/javascript-shell-scripting/shell-tutorial.php –

Odpowiedz

-60

Co zrobić, jeśli klient, który uruchamiasz javascript, działa pod kontrolą systemu Windows? To znaczy, że to, co próbujesz osiągnąć, nie jest możliwe. JavaScript jest językiem skryptowym klienta i działa w środowisku piaskownicy często w przeglądarce internetowej, co uniemożliwia mu dostęp do zasobów na komputerze.

+20

pamiętaj, że otrzymujesz javascript po stronie serwera, więc nie jest " t tylko język klienta przeglądarki – AutomatedTester

+3

@automatedtester Prawda, ale najprawdopodobniej to, co pisze OP, jest skierowane do przeglądarki. –

+13

To zdecydowanie nie jest już poprawna odpowiedź i nie jestem nawet pewien, czy to było w grudniu '09 ... –

-1

w Javie, w zależności od przywilejów:

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

W JavaScript nie można. To naprawdę dwie zupełnie odrębne rzeczy.

EDIT

Moja odpowiedź została napisana, gdy pytanie miał tagów javaijavascript. Ponieważ wydaje się, że OP nie robi tego rozróżnienia, nie sądzę, żebym mógł powiedzieć na pewno, o co tutaj proszono.

13

To zależy całkowicie od środowiska JavaScript. Proszę opracuj.

Na przykład w Windows Scripting, robisz takie rzeczy jak:

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

Czy można zrobić to samo w uniksowym systemie operacyjnym, takim jak Linux? –

16

W skrócie:

// 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 jest dostępny tylko w przeglądarce IE.] (Http: // stackoverflow.com/questions/11101641/activexobject-is-not-defined-and-cant-find-variable-activexobject # answer-11101655) –

+0

Po prostu dla informacji http://www.phpied.com/javascript-shell-scripting/ – Eduplessis

+3

Wydaje się, że istnieje wiele łamania rąk, nad którym ta przeglądarka jest uruchomiona, ale ludzie powinni zdawać sobie sprawę, że JavaScript jest również doskonale poprawnym językiem skryptowym powłoki systemu Windows. – Craig

3

Uwaga: Te odpowiedzi są z klientem opartej przeglądarce aby Unix opartej na serwerze WWW .

polecenie Run na kliencie

You zasadniczo nie może. Bezpieczeństwo mówi tylko uruchamiać w przeglądarce, a dostęp do poleceń i systemu plików jest ograniczony. ls

uruchomić na serwerze

Można użyć wywołanie AJAX do pobierania dynamiczną stronę przekazując swoimi parametrami poprzez GET.

Należy pamiętać, że ten otwiera również zagrożenie dla bezpieczeństwa, jak trzeba coś zrobić, aby upewnić się, że pani rouge haker nie otrzyma aplikacja znaczy uruchomić:/dev/null & & rm -rf/.... ..

Więc w nutshel, począwszy od JS jest po prostu zły, zły pomysł .... YMMV

+0

Zasadniczo nie można * w trybie różnych przeglądarek. * Wierzę, że tylko IE ma haki do powłoki (przez WSript/ActiveX). –

71

Wiele innych odpowiedzi wydaje się rozwiązywać ten problem z perspektywy funkcji JavaScript działającej w przeglądarce. Zastrzelę i odpowiem, zakładając, że gdy pytający powiedział "Shell Script", miał na myśli skrypt JavaScript w Node.js.Ewentualnie użycie commander.js do użycia ramek kodu :)

Możesz użyć modułu child_proccess z interfejsu API węzła. Wkleiłem poniższy przykładowy kod.

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

Mam nadzieję, że to pomoże!

+0

Powiedziałeś to! –

+3

Z wyjątkiem jednej rzeczy. Dostaniesz błąd "dziecko nie jest funkcją". Wywołanie exec() wykonuje polecenie - nie ma potrzeby wywoływania child(). Niestety, wywołanie zwrotne nie jest wywoływane za każdym razem, gdy proces potomny ma coś do wyprowadzenia - jest wywoływany tylko wtedy, gdy proces potomny się kończy. Czasem jest OK, a czasem nie. – user1738579

+0

Dziękuję za tonę! Dokładnie to, czego potrzebowałem . –

3

W IE, można to zrobić:

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

... Kilka lat później ...

ES6 has been accepted as a standard i ES7 jest tuż za rogiem, więc zasługuje aktualizowane odpowiedzi. Użyjemy ES6 + asynchroniczny/poczekać z nodejs + babel jako przykład, warunki wstępne są:

Twój przykład foo.js plik może wyglądać następująco:

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

Upewnij się, że masz babel:

npm i babel-cli -g 

zainstalować najnowszą ustawienie:

npm i babel-preset-latest 

go uruchomić poprzez:

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

Oto proste polecenia, które wykonuje ifconfig polecenie powłoki systemu Linux

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

Z nashorn można pisać taki skrypt:

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

i uruchom go:

jjs -scripting each_file.js 
2

Z NodeJS jest prosta tak! A jeśli chcesz uruchomić ten skrypt przy każdym rozruchu serwera, możesz rzucić okiem na aplikację forever-service!

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

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