Как вы сказали, у REPL есть доступ к основным модулям .
(однако после проверки я могу переопределить их с помощью узла 0.10.20, поэтому должно быть решение)
> fs
> { Stats: [Function], …
> fs = 'hello';
> fs
'hello'
Лучшим способом было бы просто переопределить repl._builtinLibs
перед созданием экземпляра repl.
var repl = require('repl');
repl._builtinLibs = [];
repl.start('> ');
Кроме того, достаточно просто внести команды repl в белый список, если вы не хотите раскрывать такие команды, как .save
или .load
.
var allowedReplCmds = ['.break', '.clear', '.help'];
var newRepl = repl.start('> ');
for (var key in newRepl.commands)
if (!allowedReplCmds.contains(key))
delete replInstance.commands[key];
Примечание. Массивы обычно не имеют метода contains
, поэтому я добавил его.
Array.prototype.contains = function(v) {
for(var i = 0; i < this.length; i++) {
if(this[i] === v) return true;
}
return false;
};
Если вы хотите удалить переменные из глобальной области действия экземпляра repl, см. этот вопрос.
Обратите внимание, что очень небезопасно выставлять REPL на всеобщее обозрение.
Вы легко можете вывести из строя весь сервер
> setTimeout(function () { throw 'bye bye!'; }, 0);
Ошибки, возникающие в асинхронных обратных вызовах, не перехватываются REPL и приводят к остановке экземпляра node.js.
Вы можете заблокировать сервер
> while(true) {};
Лучше всего было бы закодировать свой собственный REPL в отдельном процессе с помощью child_process, readline и vm. Вот отправная точка:
Хозяин:
// master.js
var fork = require('child_process').fork;
// functions exposed to the repl
var replApi = {
hello: function () {
return 'world!';
},
unknown: function () {
return 'unknown';
}
};
function forkRepl() {
var repl = fork('./child_repl');
repl.on('message', function (command) {
var fun = replApi[command] || replApi.unknown;
repl.send(fun());
});
// restart the repl if it dies
repl.on('exit', forkRepl);
}
forkRepl();
и отдельный процесс для repl:
// child_repl.js
var readline = require('readline'),
vm = require('vm');
var context = vm.createContext({
hello: function () {
process.send('hello');
}
});
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', function (line) {
vm.runInContext(line, context, 'repl.vm');
});
process.on('message', function (message) {
console.log('master:', message);
});
rl.prompt();
person
Laurent Perrin
schedule
16.10.2013