bash 脚本运行时阻止所有默认命令?

bash 脚本运行时阻止所有默认命令?

我想创建一个自定义命令目录,该目录仅在 shell 脚本运行时有效,并且当用户停止脚本时,所有命令都会回退到默认值,而不会更改默认命令,例如 bash 中的别名。

例如,当您打开终端时,bash 自动允许访问/sbin/usr/bin或中的所有命令/bin。我需要阻止它们全部,因为我的自定义命令将具有相同的名称,例如cd, cp, mv

这是我需要在代码中执行的操作的一个假示例:

#!/bin/bash
disable_path_commands "/sbin"
disable_path_commands "/usr/local/bin"
disable_path_commands "/usr/bin"

global_commands_dir="/my_custom_commands_dir"
bash --block_default_commands "*" --allow_only_commands_from_default "sh,cd,sudo,su" --only-access-commands-from-dir "$global_commands_dir"
cd ~/

执行脚本后,用户只能访问存储在 中的自定义命令/my_custom_commands_dir,但用户的当前目录将是~/或当前工作目录。当用户输入 时exit,会自动关闭可以访问的 bash /my_custom_commands_dir,现在一切都会恢复正常。用户将有权访问所有命令,类似于chroot但没有完整的操作系统环境,仅适用于命令或类似于

export DEFAULT_COMMANDS_DIR="/my_custom_commands_dir" 
unset /SBIN
unset /USR/BIN

答案1

如果您希望脚本更改当前运行的 shell 中的环境,请考虑使用“source”。然后,其他进程和脚本就可以访问 shell 中导出的变量。

source myscript

这将来源 myscript.该文件不必是可执行的,但它必须是有效的 shell 脚本。该文件可以位于当前目录或 $PATH 中的目录中。

. myscript

这也将来源 myscript.此“拼写”是 POSIX 定义的官方拼写。 Bash 将 source 定义为点的别名。

然后,您可以复制并修改现有的 .bashrc/profile 文件等,以使用您选择的选项覆盖 PATH。这会将新设置导出到当前运行的 shell。完成后,获取原始 .bashrc/profile 等以恢复正常。

您还可以研究使用“exec”命令来执行脚本:“exec”命令将在执行“myscript”之前杀死或终止当前shell。因此,您需要从头开始创建环境(路径等):

#!/bin/bash
#myscript to check exec
exec /path/myRestrictedShellscript.sh
echo "This text will not be printed"

答案2

看看这个--restricted选项,它禁用了很多功能,包括覆盖PATH变量。您还可以通过符号链接调用bashas来获取受限模式。rbash

相关内容