Linux의 특정 디렉토리에서 실행 파일 만 찾으려면 어떻게해야합니까?


156

Linux의 특정 디렉토리에서 실행 파일 만 찾으려면 어떻게해야합니까?


다음은 BASH 스크립트의 일종입니다. 나쁘지 않습니다 :) stackoverflow.com/a/20209457/2067125
AjayKumarBasuthkar

표준 file명령을 사용하는 것은 어떻습니까?
혁신적인

4
Mac 에서이 작업을 수행하려는 사람 (OS X 10.9.5에서 테스트) : ls -l | egrep '^[^d]..x..x..x.*$' 위는 현재 디렉토리의 모든 / 사용자 및 그룹에 대한 모든 실행 파일을 나열합니다. 참고 : -executableMac에서는 이 옵션이 작동하지 않으므로 위의 해결 방법이 있습니다.
techfoobar


1
@techfoobar : 질문이 모호합니다. 실행 코드가 포함 된 파일을 의미합니까, 아니면 실행 권한이있는 파일을 의미합니까? 그러나 (대부분의 응답이 보이는 것처럼) 실행 권한이 원하는 것으로 가정하더라도, 질문은 세계 실행 가능 이라고 말하지 않습니다 . 솔루션은 월드 실행 권한이 있지만 750 ( -rwxr-x---)이 아닌 일부 사용자가 여전히 실행할 수있는 파일 (및 fifo, 소켓, 심볼릭 링크 등)을 찾습니다 .
G-Man

답변:


157

실행 파일 검사는 (권장 -perm하지 않음) 또는 -executable(ACL을 고려하여 권장 됨) 수행 할 수 있습니다 . -executable옵션 을 사용하려면

find <dir> -executable

검색 가능한 디렉토리가 아닌 실행 파일 만 찾으려면 다음과 결합하십시오 -type f.

find <dir> -executable -type f

23
shebang이 실행 가능하다는 의미는 아닙니다. 사용할 통역사 만 알려줍니다. 리눅스 정의에 따르면 "실행 파일"은 실행 (x) 비트가 설정된 파일입니다.
knittl

2
-type에 해당 유형을 지원하는 find 버전은 무엇입니까? man find 내 시스템에서 목록 b, c, d, p, f, l, s 및 D를 찾습니다.
innaM

2
여기에서도 -type x마찬가지입니다. 내 찾기에는 하나도 없습니다 .
davr

7
실행 가능한 버전이없는 find의 구 버전 (아마 4.3.8 이전)이있는 경우 find를 사용하십시오. -perm / u = x, g = x, o = x.
Ludwig Weinzierl

8
find: invalid predicate -executable'on RHEL
SSH 이번

33

찾기 -perm옵션을 사용하십시오 . 현재 디렉토리에서 소유자, 그룹 구성원 또는 다른 사람이 실행할 수있는 파일을 찾습니다.

find . -perm /u=x,g=x,o=x

편집하다:

방금 GNU find 4.4.0에있는 다른 옵션을 찾았습니다.

find . -executable

ACL도 고려되기 때문에 더 잘 작동합니다.


2
이것은 최신 버전의 find에서만 작동합니다. CentOS와 함께 기본적으로 제공되는 것은 find: invalid mode / u = x, g = x, o = x'` 오류를 나타냅니다.
davr

12
그런 다음 GNU find : find에서 더 이상 사용되지 않는 "-perm +"버전을 사용해보십시오. -perm +111 "
innaM

-perm /111가장 휴대용 버전 인 것 같습니다 .
Scott

12

나는 그 질문에 리눅스가 특별히 언급되었다는 것을 알고 있지만 Google의 첫 번째 결과이기 때문에 내가 찾고있는 대답을 추가하고 싶었습니다 (예를 들어 당신이 현재 나와 같은 경우 고용주가 GNU 이외의 언어를 사용해야 함) / Linux 시스템).

macOS 10.12.5에서 테스트

find . -perm +111 -type f

1
RHEL 5에서도 작동합니다.
José Tomás Tocino

이것은 OS X 10.14, thx에서 작업 할 수있는 유일한 변형입니다
Justin

3

실제로 원하는 것은 실행 파일로 무언가를하는 것입니다. 실제로 찾기를 강제로 필터링하지는 않습니다.

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

-executable플랫폼에 따라 달라지기 때문에 이것을 선호합니다 . 그리고 그것은 -perm비트 비전, 비트 플랫폼에 따라 다르며 위에 쓰여진 것처럼 파일은 모든 사람 (당신뿐만 아니라)을 위해 실행 가능해야합니다.

(가) -type f*에 괜찬아 디렉토리에 이동 될 실행 가능해야하고, 쿼리의 이상이에 있기 때문에 중요하다 find명령, 더 많은 메모리 효율적인 명령이 될 것입니다.

