更新
知道了!请参阅我的解决方案(第五条评论)
这是我的问题:
我创建了一个名为“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会打扰这些家伙?
-
一些精确性,不一定相关,但要清除评论中提出的一些观点:
答案 0 :(得分:4)
正如Jason C所说,exec'ed 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/*
个节点。
答案 1 :(得分:2)
shell不是交互式的。尝试将-i添加到参数列表中。
答案 2 :(得分:2)
我可以确定自己想要这样做,但是如果你还没有,请查看jail chroot project和jailkit以获取创建jail shell的工具。
答案 3 :(得分:1)
当您的用户登录并且他们的shell尝试获取此文件时,它将在其UID下运行。 chroot()
系统调用只能由root用户使用 - 你需要比这更聪明。
此外,chroot到用户的主目录将使他们的shell无用,因为(除非他们有很多东西)他们将无法访问任何二进制文件。例如ls
等有用的东西。
答案 4 :(得分:1)
感谢您的帮助,伙计们,
我明白了:
我忘了 setuid()/ setgid(),chroot(),setuid()/ setgid()返回,然后使用execve()传递适当的环境
哦,如果我没有将参数传递给bash,它将会提供〜/ .bashrc
如果我传递“-l”,如果要提供 / etc / profile
干杯!