我正在尝试在我的节点脚本中创建一个虚拟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
进程?
答案 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)
bash检测到它已经启动了SUID root(UID!= EUID)并使用了 它的根本权力是将这个权力抛弃,将EUID重置为UID。
表示当bash
启动时,它的SUID是root,然后将其USER
变量设置为root
。只有之后才能使用setuid
。