gpt4 book ai didi

linux - 我试图阻止在 BASH 中执行命令。. 并不总是有效

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:11 25 4
gpt4 key购买 nike

这是基于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.shsource stop.sh,则不会显示此行为,而且它的效果非常好。

最佳答案

  1. 防止用户运行任何命令的最简单方法就是不给他们算账。(你说你想“阻止某些命令的执行”,但是你的stop.sh阻止所有命令。这使您的问题有些难以理解。)
  2. 防止用户运行某些程序的最简单方法是将它们修改为 700。如果指定的用户需要能够运行该程序,使用 ACL 授予他们访问权限。(如果只需要屏蔽少数用户,您也许可以使用 ACL 做到这一点,但这可能不可靠。)

    您的方法很难正确。假设你真的想阻止人们运行 ls (真的吗?),你打算处理像这样的事情吗

    cp /bin/ls ls_copy
    ./ls_copy

    ln -s /bin/ls ls_link
    ./ls_link

    ?

  3. 我今天了解到 bash 有 Debug模式。我对此了解不多,但我通过实验发现,当 bash 进程启动并读取设置 extdebug 的 BASH_ENV 文件时,它(bash shell)试图读取 /usr/share/bashdb/bashdb-main.inc .(显然,这条路径是硬编码在 /bin/bash 中的。)这对你来说应该不足为奇,当您收到一条命名该文件的错误消息时。显然读取该文件时出现问题。

    如果设置 extdebug 则不会发生这种情况和/或做 trap <i>some_command</i> DEBUG在脚本中(直接或通过 source );我不知道为什么。( Herehere 是两个引用关于 bash 调试器。)

    建议:

    • 如果/usr/share/bashdb目录不存在,或者它确实是 bashdb-main.inc文件不存在,创建它们(空文件)。
    • 如果/usr/share/bashdb/bashdb-main.inc存在,将其重命名为备份名称。特别是,这将很有用如果bashdb-main.inc是指向不存在的文件的符号链接(symbolic link)。
    • 如果/usr/share/bashdb/bashdb-main.inc存在,然后你尝试上面的第二个项目符号(重命名文件)这不起作用,请尝试第一个项目符号(创建一个空文件)。
  4. 通过执行上述操作(重命名 /usr/share/bashdb/bashdb-main.inc ),我能够让你的命令执行预防技巧起作用。

关于linux - 我试图阻止在 BASH 中执行命令。. 并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48672149/

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