我编写了一个脚本,并在其中使用了这样的结构FILES=($S_DIR/$OPTIONS)
,我基本上在其中创建了一个文件数组。像这样: FILES=(/tmp/*/workspace/*zip)
。
这对我来说效果很好,直到脚本针对 700 个文件/文件夹运行。有没有办法用 来调用这个特定的行sudo
?我当然可以使用find
orls
来获取文件列表。但我想弄清楚这种方式是否也可行。谢谢!
编辑:
我正在为 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 find
或sudo find -delete
更糟的情况。