Bash

如何檢查文件的組權限

  • January 16, 2020

我想從 bash 腳本中檢查文件的組權限。具體來說,我需要檢查一個文件是否有組可寫位。

就是這樣。就那麼簡單。然而:

  1. 我也需要這個是便攜的。
  2. test -w <file不會告訴我它是否是組可寫的。
  3. 的輸出ls -ld對人類來說很好,但對腳本不太確定。從技術上講,我可以解析輸出,例如drwxrwxr-x提取組位,但這似乎很脆弱。
  4. OS X 和其他系統的介面stat完全不兼容。
  5. find <file> -perm ...不可能是答案嗎?

我最終ls- 解析:

is_group_writable() {
 local ls="$(ls -ld "$1")"
 [ "${ls:5:1}" = "w" ]
}

我很感謝@slm 的廣泛回答,但其他方法都不是那麼簡單。該stat方法需要我編寫至少兩個不同的呼叫來覆蓋 OS X,即使之後它返回我仍然必須對其應用算術的八進製表示。Perl 方法還可以,但需要我為這樣一個簡單的任務啟動一個解釋器,我想保持簡單並且只使用 posix utils。

方法 #1 - 統計

您可以使用該stat命令來獲取權限位。stat在大多數 Unix 上都可用(OSX、BSD,而不是我能找到的 AIX)。這應該適用於大多數 Unix,除了我能找到的 OSX 和 BSD。

$ stat -c "%a" <file>

例子

$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct  6 14:16 afile.txt

使用這個命令:

$ stat -c "%a" afile.txt
664

並使用一個簡單grep的來查看組權限模式是6還是7。

$ stat -c "%a" afile.txt | grep ".[67]."

對於 OSX 和 BSD,您需要使用這種形式的stat, stat -f(或者可能是stat -x),並進行相應的解析。由於選項stat不同,您可以將此命令包裝在lsb_release -a命令中並根據作業系統呼叫適當的版本。不理想但可行。意識到這lsb_release適用於 Linux 發行版,因此需要設計另一種替代方案來測試其他 Unix 作業系統。

方法 #2 - 查找

我認為這個命令可能會更好地為你服務。我利用findprintf開關。

例子

$ find a -prune -printf '%m\n'
664

方法 #3 - Perl

Perl 可能是一種更便攜的方式來執行此操作,具體取決於您要涵蓋的作業系統。

$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664

**注意:**以上使用 Perl 的stat()函式來查詢文件系統位。

您可以通過放棄使用數組 ,@pv並直接處理以下輸出來使其更緊湊stat()

$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664

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