Sae*_*ati 17 permissions command-line bash chmod
有这个脚本很难阅读和调试。
在它的某个地方,它有这样的命令:
sudo chmod -R 777 /$some_var/$another_var
Run Code Online (Sandbox Code Playgroud)
换句话说,它动态创建一条路径,然后递归地授予该路径权限。
但是,由于它需要互联网连接并下载内容,有时这些变量由于错误而为空,并且会执行以下命令:
sudo chmod -R 777 /
Run Code Online (Sandbox Code Playgroud)
这会破坏操作系统。我们需要再次重新安装它。
我们正在编写脚本,使其变得更好、更有弹性。但是,有没有办法阻止用户执行该命令root?
我的意思是,如果路径为 ,我希望该命令不可执行/,即使对于root用户而言:
sudo chmod -R 777 /
Run Code Online (Sandbox Code Playgroud)
mur*_*uru 48
如果您专门询问有关sudo chmod -R 777 /Ubuntu 的问题,那么您很幸运。GNU 工具有一个选项:--preserve-root. 来自GNU 文档:
2.9
/特殊处理某些命令可以对整个层次结构进行破坏性操作。[...] 由于此类命令的合法用途非常少,GNU
rm通常拒绝在任何解析为/. 如果您确实想尝试删除系统上的所有文件,可以使用该--no-preserve-root选项,但该--preserve-root选项指定的默认行为对于大多数用途来说更安全。命令
chgrp,chmod和chown还可以对整个层次结构进行破坏性操作,因此它们也支持这些选项。[...] 传统和 POSIX 要求这些命令在 上递归操作/,因此它们默认为--no-preserve-root,但使用该--preserve-root选项使它们对于大多数用途来说更安全。--preserve-root为了方便起见,您可以在别名或 shell 函数中指定。请注意,该
--preserve-root选项还确保chgrp即使 在取消引用指向 的符号链接时也chown不会修改。//
因此,修改您的脚本以使用:
sudo chmod -R 777 --preserve-root /$some_var/$another_var
Run Code Online (Sandbox Code Playgroud)
请注意,我不容忍使用chmod -R 777. 绝对必要的情况极为罕见chmod -R 777。
您还可以使用set -u使脚本将未设置的变量视为错误,或使用${var:?message}将未设置的变量的特定实例视为错误:
$ message="Unset/empty variable not allowed"
$ sudo chmod -R 777 --preserve-root "/${some_var:?$message}/${another_var:?$message}"
bash: some_var: Unset/empty variable not allowed
Run Code Online (Sandbox Code Playgroud)
(默认消息是:parameter null or not set。)
在 Docker 容器中测试:
root@d9c4e4427d7a:/# chmod -R 777 --preserve-root "/${some_var:?$message}/${another_var:?$message}"
bash: some_var: Unset/empty variable not allowed
root@d9c4e4427d7a:/# some_var=/
root@d9c4e4427d7a:/# another_var=////
root@d9c4e4427d7a:/# chmod -R 777 --preserve-root "/${some_var:?$message}/${another_var:?$message}"
chmod: it is dangerous to operate recursively on '/'
chmod: use --no-preserve-root to override this failsafe
Run Code Online (Sandbox Code Playgroud)
Rin*_*ind 13
我们可以阻止在 Linux 中以 root 身份执行命令吗?
不。
我们可以阻止 Linux 中的脚本执行命令吗?
是的。不要使用它并自己制作。例如,您可以创建一个别名 fprchmod并对其有效性进行一些检查并执行它chmod。
这很糟糕:
sudo chmod -R 777 /$some_var/$another_var
Run Code Online (Sandbox Code Playgroud)
sudo不属于脚本内部。777总是不好。750最多当您有超过 1 个用户时,并且700应该优先在单机上使用。$some_varAND是否$another_var具有正确的值。健全性检查是脚本的重要组成部分。如果这些值来自不受信任的来源(例如用户通过命令行执行或通过编辑配置提供变量),则更是如此。意思是如果路径为 ,我希望该命令不可执行
/,即使对于 root 用户也是如此:
显而易见的答案是在评估变量的命令之前添加健全性检查。您还可以使用别名chmod来执行您自己的命令来检查值。
它必须在脚本内部:对空的检查还不够好:$some_var="/////////////"同样糟糕;)
您可以使用 Bash 的扩展测试括号[[ ... ]]来预先检查if语句...以下内容将检查是否$path包含除正斜杠和空格之外的字符以及解析路径本身,如果其中一个或两个都将评估为 false两个参数$some_var和$another_var未设置或为空,或者如果两者都是斜杠或全部空格,或者如果$path解析为/...,如下所示:
path="/${some_var:-EMPTY}/${another_var:-EMPTY}"
if [[ "$path" = *[!\ /]* && "$(realpath "$path" 2>/dev/null)" != "/" && ! "$path" =~ "EMPTY" ]]
then
# your command using those variables here
# chmod -R 777 "$path"
echo "Directory is not root"
fi
Run Code Online (Sandbox Code Playgroud)
注意:改进以解决黑客概率(由@grok的评论提出......谢谢@grok)等。
做这个:
# if both of the variables are not empty
if [[ -n "$some_var" && -n "$another_var" ]]
then
# run the chmod command as intended
sudo chmod -R 777 /$some_var/$another_var
else
# only do this if you don't want the script to continue, but to exit with an error message
echo "Error - exiting"
exit
fi
Run Code Online (Sandbox Code Playgroud)
如果任何变量可能包含一串斜杠(/字符),您也需要检查这一点。
| 归档时间: |
|
| 查看次数: |
5147 次 |
| 最近记录: |