我想创建一个自定义命令目录,该目录仅在 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
变量。您还可以通过符号链接调用bash
as来获取受限模式。rbash