Frage

NodeJS , die einzige Möglichkeit, externe Befehle auszuführen ist über sys.exec (cmd). Ich möchte einen externen Befehl aufrufen und Daten über stdin geben. In NodeJS hat es noch keinen Befehl zu öffnen und drücken Sie dann Daten scheint es eine Art und Weise zu sein (nur exec und erhält ihren Standard + Fehlerausgänge), so dass es den einzigen Weg, erscheint die ich habe dies jetzt zu tun ist, über einen einzelnen String-Befehl wie:

var dangerStr = "bad stuff here";
sys.exec("echo '" + dangerStr + "' | somecommand");

Die meisten Antworten auf Fragen wie diese haben auf beiden regex konzentriert, die Arbeit für mich nicht in NodeJS (was nutzt Googles V8 Javascript-Engine) oder native Funktionen aus anderen Sprachen wie Python.

Ich mag dangerStr zu entkommen, so dass es sicher ist, über eine exec Zeichenfolge wie das zu komponieren. Wenn es hilft, wird dangerStr JSON-Daten enthalten.

War es hilfreich?

Lösung

Es gibt einen Weg, um einen externen Befehl zu schreiben: process.createChildProcess ( Dokumentation ) liefert eine Objekt mit einer write Methode. createChildProcess ist nicht so bequem aber, weil es nicht stdout und stderr puffert, so dass Sie Event-Handler benötigt, die Ausgabe in Stücke zu lesen.

var stdout = "", stderr = "";
var child = process.createChildProcess("someCommand");

child.addListener("output", function (data) {
    if (data !== null) {
        stdout += data;
    }
});
child.addListener("error", function (data) {
    if (data !== null) {
        stderr += data;
    }
});
child.addListener("exit", function (code) {
    if (code === 0) {
        sys.puts(stdout);
    }
    else {
        // error
    }
});

child.write("This goes to someCommand's stdin.");

Andere Tipps

Dies ist, was ich benutze:

var escapeShell = function(cmd) {
  return '"'+cmd.replace(/(["\s'$`\\])/g,'\\$1')+'"';
};

Wenn Sie einfache Lösung benötigen, können Sie diese verwenden:

function escapeShellArg (arg) {
    return `'${arg.replace(/'/g, `'\\''`)}'`;
}

So Ihre Zeichenkette wird einfach mit einfachen Anführungszeichen entgangen sein, wie Chris Johnsen erwähnt.

echo 'John'\''s phone';

Es funktioniert in bash wegen stark zitiert , fühlt sich an wie es auch Arbeiten in fish, aber funktioniert nicht in zsh und sh.

Wenn Sie bash Sie können Ihren Skript in sh oder zsh mit 'bash -c \'' + escape('all-the-rest-escaped') + '\'' ausgeführt werden.

Aber eigentlich ... node.js alle benötigten Zeichen für Sie entkommen:

var child = require('child_process')
  .spawn('echo', ['`echo 1`;"echo $SSH_TTY;\'\\0{0..5}']);

child.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});

child.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});

dieser Code-Block wird ausgeführt:

echo '`echo 1`;"echo $SSH_TTY;'\''\\0{0..5}'

und ausgeben wird:

stdout: `echo 1`;"echo $SSH_TTY;\'\\0{0..5}

oder einige Fehler.

Hier finden Sie aktuelle http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

Durch die Art und Weise einfache Lösung eine Reihe von Befehlen auszuführen ist:

require('child_process')
  .spawn('sh', ['-c', [
    'cd all/your/commands',
    'ls here',
    'echo "and even" > more'
  ].join('; ')]);

Haben Sie einen schönen Tag!

Sie sollte nie stützt sich auf Flucht unbekannte Eingabe in einem Shell-Parameter gehen -. es wird fast immer einige Rand Fall sein, dass Sie nicht gedacht haben, ermöglicht es dem Benutzer, beliebigen Code auf dem Server ausführen

hat Knoten Unterstützung für einen Befehl aufrufen und jedes Argument separat, ohne erforderlich zu entkommen. Dies ist die sicherste Art und Weise, es zu tun:

const { spawn } = require('child_process');
// Note that the arguments are in an array, not using string interpolation
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

Die Dokumentation ist hier

Wenn Sie auch mit Sonderzeichen (Zeilenumbrüche etc.) müssen umgehen Sie können es auf diese Weise tun:

str = JSON.stringify(str)
    .replace(/^"|"$/g,'') //remove JSON-string double quotes
    .replace(/'/g, '\'"\'"\'') //escape single quotes the ugly bash way

Dies setzt voraus, Sie verwenden Bash stark zitieren über einzelne -quotes) und der Empfänger kann verstehen JSON die C-ähnliche entkommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top