es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obtén la contraseña para node-cli y pásala al siguiente comando en nodejs.

Estoy tratando de construir una interfaz de línea de comandos utilizando nodejs. He utilizado el paquete “enquirer” para solicitar preguntas a los usuarios. Tengo un escenario en el que necesito escribir en el archivo /etc/hosts. Intenté ejecutar el siguiente comando utilizando el paquete “execa”:

const {stdout} = await execa.command('echo "192.241.xx.xx venus.example.com venus" >> /etc/hosts', { cwd: '/etc/' })

Pero parece que no funciona, y también lo intenté con el comando “sudo”:

const {stdout} = await execa.command("sudo vim hosts", { cwd: '/etc/' });

¿Cómo puedo ejecutarlo en nodejs? Básicamente, quiero solicitar al usuario la contraseña y luego escribirla en el archivo /etc/hosts.

Para tu información: estoy utilizando “execa” para ejecutar comandos de shell. Intenté con “hostile.js” y tampoco funcionó.

Aquí está el código completo:

async function executeCommand() {
  try {
    const {stdout} = await execa.command("echo '192.34.0.03 subdomain.domain.com' | sudo tee -a /etc/hosts", { cwd: '/etc/' });
    console.log(stdout);
  } catch (error) {
    console.log(error);
    process.exit(1);
  }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Interfaz de línea de comandos utilizando Node.js

    Como experto en IT especializado en node.js, si estás intentando crear una interfaz de línea de comandos utilizando Node.js y has utilizado el paquete enquirer para solicitar preguntas a los usuarios, pero estás teniendo problemas al escribir en el archivo /etc/hosts, puedes intentar utilizar el paquete execa para ejecutar comandos de shell.

    Aquí tienes un ejemplo de código:

    async function ejecutarComando() {
      try {
        const {stdout} = await execa.command(`echo "192.241.xx.xx venus.example.com venus" | sudo tee -a /etc/hosts`, { stdin: process.stdin });
        console.log(stdout);
      } catch (error) {
        console.log(error);
        process.exit(1);
      }
    }
    

    Utiliza el método execa.command() para ejecutar un comando de shell que escribe en el archivo /etc/hosts. Se utiliza el comando sudo para obtener privilegios elevados solicitando al usuario una contraseña.

    Nota: Se utiliza el comando tee para añadir la salida a un archivo /etc/hosts con privilegios elevados. Además, la opción stdin se establece en process.stdin para solicitar al usuario una contraseña.

    En caso de que sigas teniendo problemas, puedes considerar utilizar el paquete sudo-prompt para solicitar al usuario una contraseña antes de ejecutar el comando.

    Aquí tienes un ejemplo de código que utiliza el paquete sudo-prompt:

    const sudo = require('sudo-prompt');
    const { promisify } = require('util');
    const exec = promisify(require('child_process').exec);
    
    async function ejecutarComando() {
      const contraseña = await solicitarContraseña();
      const comando = `echo "192.241.xx.xx venus.example.com venus" | sudo tee -a /etc/hosts`;
    
      try {
        const {stdout} = await exec(comando, { stdin: contraseña });
        console.log(stdout);
      } catch (error) {
        console.log(error);
        process.exit(1);
      }
    }
    
    async function solicitarContraseña() {
      return new Promise((resolve, reject) => {
        sudo.exec('echo', { name: 'Node.js' }, (error, contraseña) => {
          if (error) {
            reject(error);
          } else {
            resolve(contraseña);
          }
        });
      });
    }
    

    Primero solicita al usuario una contraseña utilizando el paquete sudo-prompt y luego utiliza la entrada para ejecutar un comando de shell que escribe en el archivo /etc/hosts. Se utiliza el método promisify para convertir la función exec basada en callbacks a una basada en promesas.

Comments are closed.