如何非侵入性地测试对文件的写访问?

如何非侵入性地测试对文件的写访问?

在 shell 脚本中,我如何轻松地非侵入性测试对文件的写访问而不实际尝试修改文件?

我可以解析 的输出stat,但这似乎非常复杂,而且可能很脆弱,尽管我不确定统计输出在实现和时间上有多少差异。

我可以附加到文件末尾并查看是否成功,但这可能存在危险,原因有两个:

  1. 我现在必须删除添加内容,如果其他进程写入该文件,这会立即变得非常重要,因为我的行不再是最后一行。
  2. 读取该文件的任何进程都可能对该文件的内容有任意要求,而我可能只是破坏了该应用程序。

答案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 ]

是最好的先验

相关内容