这是基于another question of mine .我试图阻止使用脚本执行某些命令。我让脚本在交互式 shell 中完美运行,但对于非交互式 shell,它不会阻止其执行。
/home/user/stop.sh(源自 .bashrc)
#!/usr/bin/env bash
shopt -s extdebug; stop_cmd () {
[ -n "$COMP_LINE" ] && return # not needed for completion
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # not needed for prompt
local this_command=$BASH_COMMAND;
echo $this_command" Not Allowed";
return 1
};
trap 'stop_cmd' DEBUG
/home/user/temp.sh
#!/usr/bin/env bash
ls
我使用了 @Inian 建议的 BASH_ENV 变量将我的脚本放入使用非交互式 shell 的脚本文件中。
在一个新的外壳中
#:export BASH_ENV=/home/user/stop.sh
#:ls
ls Not Allowed --> This is because of the source in .bashrc
#: --> Prompt appears. ls did not run
#:./temp.sh
./temp.sh: /usr/share/bashdb/bashdb-main.inc: No such file or directory
./temp.sh: warning: cannot start debugger; debugging mode disabled
ls Not Allowed --> Because of the $BASH_ENV
Directory contents displayed --> ls ended up running
#: --> Prompt appears after executing temp.sh
但是,如果我直接在 temp.sh
中 source stop.sh
,则不会显示此行为,而且它的效果非常好。
最佳答案
- 防止用户运行任何命令的最简单方法
就是不给他们算账。
(你说你想“阻止某些命令的执行”,
但是你的
stop.sh
阻止所有命令。 这使您的问题有些难以理解。) 防止用户运行某些程序的最简单方法 是将它们修改为 700。 如果指定的用户需要能够运行该程序, 使用 ACL 授予他们访问权限。 (如果只需要屏蔽少数用户, 您也许可以使用 ACL 做到这一点,但这可能不可靠。)
您的方法很难正确。 假设你真的想阻止人们运行
ls
(真的吗?), 你打算处理像这样的事情吗cp /bin/ls ls_copy ./ls_copy
或
ln -s /bin/ls ls_link ./ls_link
?
我今天了解到 bash 有 Debug模式。 我对此了解不多,但我通过实验发现, 当 bash 进程启动并读取设置
extdebug
的 BASH_ENV 文件时, 它(bash shell)试图读取/usr/share/bashdb/bashdb-main.inc
. (显然,这条路径是硬编码在/bin/bash
中的。) 这对你来说应该不足为奇, 当您收到一条命名该文件的错误消息时。 显然读取该文件时出现问题。如果设置
extdebug
则不会发生这种情况 和/或做trap <i>some_command</i> DEBUG
在脚本中(直接或通过source
);我不知道为什么。 ( Here 和 here 是两个引用 关于 bash 调试器。)建议:
- 如果
/usr/share/bashdb
目录不存在, 或者它确实是bashdb-main.inc
文件不存在, 创建它们(空文件)。 - 如果
/usr/share/bashdb/bashdb-main.inc
存在, 将其重命名为备份名称。 特别是,这将很有用 如果bashdb-main.inc
是指向不存在的文件的符号链接(symbolic link)。 - 如果
/usr/share/bashdb/bashdb-main.inc
存在, 然后你尝试上面的第二个项目符号(重命名文件) 这不起作用,请尝试第一个项目符号(创建一个空文件)。
- 如果
通过执行上述操作(重命名
/usr/share/bashdb/bashdb-main.inc
), 我能够让你的命令执行预防技巧起作用。
关于linux - 我试图阻止在 BASH 中执行命令。. 并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48672149/