带有模拟的Child_process?

我试图在我的节点脚本中创build一个虚拟的bash,在另一个用户上下文中执行命令。

var spawn = require('child_process').spawn; var terminal = spawn('bash', [], { uid: 1001 }); terminal.stdout.on('data', function (data) { console.log('stdout: ' + data); }); terminal.stderr.on('data', function (data) { console.log('stderr: ' + data); }); terminal.on('close', function (code) { console.log('child process exited with code ' + code); }); terminal.stdin.write('echo Hello $USER'); terminal.stdin.end(); 

以root身份执行这个输出后,

 Hello root 

正如你可以在我的例子中看到我已经传递了一个用户ID到产卵,但是这不影响任何东西。

我期望的输出是(假设用户名是'foobar'):

 Hello foobar 

有没有办法做到这一点在节点,甚至是一个“假”,我可以用给定的用户凭据启动一个bash进程?

TL; DR:你的bash实例实际上是foobar用户的许可,你写的代码是正确的。

如果您运行以下命令而不是bash,则可以确认此行为:

 terminal = spawn('id', ['-a'], { uid: 1001 }); 

应该输出这个:

 stdout: uid=1001(foobar) 

你可以比较一个标准的孩子spawn,没有uid参数:

 terminal = spawn('id', ['-a']); 

其输出:

 stdout: uid=0(root) 

根据这个问题 ,这里是相关的解释:

bash检测到它已经启动了SUID root(UID!= EUID),并使用它的根权力来抛弃这个权力,将EUID重置为UID。

这意味着当bash开始时,它的SUID是root,然后它将USER变量设置为root 。 只有之后才使用setuid