我试图在我的节点脚本中创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
。