在 shell 脚本中,我如何轻松地非侵入性测试对文件的写访问而不实际尝试修改文件?
我可以解析 的输出stat
,但这似乎非常复杂,而且可能很脆弱,尽管我不确定统计输出在实现和时间上有多少差异。
我可以附加到文件末尾并查看是否成功,但这可能存在危险,原因有两个:
- 我现在必须删除添加内容,如果其他进程写入该文件,这会立即变得非常重要,因为我的行不再是最后一行。
- 读取该文件的任何进程都可能对该文件的内容有任意要求,而我可能只是破坏了该应用程序。
答案1
只需使用 -w
标志test
效用:
[ -w /path/to/file ] && echo "writeable" || echo "write permission denied"
请注意,如果您稍后要写入该文件,您仍然可能无法写入该文件。文件可能已移动,权限可能已更改等。也可能发生以下情况-w
检测到写入权限,但其他一些因素介入使文件不可写。
答案2
另一种方法:
if >> /path/to/file
then
echo "writeable"
else
echo "write permission denied"
fi
这将尝试打开文件进行追加,如果成功, 跑步没有命令(IE,运行空命令)并输出到文件。
请注意,如果文件不存在,这将创建一个空文件。
-w
命令的操作员可能test
只是执行 a stat
,然后尝试确定您是否应该具有访问权限。在某些特殊情况下,我的替代方案(上面)比该test
方法更可靠,因为它强制由内核而不是 shell 来完成访问检查。例如,
- 如果文件位于非 Unix 文件系统上(尤其是从非 Unix 文件服务器远程安装时),因为
stat
可能会返回误导性的模式值。 - 如果文件位于以只读方式安装的文件系统上。
- 如果文件具有 ACL,并且该模式看起来您应该具有访问权限,但 ACL 拒绝了它,反之亦然。
- 如果某些安全框架(AppArmor、SELinux 等)拒绝访问该文件。
答案3
G-man 是对的:[ -w ]
不会总是说实话。这里处理不存在的文件和没有权限来自外壳的消息:
( [ -e /path/to/file ] && >> /path/to/file ) 2> /dev/null &&
echo writable ||
echo not writable
更新: 看起来很吓人,不是吗?嗯,确实如此。嗯...怎么说呢...不要使用这个,除非你完全知道你处于它要求按预期工作的条件下。请参阅斯蒂芬的评论。
那么得出什么结论呢?即使[ -w ]
不说实话,这也是唯一的命令故意的做这项工作。如果没有,那么,我们会责怪它,编写错误报告,并且它将来会起作用。更好地检查其工作和使用的条件[ -w ]
;针对特殊情况编写特殊代码。解决方法有其自身的条件。
[ -w /path/to/file ]
是最好的先验。