특정 사용자가 쓸 수있는 모든 파일과 디렉토리를 찾으려면 어떻게합니까?


10

Linux에서 특정 사용자가 쓸 수 있거나 실제로 쓸 수없는 모든 파일과 디렉토리를 어떻게 찾을 수 있습니까?

편집 : 명확히하기 위해 시스템 전체가 아닌 특정 하위 디렉토리를 의미했습니다. 그리고 그렇습니다, 그것은 사용자가 쓸 수있게하는 사용자, 그룹 및 세계 쓰기의 모든 순열과 조합을 의미합니다. 나는 질문이 의미 론적으로 무엇을 의미하는지 알고 있으며, 한 명 또는 몇 명의 라이너가 이러한 파일 목록을 얻기 위해 실행하기를 바랐습니다.


좋아요, 답변 해 주셔서 감사합니다. 이미 Google을 통해 "찾기"솔루션을 찾았지만 특정 사용자에게 일반적으로 적용 할 수있는 방법이 있는지 궁금했습니다. 다른 사람이없는 한 사용자로 su를 사용하고 find 명령을 실행하는 것 외에 다른 방법이없는 것 같습니다. 내일은 오 피디 언의 대답을 받아 들여 더 나은 반응을 보이지 않을 것입니다.
Pistos 2016 년

답변:


18

findutils 버전 4.3.0 이상이 설치된 경우 'find'명령을 사용하십시오.

현재 사용자가 쓸 수있는 현재 디렉토리 아래의 모든 파일 :

find . -writable

현재 디렉토리에서 현재 사용자가 쓸 수없는 모든 파일의 경우 :

find . ! -writable

매뉴얼 페이지에 따르면 :

이 테스트는 access (2) 시스템 호출을 사용하므로 많은 시스템이 클라이언트 커널에서 access (2)를 구현하므로 사용할 수 없으므로 UID 매핑 (또는 루트 스 쿼싱)을 수행하는 NFS 서버에 의해 속일 수 있습니다. 서버에 보유 된 UID 매핑 정보


4
추가 교육에 대해 언급 할 것이라고 생각했습니다. 실제로 로그인 셸이없는 사용자 (/ sbin / nologin)와 함께이 작업을 수행해야했습니다. 그렇게하기 위해 다음과 같이 sudo를 사용했습니다 : sudo -u nobody find. ! -writable
Pistos

이것은 질문에 대한 답변이 아니므로 허용되는 답변이되어서는 안됩니다. 문제는 "현재 사용자"가 아니라 "특정 사용자"에 관한 것이 었습니다.
jlh

그리고 거부 오류가 추가 허가를 숨길 2>&1 | grep -v "Permission denied"find . -writable 2>&1 | grep -v "Permission denied"
iolsmit

3

다음 writable.pl과 같이 Perl 스크립트 ( )를 만들 수 있습니다 .

#!/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]);

다음과 같이이 스크립트를 루트로 사용하십시오.

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

에 충전 USERNAME하고 DIRECTORY적절하게.


우수한. 감사합니다. CentOS 6.2의 bash 쉘에서 $ ARGV [0]이 비어있는 것으로 간주됩니다. 이유가 확실하지 않습니다. 파일에서 읽도록 스크립트를 수정했습니다.
doon

1

이것이 정말로 당신이 묻고 싶은 질문인지 확신합니까?

"X 계정이 쓸 수있는 모든 파일을보고 싶다"는 말은 u + w로 소유 한 모든 파일, 해당 그룹이 소유 한 모든 그룹이 소유 한 모든 파일, g + w로 설정되며 모든 파일 세계에 쓰기 가능 (o + w).

쓰기 불가능한 것은 더욱 어려울 것입니다. 모든 파일의 목록을 만든 다음 쓸 수있는 파일을 제외하는 것이 좋습니다.


3
물론 시스템에 ACL이 활성화되어 있으면 훨씬 더 복잡합니다.
Zoredache 2016 년

2
chattr + i 파일을 세지 않음
Matt Simmons

1

에디의 대답은 다음과 같습니다.

my $path = quotemeta shift;

그런 다음 이름에 공백이있는 디렉토리를 탐색합니다.


1

이 예제에서 -perm 플래그에 gnu find 구문을 사용합니다.

기본적으로 ACL과 같은 엉뚱한 확장을 포기하면 소유자, 그룹 및 "기타"쓰기 액세스의 3 가지 선택이 있습니다. 루프 작업처럼 들립니다.

이것을 최적화 할 충분한 공간이 있지만 다른 사람에게 맡길 것입니다 ... 또한 파일 시스템 찾기 및 교차와 그와 같은 말도 안되는 모든 세부 사항을 기억할 수는 없습니다. 또한 그룹의 출력이 테스트 Linux 시스템과 동일한 지 확인하십시오.

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

이것은 사용자가 쓰기 가능한 파일을 찾는 방법에 대한 대략적인 예입니다. 이것은 모든 사용자로 실행될 때, 비 uid0 사용자로 실행할 경우 스크립트를 실행하는 사용자가 읽기 및 실행 권한을 가진 디렉토리에만있는 것을 찾을 수 있습니다.

#!/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

이 명령은 쓰기 가능한 모든 디렉토리를 찾아야하며 권한에 따라 권한을 변경할 수 있습니다.

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

0

이것이 최선의 방법인지 확실하지 않지만 다음과 같이 요청하십시오.

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

키는 물론 -w스위치에도 있으며, 무시할 수도 있습니다.

편집 : 이것에 대해 더 많이 생각하면이 스크립트는 현재 사용자가 쓸 수있는 것을 인쇄합니다. 어떤 주어진 사용자에게는 작동하지 않을 것입니다.


물론이 스크립트를 해당 사용자로 실행해야합니다.
Eddie

그래, 생각 ...
슬라 티 바트 패스트

이것을 펄로 어떻게 쓰시겠습니까?
ealeon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.