
如何取得特定使用者俱有「讀寫」權限的所有檔案的清單。
例如,當我進入 Mac 桌面時,右鍵單擊文件“A”,然後“獲取資訊”,然後在底部我有“共享和權限”,我可以在其中添加自定義用戶,例如“popo”例如,然後指定他可以「讀取和寫入」該檔案。
然後我想使用命令列來獲取POPO可以讀寫的所有文件,並且只有這些(我想在上面的範例中獲取“A”)。
我所有的研究目前引導我的是:
find /Users/Me/Desktop -user popo -perm 777
但我什麼也沒得到..
上述有什麼問題find
,我該如何處理?
答案1
您需要搜尋每個人都可以讀寫的檔案、或可以透過使用者的 uid 讀寫的檔案、或可以被使用者所屬的所有群組讀寫的檔案。但實際情況比這要複雜一些。正如所指出的這裡作者:Stephane Chazelas,如果檔案由使用者擁有,則僅擁有者權限計數,如果檔案由使用者所屬的群組擁有,則僅群組權限計數。
因此,我們需要檢查“所有者=RW或(不是所有者和群組=rw)或(不是所有者且不是群組和其他=rw)”
您可以使用 取得使用者所屬的群組 gid 的清單id -G
。這可用於建立具有標準 shell 命令替換的 find 命令列。
我最初的答案是一句台詞,但這項工作太複雜了,無法用一句台詞來完成。這是一個可以完成這項工作的 bash shell 腳本。
#! /bin/bash
U="$1" # username to do perm search on - e.g. popo
TOPDIR="$2" # starting directory for search - e.g. /Users/Me/Desktop
# permissions to search for - defaults to "rw"
PERMS=${3:-rw}
# permission bits "style". "/"=ANY or "-"=ALL. defaults to /
#
# see find(1) and search for '-perm -mode' or '-perm /mode' for
# details on how this works.
PSTYLE=${4:-/}
# construct a find expression specifying all groups that the user
# is a member of
GIDS="$(for i in $(id -G "$U"); do echo -n " -gid $i -o "; done)"
GIDS=$(echo "$GIDS" | sed -e 's/ -o $//') # strip trailing " -o "
find "$TOPDIR" \
\( -user "$U" -perm ${PSTYLE}u=$PERMS \) \
-o \( -not -user "$U" -a \( $GIDS \) -perm ${PSTYLE}g=$PERMS \) \
-o \( -not -user "$U" -not \( $GIDS \) -perm ${PSTYLE}o=$PERMS \)
該腳本必須以 root 身分執行。其他使用者可能沒有所需的權限來查看 popo 可以查看的所有目錄。
id
注意:我已經使用GNU Coreutils 和find
GNU findutils的最新版本在 Debian Linux 系統上對此進行了測試。id
和的 Mac 實作find
可能有所不同,我目前沒有可用的 Mac 來測試。如果不同,請檢查 Mac 手冊頁中的id
和find
- 可能需要修改以適應 Mac 的內容是 的-G
和-u
選項id
以及-perm /
的或“-perm -”選項find
。
答案2
這是因為-user
選項在指定使用者(如果文件擁有者)所在的位置搜尋文件,而這不是您的情況。
看起來最簡單的方法是在 popo 用戶下執行命令:
find /Users/Me/Desktop -readable
答案3
sudo find . -print0 |
sudo -u popo perl -Mfiletest=access -l -0ne '
print if -r && -w'
看幾乎相同問題的答案為什麼檢查權限通常不起作用。