
在 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 ]
是最好的先驗。