Linux에서 특정 사용자가 쓸 수 있거나 실제로 쓸 수없는 모든 파일과 디렉토리를 어떻게 찾을 수 있습니까?
편집 : 명확히하기 위해 시스템 전체가 아닌 특정 하위 디렉토리를 의미했습니다. 그리고 그렇습니다, 그것은 사용자가 쓸 수있게하는 사용자, 그룹 및 세계 쓰기의 모든 순열과 조합을 의미합니다. 나는 질문이 의미 론적으로 무엇을 의미하는지 알고 있으며, 한 명 또는 몇 명의 라이너가 이러한 파일 목록을 얻기 위해 실행하기를 바랐습니다.
Linux에서 특정 사용자가 쓸 수 있거나 실제로 쓸 수없는 모든 파일과 디렉토리를 어떻게 찾을 수 있습니까?
편집 : 명확히하기 위해 시스템 전체가 아닌 특정 하위 디렉토리를 의미했습니다. 그리고 그렇습니다, 그것은 사용자가 쓸 수있게하는 사용자, 그룹 및 세계 쓰기의 모든 순열과 조합을 의미합니다. 나는 질문이 의미 론적으로 무엇을 의미하는지 알고 있으며, 한 명 또는 몇 명의 라이너가 이러한 파일 목록을 얻기 위해 실행하기를 바랐습니다.
답변:
findutils 버전 4.3.0 이상이 설치된 경우 'find'명령을 사용하십시오.
현재 사용자가 쓸 수있는 현재 디렉토리 아래의 모든 파일 :
find . -writable
현재 디렉토리에서 현재 사용자가 쓸 수없는 모든 파일의 경우 :
find . ! -writable
매뉴얼 페이지에 따르면 :
이 테스트는 access (2) 시스템 호출을 사용하므로 많은 시스템이 클라이언트 커널에서 access (2)를 구현하므로 사용할 수 없으므로 UID 매핑 (또는 루트 스 쿼싱)을 수행하는 NFS 서버에 의해 속일 수 있습니다. 서버에 보유 된 UID 매핑 정보
2>&1 | grep -v "Permission denied"수find . -writable 2>&1 | grep -v "Permission denied"
다음 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적절하게.
이것이 정말로 당신이 묻고 싶은 질문인지 확신합니까?
"X 계정이 쓸 수있는 모든 파일을보고 싶다"는 말은 u + w로 소유 한 모든 파일, 해당 그룹이 소유 한 모든 그룹이 소유 한 모든 파일, g + w로 설정되며 모든 파일 세계에 쓰기 가능 (o + w).
쓰기 불가능한 것은 더욱 어려울 것입니다. 모든 파일의 목록을 만든 다음 쓸 수있는 파일을 제외하는 것이 좋습니다.
에디의 대답은 다음과 같습니다.
my $path = quotemeta shift;
그런 다음 이름에 공백이있는 디렉토리를 탐색합니다.
이 예제에서 -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
이것이 최선의 방법인지 확실하지 않지만 다음과 같이 요청하십시오.
for file in *
do
if [ -w $file ] ; then
echo $file
fi
done
키는 물론 -w스위치에도 있으며, 무시할 수도 있습니다.
편집 : 이것에 대해 더 많이 생각하면이 스크립트는 현재 사용자가 쓸 수있는 것을 인쇄합니다. 어떤 주어진 사용자에게는 작동하지 않을 것입니다.