Запись в файловый дескриптор сокета из дочернего процесса bash в Node.js - PullRequest
0 голосов
/ 25 мая 2019

У меня есть это:

const net = require('net');
const cp = require('child_process');

const server = net.createServer(s => {

  const bash = cp.spawn('bash');

  s.on('data', d => {
     bash.stdin.write(`
      exec ${String(d)};
      echo 'write to socket s here';  // write to s here
    `);
  });


  bash.stdout.pipe(s, {end:false});
  bash.stderr.pipe(s, {end:false});


});

server.listen(4004);

Кто-нибудь знает, как я могу писать в сокет s из процесса bash?Я полагаю, мне нужно как-то передать номер дескриптора файла в bash?Как получить файловый дескриптор сокета?Я консоль зарегистрировал свойства сокета, и там не было файлового дескриптора, который я мог видеть.

что-то вроде этого:

const fd = s.fd;

const bash = cp.spawn('bash', [], {
   env: Object.assign({}, process.env, {
       socketfd: fd
    })
});

, а затем

bash.stdin.write(`
    exec ${String(d)};
    echo "test" >&"$socketfd"
`)

1 Ответ

0 голосов
/ 25 мая 2019

Итак, я выяснил, как получить дескриптор файла сокета:

const net = require('net');
const cp = require('child_process');
const fs = require('fs');

const server = net.createServer(s => {

  const fd = s._handle.fd;  // file descriptor

  const bash = cp.spawn('bash', [], {
    env: Object.assign({}, process.env, {
      socket_fd: fd
    })
  });



  s.setEncoding('utf8');

  s.on('data', d => {

    if(String(d).trim() === '∆∆∆'){
      bash.stdout.write('\n$$$');
      return;
    }

    d = String(d);

     bash.stdin.write(`
         set +e;

         ${d}
         echo "file descriptor: $socket_fd"
         echo "∆∆∆\n" >&$socket_fd

     `);
  });


  bash.stdout.pipe(s, {end:false});
  bash.stderr.pipe(s, {end:false});


});

server.listen(4004);

, но когда я подключаюсь к этому с помощью nc localhost 4004 и запускаю простую команду echo, я получаю следующее:

echo foo
foo
file descriptor: 22
bash: line 8: 1: Bad file descriptor

дочерние процессы должны наследовать файловые дескрипторы от родительского процесса, поэтому я не понимаю, почему это будет "плохой дескриптор файла" ??

...