带模拟的Child_process?

时间:2013-11-18 16:52:48

标签: linux node.js bash authentication child-process

我正在尝试在我的节点脚本中创建一个虚拟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传递给spawn,但这不会影响任何内容。

我想要的输出是(假设uid 1001的用户名是'foobar'):

Hello foobar

有没有办法在节点甚至是“假”中执行此操作,我可以使用给定的用户凭据启动bash进程?

1 个答案:

答案 0 :(得分:2)

TL; DR:您的bash实例实际上已获得foobar用户的许可,并且您编写的代码是正确的。

如果运行以下命令而不是bash:

,则可以确认此行为
terminal       = spawn('id', ['-a'], { uid: 1001 });

应该输出这个:

stdout: uid=1001(foobar)

您可以与没有uid参数的标准子生成进行比较:

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

输出:

stdout: uid=0(root)

根据this question

,这是相关的解释
  

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

表示当bash启动时,它的SUID是root,然后将其USER变量设置为root。只有之后才能使用setuid