Итак, я выяснил, как получить дескриптор файла сокета:
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
дочерние процессы должны наследовать файловые дескрипторы от родительского процесса, поэтому я не понимаю, почему это будет "плохой дескриптор файла" ??