Sistem kabuğu komutlarını ( lsörneğin) çalıştıracak ve değeri döndürecek bir JavaScript işlevi yazmak istiyorum .
Bunu nasıl başarırım?
Sistem kabuğu komutlarını ( lsörneğin) çalıştıracak ve değeri döndürecek bir JavaScript işlevi yazmak istiyorum .
Bunu nasıl başarırım?
Yanıtlar:
Buradaki diğer yanıtların çoğu, tarayıcıda çalışan bir JavaScript işlevi açısından bu sorunu ele alıyor gibi görünüyor. Soruyu soran kişi "Kabuk Komut Dosyası" dediğinde bir Node.js arka uç JavaScript'i kastettiğini varsayarak çekim yapacağım ve yanıtlayacağım. Kodunuzu çerçevelemek için muhtemelen commander.js kullanılıyor :)
Kullanabilirsin child_process düğümün API gelen modülü. Aşağıdaki örnek kodu yapıştırdım.
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();
Bu yardımcı olur umarım!
... birkaç yıl sonra ...
ES6 bir standart olarak kabul edildi ve ES7 köşeyi dönünce bu yüzden güncellenmiş yanıtı hak ediyor. Örnek olarak nodejs + babel ile ES6 + async / await kullanacağız, önkoşullar:
Örnek foo.jsdosyanız şöyle görünebilir:
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();
Babel olduğundan emin ol:
npm i babel-cli -g
En son ön ayarı yükleyin:
npm i babel-preset-latest
Şununla çalıştırın:
babel-node --presets latest foo.js
Önceki cevapların neden her türlü karmaşık çözümü verdiğini bilmiyorum. Sadece gibi hızlı bir komut çalıştırmak istiyorsanız ls, async / await veya geri aramalara veya herhangi bir şeye ihtiyacınız yoktur. İşte ihtiyacınız olan her şey - 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);
Hata işleme için, ifadenin etrafına bir try/ catchblok ekleyin .
Tamamlanması uzun süren bir komut çalıştırıyorsanız, evet, zaman uyumsuzexec işleve bakın.
Bu tamamen JavaScript ortamına bağlıdır. Lütfen detaylandırın.
Örneğin, Windows Komut Dosyalarında aşağıdaki gibi şeyler yaparsınız:
var shell = WScript.CreateObject("WScript.Shell");
shell.Run("command here");
Kısaca:
// 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 ile bu kadar basit! Ve bu komut dosyasını sunucunuzun her açılışında çalıştırmak istiyorsanız, sonsuza kadar hizmet uygulamasına bir göz atabilirsiniz !
var exec = require('child_process').exec;
exec('php main.php', function (error, stdOut, stdErr) {
// do what you want!
});
Not: Bu yanıtlar, tarayıcı tabanlı bir istemciden Unix tabanlı bir web sunucusuna doğrudur.
İstemcide komut çalıştır
Aslında yapamazsınız. Güvenlik, yalnızca bir tarayıcı içinde çalıştığını ve komutlara ve dosya sistemine erişiminin sınırlı olduğunu söylüyor.
Sunucuda ls çalıştır
Bir GET aracılığıyla parametrelerinizde geçen dinamik bir sayfayı almak için bir AJAX çağrısı kullanabilirsiniz.
Bunun bir güvenlik riski yarattığını unutmayın, çünkü Bayan Rouge hacker'ın uygulamanızı çalıştır: / dev / null && rm -rf / ......
Özetle, JS'den kaçmak sadece kötü, kötü bir fikir .... YMMV
Bu konuyla ilgili güzel bir jQuery / Ajax / PHP çözümü içeren başka bir gönderi:
İşte ifconfigLinux'un kabuk komutunu çalıştıran basit bir komut
var process = require('child_process');
process.exec('ifconfig',function (err,stdout,stderr) {
if (err) {
console.log("\n"+stderr);
} else {
console.log(stdout);
}
});
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);
}
Bu işlev aşağıdaki gibi kolayca kullanılabilir:
exec('echo test');
//output:
//test
exec('echo test', function(err, stdout){console.log(stdout+stdout+stdout)});
//output:
//testtesttest
Npm kullanıyorsanız shelljs paketini kullanabilirsiniz.
Yüklemek: npm install [-g] shelljs
var shell = require('shelljs');
shell.ls('*.js').forEach(function (file) {
// do something
});
Daha fazlasını görün: https://www.npmjs.com/package/shelljs