引用文件名是否足以安全运行`xargs sudo rm -rf`?

Ped*_*o A 10 security command-line bash scripts rm

我写了一个脚本,删除文件夹中除最后两个文件之外的所有文件:

#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
    | head -n -2 \
    | xargs printf -- "'/path/to/some/folder/%s'\n" \
    | xargs sudo rm -rf
Run Code Online (Sandbox Code Playgroud)

此脚本将每天作为 cron 作业执行。

理由如下:

  1. 使用获取所有文件的列表ls -1(这样我每行得到一个文件);

  2. 使用head -n -2;从列表中删除最后两个

  3. 由于ls打印相对路径,所以使用xargs printfthing 来预先添加文件夹路径并使其成为绝对路径;

  4. 将它们发送到sudo rm -rf使用xargs.

每个人都可以访问此文件夹,因此任何人都可以创建和删除此文件夹中的任何文件。

问题是: sudo rm -rf很可怕。xargs sudo rm -rf非常可怕。

我想确保没有人可以通过创建要删除的巧妙文件(意外或故意)来损坏其他文件夹/系统。我不知道,一些聪明的东西,比如:

file with / spaces.txt

这可能会导致一个超级可怕的sudo rm -rf /

编辑:我的错误,文件名不能包含/,所以这个特定的问题不会发生,但关于是否存在其他风险的问题仍然存在。

这就是我使用的原因--quoting-style=shell-always,这应该可以防止任何带有空格的文件的技巧。但现在我想知道是否有人可以更聪明地使用文件名中的空格引号,也许吧。

我的脚本安全吗?


注意:我需要,sudo因为我正在远程访问该文件夹(从使用 的映射网络驱动器mount),并且没有 sudo 我无法让它工作。

hee*_*ayl 11

在 Linux 中,任何字符都是有效的文件名组成字符,除了:

  • \0 (ASCII NUL):用于 C 中的字符串终止
  • / (正斜杠):用于路径分离

因此,您的方法在许多情况下肯定不会像您想象的那样工作,例如它是否处理\n文件名中的换行符 ( )?(提示: )。

几点注意事项:

  • 不要解析ls;使用专用工具(大多数用例至少有一个)
  • 在处理文件名时,尝试利用几乎所有处理此类数据的 GNU 工具提供的 NUL 分隔输出
  • 管道时要小心,确保两个程序都可以理解 NUL 分隔
  • 每当您调用 时xargs,看看您是否可以逃脱find ... -exec;在大多数情况下,你将被罚款只find单独

我认为这些会让你暂时离开。steeldriver已经在注释 ( printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm) 中提供了 NUL 分隔的想法,以此为起点。