gpt4 book ai didi

bash - chroot + execvp + bash

转载 作者:行者123 更新时间:2023-11-29 08:55:00 25 4
gpt4 key购买 nike

更新

知道了!看我的解决方案(第五条评论)

这是我的问题:

我创建了一个名为“jail”的小型二进制文件,并在/etc/password 中将其设为测试用户的默认 shell。

这是经过简化的源代码:

#define HOME "/home/user"
#define SHELL "/bin/bash"
...
if(chdir(HOME) || chroot(HOME)) return -1;
...
char *shellargv[] = { SHELL, "-login", "-rcfile", "/bin/myscript", 0 };
execvp(SHELL, shellargv);

好吧,无论我多么努力,似乎当我的测试用户登录时,/bin/myscript 永远不会被获取。同样,如果我将 .bashrc 文件放到用户的主目录中,它也会被忽略。

为什么 bash 会势利这些家伙?

--

一些精确度,不一定相关,但要清除评论中提出的一些要点:

  • 'jail' 二进制文件实际上是 suid,因此允许它成功地 chroot()。
  • 我已经使用“ln”使适当的二进制文件可用 - 我的牢房被很好地填充了 :)
  • 问题似乎与对用户进行 chroot 无关...还有其他疏忽。

最佳答案

正如 Jason C 所说,执行的 shell 不是交互式的。

如果 shell 接受 -i 表示(bash 确实如此),他的解决方案将强制 shell 交互:

char *shellargv[] = { SHELL, "-i", "-login", ... };
execvp(SHELL, shellargv);

不过,我想补充一点,如果 ARGV[0] 以破折号开头,传统上 shell 将充当登录 shell。

char *shellargv[] = {"-"SHELL, "-i", ...};
execvp(SHELL, shellargv);

不过,通常情况下,Bash 会自动检测它是否应该以交互方式运行。它在您的情况下失败可能是因为缺少 /dev/* 节点。

关于bash - chroot + execvp + bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/254458/

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