Làm cách nào để tìm tất cả các tệp và thư mục có thể ghi được bởi một người dùng cụ thể?


10

Trong Linux, làm cách nào tôi có thể tìm thấy tất cả các tệp và thư mục có thể ghi (hoặc, thực tế, không thể ghi) bởi một người dùng cụ thể?

Chỉnh sửa: Để làm rõ, tôi có nghĩa là theo một tiểu thư cụ thể, không phải trên toàn hệ thống. Và vâng, điều đó có nghĩa là tất cả các hoán vị và kết hợp của khả năng ghi của người dùng, nhóm và thế giới sẽ cho phép người dùng đó viết. Tôi biết những gì câu hỏi đòi hỏi về mặt ngữ nghĩa, tôi đã hy vọng một hoặc một vài lớp lót được thực thi để có được một danh sách các tệp này.


Được rồi, cảm ơn mọi người vì câu trả lời. Tôi đã tìm thấy giải pháp "tìm" qua google, nhưng tự hỏi liệu có cách nào để áp dụng chung cho một người dùng nhất định không. Có vẻ như không có cách nào khác ngoài việc su là người dùng, sau đó chạy lệnh find - trừ khi có ai khác bấm chuông? Tôi sẽ chấp nhận câu trả lời của Ophidian vào một ngày nào đó để chặn mọi phản hồi tốt hơn.
Pistos

Câu trả lời:


18

Sử dụng lệnh 'find' nếu bạn đã cài đặt phiên bản 4.3.0 trở lên:

Đối với tất cả các tệp trong thư mục hiện tại có thể ghi được bởi người dùng hiện tại:

find . -writable

Đối với tất cả các tệp trong thư mục hiện tại mà người dùng hiện tại không thể ghi được:

find . ! -writable

Theo trang người đàn ông:

Thử nghiệm này sử dụng lệnh gọi hệ thống truy cập (2) và do đó có thể bị lừa bởi các máy chủ NFS thực hiện ánh xạ UID (hoặc xóa gốc), vì nhiều hệ thống thực hiện truy cập (2) trong nhân của máy khách và do đó không thể sử dụng thông tin ánh xạ UID được giữ trên máy chủ.


4
Chỉ cần nghĩ rằng tôi sẽ đề cập đến việc chỉnh sửa thêm: Tôi thực sự phải làm điều này với một người dùng không có vỏ đăng nhập (/ sbin / nologin). Để làm điều đó, tôi đã sử dụng sudo, như thế này: sudo -u không ai tìm thấy. ! -writable
Pistos

Điều này không trả lời câu hỏi và do đó không nên là câu trả lời được chấp nhận. Câu hỏi là về "một người dùng cụ thể", không phải về "người dùng hiện tại".
jlh

và để ẩn sự cho phép từ chối các lỗi được thêm 2>&1 | grep -v "Permission denied"vàofind . -writable 2>&1 | grep -v "Permission denied"
iolsmit

3

Bạn có thể tạo tập lệnh Perl ( writable.pl) như thế này:

#!/usr/bin/perl

use strict;

sub recurse {
  my $path = shift;
  my @files = glob "$path/{*,.*}";
  for my $file (@files) {
    if (-d $file) {
      if ($file !~ /\/\.$/ && $file !~ /\/\.\.$/) {
        recurse($file);
      }
    } else {
      print "$file\n" if -w $file;
    }
  }
}

print "Writable files for " . getlogin() . "\n";
recurse($ARGV[0]);

và sau đó sử dụng tập lệnh này, như root, như sau:

su USERNAME -c "./writable.pl DIRECTORY"

điền vào USERNAMEDIRECTORYkhi thích hợp.


Thông minh. Cảm ơn bạn. $ ARGV [0] được lấy dưới dạng rỗng trong bash shell trên CentOS 6.2. Không chắc chắn lý do tại sao. Tôi đã sửa đổi tập lệnh để đọc từ một tập tin.
doon

1

Bạn có chắc chắn đó thực sự là câu hỏi mà bạn muốn được hỏi?

Để nói "Tôi muốn xem tất cả các tệp mà tài khoản X có thể ghi vào" có nghĩa là mọi tệp do họ sở hữu với u + w, mọi tệp thuộc sở hữu của bất kỳ nhóm nào họ thuộc về đó đều đặt g + w và mọi thế giới tệp có thể ghi được (o + w).

Không thể ghi sẽ còn khó hơn. Tốt hơn hết là bạn nên lập danh sách mọi tệp, sau đó loại trừ những tệp mà họ có thể ghi vào.


3
Tất nhiên thậm chí còn phức tạp hơn nếu hệ thống có bật ACL.
Zoredache

2
Không tính các tệp chattr + i
Matt Simmons

1

Đối với câu trả lời của Eddie nếu bạn ném vào:

my $path = quotemeta shift;

Sau đó, nó sẽ đi qua các thư mục với không gian trong tên của họ là tốt.


1

Tôi sẽ sử dụng cú pháp tìm kiếm gnu cho cờ -perm trong ví dụ này:

Về cơ bản - nếu bạn loại bỏ các tiện ích mở rộng kỳ quặc như ACL, bạn đã có 3 chocies - chủ sở hữu, nhóm và quyền truy cập ghi "khác". Âm thanh như một công việc cho một vòng lặp.

Có rất nhiều chỗ để tối ưu hóa điều này nhưng tôi sẽ để nó cho người khác ... Ngoài ra, tôi không bao giờ có thể nhớ tất cả các chi tiết tìm và vượt qua các hệ thống tập tin và những thứ vô nghĩa đó. Ngoài ra, hãy đảm bảo đầu ra của các nhóm giống như trên hệ thống linux thử nghiệm của tôi

$ groups snoopy
snoopy : snoopy doghouse linus admin wwI woodstock
$

Đây là một ví dụ sơ bộ về cách bạn tìm thấy các tệp có thể ghi được bởi người dùng. Điều này sẽ khi chạy như bất kỳ người dùng nào, nhưng nếu bạn chạy nó với tư cách là người dùng không phải là uid0, bạn sẽ chỉ tìm thấy những thứ trong thư mục mà người dùng đang chạy tập lệnh có cả quyền đọc và thực thi.

#!/bin/sh

user=snoopy

directory=/

# first files owned by the user and writable
find "$directory" -follow -user "$user" -perm /u+w 2> /dev/null


# now for files that are group writable with the user in that group
for groups in $(groups snoopy 2> /dev/null | cut -f2 -d:)
do
  find "$directory" -follow -group "$user" -perm /g+w 2> /dev/null
done

# now for everything else
find "$directory" -follow -perm /o+w 2> /dev/null

1

Lệnh này sẽ tìm tất cả các thư mục có thể ghi, bạn có thể thay đổi các quyền khi bạn thấy phù hợp:

find / -type d \( -perm -g+w -or -perm -o+w \) -exec ls -adl {} \;

0

Tôi không chắc đây có phải là cách tốt nhất không, nhưng nên làm theo những gì bạn yêu cầu:

for file in *
do 
    if [ -w $file ] ; then 
        echo $file
    fi
done

Tất nhiên là khóa trong -wchuyển đổi, cũng có thể bị từ chối

EDIT: Suy nghĩ nhiều hơn về điều này, tập lệnh này in ra những gì có thể ghi được bởi người dùng hiện tại, rõ ràng nó sẽ không hoạt động đối với một số người dùng nhất định.


Tất nhiên, bạn phải chạy tập lệnh này với tư cách là người dùng đó.
Eddie

vâng, hình ...
Slartibartfast

Làm thế nào bạn sẽ viết điều này trong perl?
Phục sinh
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.