带有 sudo 的纯 bash 命令

带有 sudo 的纯 bash 命令

我编写了一个脚本,并在其中使用了这样的结构FILES=($S_DIR/$OPTIONS),我基本上在其中创建了一个文件数组。像这样: FILES=(/tmp/*/workspace/*zip)

这对我来说效果很好,直到脚本针对 700 个文件/文件夹运行。有没有办法用 来调用这个特定的行sudo?我当然可以使用findorls来获取文件列表。但我想弄清楚这种方式是否也可行。谢谢!

编辑:

我正在为 Nagios 编写检查,并希望检查文件夹内指定类型的所有文件。我要检查的所有文件都有 700 权限,因此用户nagios无法读取它们。并且数组FILES最终没有绑定。而且我无法检查所需的文件属性。因此,我正在寻找FILES=($S_DIR/$OPTIONS)无需外部实用程序(例如find或 )即可填充的方法ls。我的脚本适用于用户拥有权限的文件/文件夹。简而言之:我只需要提升脚本中这一行的权限:FILES=(/tmp/*/workspace/*zip)

答案1

首先,不,您不能将像这样的赋值推FILES=blah入另一个进程,因为变量是 shell 内部的,并且虽然导出的变量向下传播到子进程,但没有方法来传播它们向上到父母和祖先的一个过程。

但是,您可以运行外部命令并将其输出选择到数组。尽管对于文件名中的特殊字符而言,它不如 shell glob 安全,因为 bash 似乎不喜欢'\0'作为分隔符。如果您没有带有换行符的文件,那么这应该可以工作:

IFS=$'\n'   # only split on newlines
FILES=( $(find ...) )  # or
FILES=( $(sudo find ...) )  

但是,如果您使用提升的权限生成文件列表,则之后您可能无法访问列表中的文件。例如,如果它们位于用户无权访问的目录中,则即使stat对其进行访问也不起作用。

无论如何,为了安全地完成这一切,你需要有一个非常sudo(对于运行脚本的用户)允许的命令的有限集。否则没有什么可以阻止某人改变sudo findsudo find -delete更糟的情况。

相关内容