gpt4 book ai didi

linux - 具有模拟功能的 Child_process?

转载 作者:太空狗 更新时间:2023-10-29 12:17:58 24 4
gpt4 key购买 nike

我正在尝试在我的 Node 脚本中创建一个虚拟 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

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

最佳答案

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 detects that it has been started SUID root (UID!=EUID) and uses its root power to throw this power away, resetting EUID to UID.

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

关于linux - 具有模拟功能的 Child_process?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20053251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com