Làm cách nào để kiểm tra quyền của nhóm


9

Tôi muốn kiểm tra quyền của nhóm đối với tệp từ tập lệnh bash. Cụ thể, tôi cần kiểm tra xem một tập tin có nhóm có thể ghi bit không.

Đó là nó. Đơn giản như thế. Tuy nhiên:

  1. Tôi cũng cần cái này để xách tay.
  2. test -w <file sẽ không cho tôi biết liệu nhóm có thể ghi được hay không.
  3. Đầu ra ls -ldlà tốt cho con người, nhưng không chắc chắn về kịch bản. Về mặt kỹ thuật tôi có thể phân tích cú pháp đầu ra như drwxrwxr-xđể trích xuất các bit nhóm, nhưng điều này có vẻ dễ vỡ.
  4. Giao diện stathoàn toàn không tương thích giữa OS X và các hệ thống khác.
  5. find <file> -perm ... không thể là câu trả lời?

Bạn có cần kiểm tra bit quyền của nhóm không, hay bạn cần kiểm tra xem một nhóm cụ thể có quyền ghi không? Nhóm (hoặc người dùng) có thể có quyền ghi thông qua ACL.
Gilles 'SO- ngừng trở nên xấu xa'

Chỉ cần bit cho phép nhóm. Không có nhóm cụ thể có liên quan.
mislav

Câu trả lời:


8

Phương pháp số 1 - stat

Bạn có thể sử dụng statlệnh để lấy các bit quyền. statcó sẵn trên hầu hết các Unix (OSX, BSD, không phải AIX từ những gì tôi có thể tìm thấy). Điều này sẽ hoạt động trên hầu hết các Unix, ngoại trừ OSX & BSD từ những gì tôi có thể tìm thấy.

$ stat -c "%a" <file>

Thí dụ

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

Sử dụng lệnh này:

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

Và sử dụng đơn giản grepđể xem chế độ cấp phép của nhóm là 6 hay 7.

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

Đối với OSX và BSD, bạn cần sử dụng hình thức này stat, stat -f(hoặc có lẽ stat -x) và phân tích tương ứng. Vì các tùy chọn statkhác nhau, bạn có thể gói lệnh này trong một lsb_release -alệnh và gọi phiên bản phù hợp dựa trên HĐH. Không lý tưởng nhưng hoàn toàn khả thi. Nhận ra rằng lsb_releasechỉ có sẵn cho distro Linux để thay thế khác sẽ cần phải được đặt ra để thử nghiệm hệ điều hành Unix khác.

Phương pháp # 2 - tìm

Tôi nghĩ rằng lệnh này có thể phục vụ bạn tốt hơn mặc dù. Tôi sử dụng findprintfchuyển đổi.

Thí dụ

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

Phương pháp # 3 - Perl

Perl có thể là một cách di động hơn để làm điều này tùy thuộc vào các hệ điều hành bạn đang cố gắng thực hiện.

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

LƯU Ý: Ở trên sử dụng hàm của Perl stat()để truy vấn các bit của hệ thống tệp.

Bạn có thể làm cho nó nhỏ gọn hơn bằng cách gửi bằng cách sử dụng một mảng @pvvà xử lý stat()trực tiếp đầu ra của :

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

Tôi nghĩ rằng bạn đã bỏ lỡ điểm 4. statLệnh này rất khác nhau giữa các hệ thống khác nhau và không khả dụng.
jordanm

@jordanm - cảm ơn tôi đã thấy nó, đang tìm kiếm một sự thay thế. Tôi nghĩ find . -printfcó thể làm điều đó nhưng không thể xác định nếu nó có sẵn trên OSX 'find.
slm

1
Tôi cũng không thể tìm thấy nó được tham chiếu trong hướng dẫn POSIX2008, vì vậy tôi có khuynh hướng đồng ý. Tôi không chắc chắn về bất kỳ phương pháp nào khác. Tôi nghĩ rằng bạn phải cắn viên đạn ở đây và phát hiện HĐH nào và gọi phần thích hợp. lệnh, dường như là cách tiếp cận tốt nhất.
slm

1
Tôi cũng không thể nghĩ ra một phương pháp sử dụng tiện ích shell tiêu chuẩn. Đó là lý do tại sao câu trả lời của tôi sử dụng perl.
jordanm

1
@jordanm - Những bộ óc vĩ đại. Tôi cũng đang làm việc với một giải pháp perl 8-)
slm

1

Một lựa chọn là sử dụng perl, sẽ perlcó sẵn ở mọi nơi . Thật khó để tìm thấy một hệ thống unix mà không có nó. Dưới đây là một ví dụ về cách nó có thể được tích hợp vào tập lệnh shell:

if perl -e 'use Fcntl ":mode"; exit( ((stat("file.txt"))[2] & S_IWGRP) >> 3)'; then
    echo "file is group writable"
else
    echo "file is not group witeable"
fi

perlVí dụ tương tự có thể được tìm thấy trong stat perldoc .


1

Tôi đã kết thúc ls-parsing:

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

Tôi rất biết ơn về câu trả lời mở rộng của @ slm, nhưng không có phương pháp nào khác đơn giản như vậy. Các statphương pháp sẽ yêu cầu tôi ghi ít nhất hai lời gọi khác nhau để trang trải OS X, và thậm chí sau đó nó sẽ trả về các đại diện bát phân mà tôi vẫn phải áp dụng số học. Phương thức Perl vẫn ổn nhưng yêu cầu tôi bắt đầu một trình thông dịch cho một nhiệm vụ đơn giản như vậy và tôi muốn giữ cho nó đơn giản và chỉ sử dụng các tiện ích posix.


2
Bạn đang sử dụng bash, không chỉ POSIX. Trong POSIX:perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Gilles 'SO- ngừng trở nên xấu xa'

0
FILE="filename";G=$(stat -c '%a' ${FILE} | cut -c2);
if [ $G -gt 5 ];then   echo "Group write is set on ${FILE}";fi

Tất cả các công cụ Unix / Linux tiêu chuẩn.

Tôi cho rằng đó là KHẢ NĂNG để viết nhóm, nhưng không đọc nhóm. Trong khả năng đó, nó sẽ là một tuyên bố trường hợp 2 | 3 | 6 | 7) hoặc một grep '[2 | 3 | 6 | 7]'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.