어쨌든 * nix는 10 억 개의 접근 방식의 땅이기 때문에 또 다른 접근 방식을 제공합니다.


(0) 당신은 비전적이고 정확하거나 직관적이며 결함이있는 것을 선호합니까? 나는 올바른 것을 선호합니다. (1)  innaM의 대답은 , 특징 find -perm,이 파일을 발견 한 어떤 권한 비트 세트를 실행합니다. (2) 대조적으로,이 답변은 현재 사용자에게 실행 권한이있는 파일 만 찾습니다. 물론 OP가 원하는 것일 수도 있지만 확실하지 않습니다. … (계속)
Scott

(계속) ... (3) 명확성을 위해 다음 `…`으로 변경하고 싶을 수 있습니다. this , thisthis를$(…) 참조하십시오 . (4) 그러나하지 마십시오 ; 공백이 포함 된 파일 이름에서는 실패합니다. 대신 . (5) 쉘 변수로 작업 할 때, 특별한 이유가 없다면, 큰 따옴표로 묶고 항상 따옴표로 묶으십시오. for i in $(find …); do …find … -exec …
Scott

@ scott OK, 나는 정정되었습니다 :) 나는 -perm그중 하나가 아니라 세 가지를 모두 요구한다는 주장을 읽었 습니다. 또한 쉘 인수 보호에 대한 의견에 감사드립니다. 이것은 내가 알지 못하는 것입니다.
Mark McKenna

@MarkMcKenna 당신은 거기에 오타가 있습니다 : for i in find. -타입 f ; do [ -x $i ] && echo "$i is executable"; done; <dir> 부분이 누락되었습니다. 점 (.)을 사용합니다
Devy

2

실행 파일로 표시된 파일은 실행 파일이거나로드 가능한 파일 또는 객체 일 필요는 없습니다.

내가 사용하는 것은 다음과 같습니다.

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print

2
이것은 무엇을 하는가?
DerMike

@DerMike, .so 파일을 포함하여 현재 디렉토리에서 실행 파일을 찾는 방법 중 하나입니다. 파일이 실행 파일로 표시되어 있지 않아도 발견 할 수 있습니다.
AjayKumarBasuthkar

음, 내 말은, 어떻게 그것은 그 일을합니까?
DerMike

모든 바이너리 파일 또는 스크립트 파일에 헤더가있는 것을 발견하기 위해 파일 헤더에서 읽습니다.
AjayKumarBasuthkar

내가 아는 한 -name "*"영향을 미치지 않습니다. find일반적으로 테스트로 제거되지 않은 모든 파일을 찾습니다.
G-Man

1

한 라이너의 팬으로서 ...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

'xargs'를 사용하여 find 명령에서 출력을 가져옵니다 (공백이있는 파일 이름이 올바르게 처리되도록 print0 사용). 이제 실행 가능한 파일 목록이 있으며 'file'명령의 매개 변수로 하나씩 제공합니다. 그런 다음 이진을 무시하려면 ASCII라는 용어를 grep하십시오. find 명령에서-executable을 선호하는 스타일 (이전 답변 참조) 또는 'NIX OS에서 작동하는 방식으로 대체하십시오.

루트가 소유 한 스크립트에서 eval이있는 파일을 찾으려면 위의 내용이 필요하므로 루트 사용자가 안전하지 않은 매개 변수로 스크립트를 실행하는 개인 에스컬레이션 취약점을 찾는 데 도움이되도록 다음을 만들었습니다 ...

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &

스크립트에 ASCII가 아닌 문자가 포함되어 있으면 작동하지 않습니다. file인코딩을보고하므로 파이썬 스크립트는 로보 고 될 수 있습니다 a /usr/bin/python script, UTF-8 Unicode text executable. find ... | xargs file -b | grep -v '^ELF'비 이진을 더 잘 발견 할 수 있습니다.
xenoid

0

~/.bashrc오늘 밤에 시스템 경로가 아닌 디렉토리가 아닌 실행 파일을 찾기 위해 함수를 만들었습니다 .

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[ -x "$1" ]] && [[ ! -d "$1" ]] \
        &&  echo "executable: $1"'  _  {}
} # xlocate ()

장점은 find명령이 15 분이 걸리는 초 안에 3 개의 Linux 배포판과 Windows 설치를 검색한다는 것 입니다.

예를 들면 다음과 같습니다.

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real    0m0.504s
user    0m0.487s
sys     0m0.018s

또는 전체 디렉토리 및 모든 하위 디렉토리의 경우 :

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real    0m0.741s
user    0m0.705s
sys     0m0.032s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.