Pregunta

nodejs , la única manera de ejecutar comandos externos se realiza a través sys.exec (cmd). Me gustaría llamar a un comando externo y darle datos a través de la entrada estándar. En nodejs todavía no parece haber una manera de abrir un comando y luego enviar datos a la misma (sólo para Exec y recibir sus salidas + error estándar), por lo que parece la única manera que tengo que hacer esto ahora es a través de una sola cadena de comando como por ejemplo:

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

La mayoría de las respuestas a las preguntas de este tipo se han centrado en cualquiera de expresiones regulares que no funciona para mí en nodejs (que utiliza Google V8 de motor de Javascript) o características nativas de otros lenguajes como Python.

Me gustaría escapar dangerStr por lo que es seguro para componer una cadena exec como la de arriba. Si ayuda, dangerStr contendrá los datos JSON.

¿Fue útil?

Solución

Hay una manera de escribir a un comando externo: process.createChildProcess ( documentación ) devuelve una objeto con un método write. createChildProcess No es como si conveniente, ya que no almacena stdout y stderr, por lo que tendrá controladores de eventos para leer la salida en trozos.

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

Otros consejos

Esto es lo que yo uso:

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

Si necesita una solución simple que puede utilizar esto:

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

Así que su cadena será simplemente escapó con comillas simples como se mencionó Chris Johnsen.

echo 'John'\''s phone';

Se trabaja en bash debido fuerte citando, se siente como que también obras en fish, pero no funciona en zsh y sh.

Si usted tiene su bash puede ejecutar la secuencia de comandos en sh o zsh con 'bash -c \'' + escape('all-the-rest-escaped') + '\''.

Pero en realidad ... Node.js escapará todos los caracteres necesarios para usted:

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

este bloque de código se ejecutará:

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

y la salida:

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

o algún error.

Tome un vistazo a http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

Por la solución de forma sencilla de ejecutar un grupo de comandos es:

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

Que tenga un buen día!

debe no dependen de escape de entrada desconocida ir a un parámetro de cáscara -. casi siempre habrá un poco de borde caso de que usted no ha pensado en que permite al usuario ejecutar código arbitrario en el servidor

Nodo tiene soporte para llamar a un comando y pasa cada argumento separado, sin escape que requiere. Esta es la forma más segura de hacerlo:

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 documentación es aquí

Si también necesita tratar con carácter especial (saltos de línea, etc.) puede hacerlo de esta manera:

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

Esto supone que se utiliza de Bash fuerte citando a través de un solo -quotes) y el receptor puede entender de JSON-C como escapar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top