Tôi muốn tìm các tệp mà một người dùng cụ thể sẽ không thể đọc được.
Giả sử tên người dùng là "user123" và họ thuộc một nhóm có tên "user123". Tôi muốn tìm các tệp mà nếu chúng thuộc sở hữu của user123 có u + r trên; không thành công nếu tập tin là nhóm user123 thì nên bật g + r; thất bại mà nó có thể có o + r trên.
Vì GNU find có "-readable", tôi có thể làm điều này:
sudo -u user123 find /start ! -readable -ls
Tuy nhiên, quá trình phải được chạy bởi người dùng không có quyền truy cập sudo. Do đó, tôi đã thử cách này: (nó không kiểm tra o + r nhưng điều đó không quan trọng ở điểm này)
find /start \( -user user123 ! -perm -u=r \) -o \( -group user123 ! -perm -g=r \) -ls
nhưng nó liệt kê tập tin này:
272118 4 -rw------- 1 user123 user123 3243 Jul 3 19:50 /start/blah/blah/file.txt
Tệp này là tệp duy nhất thuộc quyền /start
sở hữu của user123 bị g=r
tắt. Như thể tìm thấy là giải thích -u=r
như -g=r
.
Tôi quyết định thử đảo ngược logic và thay vào đó kiểm tra not ( truth )
:
find /etc/puppet ! \( \( -user puppet -perm -u=r \) -o \( -group puppet -perm -g=r \) -o \( -perm -o=r \) \) -ls
Đó là công việc!
Tại sao ban đầu find
thất bại? Đây có phải là một lỗi trong find
(không có khả năng) hoặc logic sai?
Cập nhật: Tôi đã có logic sai. Như được chỉ ra dưới đây, kể từ khi! (A || B || C) == (! A &&! B &&! C) đây là hai câu tương đương:
find /start ! \( \( -user user123 -perm -u=r \) -o \( -group user123 -perm -g=r \) -o \( ! \( -user user123 -o -group user123 \) -perm -o=r \) \) -ls
find /start ! \( -user user123 -perm -u=r \) ! \( -group user123 -perm -g=r \) ! \( ! \( -user user123 -o -group user123 \) -perm -o=r \) -ls
Mục tiêu của tôi là không phải kiểm tra người dùng / nhóm hai lần. Điều tôi thực sự cần là một cấu trúc if-then-other phức tạp hơn, có lẽ chỉ có thể có nếu có toán tử -xor. Tôi có thể xây dựng một xor ngoài và / hoặc / không nhưng nó sẽ phức tạp hơn hai giải pháp ở trên.
puppet
có quyền truy cập vào một tệp với--wxrwxrwx puppet puppet
.