Shell-Script

如何非侵入性地測試對文件的寫訪問?

  • December 18, 2017

在 shell 腳本中,如何在不實際嘗試修改文件的情況下輕鬆且非侵入性地測試對文件的寫訪問權限?

我可以解析 的輸出stat,但這似乎很複雜,而且可能很脆弱,儘管我不確定不同實現和時間的統計輸出有多少不同。

我可以追加到文件的末尾,看看是否成功,但這有潛在的危險,我能想到兩個原因:

  1. 我現在必須刪除添加,如果其他程序寫入文件,這將立即變得不平凡,因為我的行不再是最後一行。
  2. 讀取文件的任何程序都可能對該文件的內容有任意要求,而我可能只是破壞了該應用程序。

只需使用實用程序的 -w標誌test

[ -w /path/to/file ] && echo "writeable" || echo "write permission denied"

請注意,如果您稍後要寫入該文件,您仍然可能無法寫入該文件。文件可能已移動,權限可能已更改等。也可能發生-w檢測到寫權限但其他一些因素干預使文件不可寫的情況

另一種方法:

if >> /path/to/file
then
   echo "writeable"
else
   echo "write permission denied"
fi

這將嘗試打開文件以進行附加,如果成功, 則不執行任何命令(即執行空命令)並將輸出輸出到文件。 

請注意,如果它不存在,這會創建一個空文件。

該命令的-w操作員test可能只是執行 astat 然後嘗試確定您是否應該具有訪問權限。在某些特殊情況下,我的替代方法(上圖)比test方法更可靠,因為它強制訪問檢查由核心而不是 shell 完成。例如,

  • 如果文件位於非 Unix 文件系統上——特別是如果它是從非 Unix 文件伺服器遠端掛載的——因為stat可能會返回具有誤導性的模式值。
  • 如果文件位於只讀掛載的文件系統上。
  • 如果文件具有 ACL,並且該模式使您看起來應該具有訪問權限,但 ACL 拒絕它,反之亦然。
  • 如果某些安全框架(AppArmor、SELinux 等)拒絕訪問該文件。

引用自:https://unix.stackexchange.com/questions/159557