我正在/bin/rbash
为一些用户使用。它按预期工作,但有一些黑客行为,例如当用户运行bash
或时,然后他们获得不受限制的 shell,因此为了避免这些命令,我在他们的文件dash
中添加了以下函数。.bashrc
bash() {
echo "WARNING: NOT ALLOW!!"
}
sh() {
echo "WARNING: NOT ALLOW!!"
}
所以我的问题是:
1#我们可以使用具有多个名称的函数,如下所示
func1,func2 () {
# do stuff
}
2#我也尝试过:
case $BASH_COMMAND in # check each command`
bash|dash|sh)
echo "WARNING: NOT ALLOW!!"
;;
esac
3#/bin/rbash -> bash
这只是bash的软链接,那么它是如何受到限制的呢?
还有一些命令可以避免用户执行类似的命令unset HISTFILE
,kill -9 $$
是否有其他方法可以实现相同的目的?
答案1
不要这样做。rbash
应该仅有的除非您知道自己在做什么,否则不能在已经安全的环境中使用。有很多方法可以破解受限制的 bash shell,但事先不容易预测。
command bash
只需通过执行或即可轻松覆盖函数command sh
。
至于你的问题:
- 您不能直接同时定义多个函数。你必须做这样的事情:
x() { foo; }
alias f1=x
alias f2=x
rbash
之所以有效,是因为在启动时bash
检查 的值。argv[0]
如果基本名称(去掉前导破折号)等于RESTRICTED_SHELL_NAME
(默认为rbash
,请参阅config.h
),则它在受限模式下运行。如果作为 调用,这与它在 POSIX 兼容模式下运行的方式相同sh
。您可以shell.c
在 bash 4.2 第 1132-1147 行的以下代码中看到这一点:
/* Return 1 if the shell should be a restricted one based on NAME or the
value of `restricted'. Don't actually do anything, just return a
boolean value. */
int
shell_is_restricted (name)
char *name;
{
char *temp;
if (restricted)
return 1;
temp = base_pathname (name);
if (*temp == '-')
temp++;
return (STREQ (temp, RESTRICTED_SHELL_NAME));
}