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 作业执行。
理由如下:
使用获取所有文件的列表ls -1(这样我每行得到一个文件);
使用head -n -2;从列表中删除最后两个
由于ls打印相对路径,所以使用xargs printfthing 来预先添加文件夹路径并使其成为绝对路径;
将它们发送到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;使用专用工具(大多数用例至少有一个)xargs,看看您是否可以逃脱find ... -exec;在大多数情况下,你将被罚款只find单独我认为这些会让你暂时离开。steeldriver已经在注释 ( printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm) 中提供了 NUL 分隔的想法,以此为起点。