Domanda

nodejs , l'unico modo per eseguire comandi esterni avviene tramite sys.exec_prefix (cmd). Mi piacerebbe chiamare un comando esterno e dare dati tramite stdin. In nodejs lì non sembra ancora essere un modo per aprire un comando e quindi spingere i dati ad esso (solo per exec e ricevere le sue uscite di errore + standard), in modo che appaia l'unico modo che ho avuto modo di fare questo adesso è tramite un unico comando stringa come:

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

La maggior parte delle risposte a domande come questa si sono concentrati su entrambi espressione regolare che non funziona per me in nodejs (che utilizza il motore JavaScript V8 di Google) o funzionalità native di altri linguaggi come Python.

Mi piacerebbe fuggire dangerStr in modo che sia sicuro per comporre una stringa exec come quella qui sopra. Se aiuta, dangerStr conterrà dati JSON.

È stato utile?

Soluzione

C'è un modo per scrivere ad un comando esterno: process.createChildProcess ( documentazione ) restituisce un oggetto con un metodo write. createChildProcess non è così conveniente, però, perché non tampone stdout e stderr, quindi sarà necessario gestori di eventi per leggere l'output in blocchi.

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.");

Altri suggerimenti

Questo è quello che io uso:

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

Se avete bisogno di una soluzione semplice è possibile utilizzare questo:

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

Quindi, la stringa verrà semplicemente scappato con virgolette singole come detto Chris Johnsen.

echo 'John'\''s phone';

Funziona in bash a causa di quoting forte , si sente come se anche lavora a fish, ma non funziona in zsh e sh.

Se avete bash tuo può eseguire lo script in sh o zsh con 'bash -c \'' + escape('all-the-rest-escaped') + '\''.

Ma in realtà ... node.js sfuggiranno tutti i caratteri necessari per voi:

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

questo blocco di codice viene eseguito:

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

e visualizzerà:

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

o di qualche errore.

Date un'occhiata a http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

A proposito soluzione semplice per eseguire una serie di comandi è:

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

Have a nice day!

dovrebbe non si affidano a fuggire sconosciuta ingresso di andare a un parametro di shell -. ci sarà quasi sempre un po 'di margine e minuscole che non avete pensato che permette all'utente di eseguire codice arbitrario sul server

Il nodo ha il supporto per chiamare un comando e passando ogni argomento a parte, senza escape richiesto. Questo è il modo più sicuro per farlo:

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

La documentazione è qui

Se hai bisogno anche di trattare con carattere speciale (-interruzioni di linea, ecc) si può fare in questo modo:

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

Questo presuppone si utilizza di Bash forte citando tramite single -quotes) e il ricevitore può capire fuga di JSON C-like.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top