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

标签 linux bash

这是基于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/

相关文章:

Android 模拟器启动卡在 “QEMU Pipe Device:rw, wait_event error”

linux - ELF 文件存在于/usr/bin 但结果为 "-ash: file: not found"

linux - 如何将 mv 反转为文件 - Unix

c++ - 服务器重启后重新连接到 QDBus 服务器(Qt C++)

C++ Linux : Get the refresh rate of a monitor

bash - 为什么我不能将 python 脚本的标准输出重定向到文件

bash - 删除第 4 列中包含范围模式的行

bash - shell脚本: Indirect recursion doesn't work as expected (too many repetitions)

linux - 如何从文件的每一行中提取具有特殊字符的特定字符串

Linux shell : unexpected EOF while looking for matching `"'