레벨 5를 수행하는 효율적인 방법을 찾고 있습니다. OverTheWire 밴디트 챌린지 .

어쨌든 파일이 많고 다음 기준을 준수하는 파일이 하나뿐입니다.

  • 인간 판독 가능 li>
  • 1033 바이트 크기
  • 실행 불가능

지금은 find 명령을 사용하고 있습니다. , 마지막 두 가지 기준과 일치하는 파일을 찾을 수 있습니다.

find . -size 1033c ! -executable 

하지만 사람이 읽을 수없는 파일을 제외하는 방법을 모릅니다. . 해당 문제에 대해 찾은 솔루션은 -readable 테스트 매개 변수를 사용하지만 이것이 작동하지 않는다고 생각합니다. -readable는 내용이 아닌 파일 “권한 만 확인하며, 챌린지 설명은 ASCII 파일 등을 요구합니다.

댓글

  • 인간 판독 가능 여부를 어떻게 정의합니까? 바이너리가 아닙니까?
  • 파일 명령은 친구입니다 🙂
  • 다음 항목의 중복 가능성 : stackoverflow.com/questions/14505218/ …
  • 인간은 가장 지적인 것으로 알려진 종 중 하나입니다. 그들은 또한 컴퓨터에 정통한 것으로 알려진 유일한 컴퓨터입니다. 유형을 알아 내고 암호화 된 키의 암호화 키를 확보 할 수 있다면 대부분의 파일을 읽을 수 있습니다.
  • 스포일러 경보 !!

답변

예,

를 사용하여 올바른 크기의 실행 불가능한 파일을 찾은 다음 file를 사용하여 ASCII를 확인합니다. 예 :

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII 

질문 그러나 “소리처럼 간단하지 않습니다. “인간이 읽을 수있는 것”은 끔찍하게 모호한 용어입니다. 아마도 당신은 텍스트를 의미합니다. 좋아,하지만 어떤 종류의 텍스트? 라틴 문자 ASCII 만? 완전한 유니 코드? 예를 들어 다음 세 파일을 고려하십시오.

$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo 

모두 텍스트이며 사람이 읽을 수 있습니다. 이제 file의 장점을 살펴 보겠습니다.

$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable 

그러므로 명령은 file1 만 찾습니다 (이 예에서는 파일이 1033 자라고 가정 해 보겠습니다). find를 확장하여 text :

find . -type f -size 1033c ! -executable -exec file {} + | grep -w text 

문자열을 찾을 수 있습니다.

-w를 사용하면 greptext가 다음과 같은 줄만 인쇄합니다. 독립형 단어. 원하는 내용에 반드시 가까워 야하지만 설명에 text 문자열이 포함될 수있는 다른 파일 형식이 없다고 보장 할 수 없습니다.

Answer

-exec는 주로 다음과 같은 파일로 작업을 수행하는 데 사용됩니다. 발견되면 테스트로도 사용할 수 있습니다. 따라서 다른 기준에 추가 할 수 있습니다.

find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \; 

기억하세요. grep는 패턴을 찾을 수없는 경우 0이 아닌 값을 반환하고 sh -c "COMMAND"는 평가 결과 (유효한 경우)를 반환합니다. file <filename>text (예 : “UTF-8 유니 코드 텍스트`또는”ASCII 텍스트 “)로 끝나는 내용을 뱉어내는 파일 만 인쇄하지만 “비 ISO 확장 ASCII 텍스트, 이스케이프 시퀀스 포함”이 아닙니다.

한 줄로 보면 xargs를 넘어가는 것보다 더 짧아집니다.

p>

find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \; 

Keep i sh -c "file {} | grep "text$""를 사용자 지정 명령으로 바꿀 수 있습니다. 매우 복잡한 것을 확인하려면 셸 스크립트를 제공하고 대신 사용하는 것이 좋습니다.

find . -size 1033c -not -executable -exec is_human_readable.sh {} \; 

실행하면 셸의 기록보다 유지 관리가 더 쉽습니다.

#!/bin/sh file "$@" | grep "text$" > /dev/null 

댓글

  • 좋습니다! 그러나 일치하는 text$는 쉘 스크립트로 인식되는 항목을 제외합니다. shebang이있는 모든 항목은 스크립트로 식별되며 완벽하게 사람이 읽을 수 있습니다.
  • @terdon은 사실이지만 스크립트는 실행 가능한 경향이 있습니다. 즉, 적절한 스크립트는 PDF도 인식해야합니다. 반면에 사람이 읽을 수있는 이미지를 포함하는 PDF입니까? PNG입니까? 읽을 수있는 텍스트의 일부입니까? 아마도. 완전한 테스트는 어려울 것 같습니다.

답변

다음 만 사용하면됩니다.

find inhere -size 1033c 

비밀번호가 포함 된 유일한 파일을 제공합니다.

댓글

  • + 1033c가 더 많은 파일을 반환하는 이유는 무엇입니까? 더 크거나 같음 기호와 같은가요?

답변

find . -size 1033c ! -executable -exec file {} + 

답변

디렉토리의 내용에 대해 다음을 실행하십시오.

$ file -- * -file00: data -file01: data -file02: data -file03: data -file04: data -file05: data -file06: data -file07: ASCII text -file08: data -file09: data $ cat -- \-file07 <output> 

답변

크기가 1033 바이트 인 파일은 1 개뿐입니다.

bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$ 

1033가 아닌 1033c입니까? man 페이지

 -size n[cwbkMG] File uses n units of space, rounding up. The following suffixes can be used: `b" for 512-byte blocks (this is the default if no suffix is used) `c" for bytes `w" for two-byte words `k" for Kilobytes (units of 1024 bytes) `M" for Megabytes (units of 1048576 bytes) `G" for Gigabytes (units of 1073741824 bytes) 

ls -lfile 명령으로 확인하면 모든 답을 얻을 수 있습니다.

bandit5@bandit:~$ ls -l ./inhere/maybehere07/.file2 -rw-r----- 1 root bandit5 1033 May 7 20:15 ./inhere/maybehere07/.file2 bandit5@bandit:~$ bandit5@bandit:~$ file ./inhere/maybehere07/.file2 ./inhere/maybehere07/.file2: ASCII text, with very long lines bandit5@bandit:~$ 
  1. 사람이 읽을 수있는 (ASCII text)
  2. 1033 바이트 크기 (ls -l 출력)
  3. 실행 불가 (-rw-r-----)

답변

find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}" 

이 조합 된 명령을 시도해보세요. 내 방송국에서 작동합니다.

답변

해볼 수 있습니다.

find . -size 1033c ! -executable -exec file {} + 

귀하의 도전은 grep를 허용하지 않습니다. 암호 파일은 “ASCII 텍스트, 매우 긴 줄”로보고됩니다.

답변

사람이 읽을 수있는 파일 이름, [:print:] ( 인쇄 가능 ) 문자 클래스

이름. 이러한 클래스에 대한 자세한 내용은 grep 설명서에서 찾을 수 있습니다.

find . -type f -size 1033c -name "[[:print:]]*" ! -executable 

다시 생각해 보겠습니다. , “사람이 읽을 수있는”요구 사항은 이름 대신 파일의 내용을 참조 할 수 있습니다. 즉, 텍스트 파일을 검색하게됩니다. 이는 조금 더 까다로울 수 있습니다. D_Bye가 의견에서 제안한 경우 file 명령을 사용하여 파일 내용 유형을 결정해야합니다. 그러나 file는 파일 이름을 표시하는 작업을 복잡하게 만들기 때문에 파이프 뒤에 있습니다. 제가 제안하는 내용은 다음과 같습니다.

find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print 

file 부분이 작동하는 방식에 대한 간략한 설명입니다.

  • -exec 조건자는 sh -c "file -b $0 | grep -q text" FILENAMEFILENAME에 대해 이전 조건 (유형, 크기, 실행 불가능)을 모두 충족합니다.
  • 각 파일에 대해 , 셸 (sh)은 다음 짧은 스크립트 를 실행합니다. file -b $0 | grep -q text, $0를 파일 이름으로 바꿉니다.
  • file 프로그램은 각 파일의 콘텐츠 유형을 결정하고이 정보를 출력합니다. -b 옵션은 테스트 된 각 파일의 이름입니다.
  • grep 필터

프로그램, “text”가 포함 된 행을 검색합니다. (file명령의 일반적인 출력이 어떻게 보이는지 직접 확인해보십시오.)

  • 그러나 grep는 그렇지 않습니다. -q (자동) 옵션이 있으므로 필터링 된 텍스트를 출력합니다. . 그것이하는 일은 종료 상태 0 ( “true”를 나타냄-필터링 된 텍스트가 발견됨) 또는 1 ( “오류를 의미 함)으로 변경하는 것입니다. “-“text “ 텍스트가 file의 출력에 나타나지 않았습니다.
  • 다음에서 오는 참 / 거짓 종료 상태 grepsh에 의해 find에 더 전달되고 전체의 최종 결과로 작동합니다. “-exec sh -c "file $0 | grep -q text" {} \;“테스트.
  • 위 테스트가 true 를 반환 한 경우 -print 명령이 실행됩니다 (즉, 테스트 된 파일의 이름이 인쇄 됨).
  • Answer

    bandit4@bandit:~$ ls inhere bandit4@bandit:~$ file inhere/* inhere/-file00: data inhere/-file01: data inhere/-file02: data inhere/-file03: data inhere/-file04: data inhere/-file05: data inhere/-file06: data inhere/-file07: ASCII text inhere/-file08: data inhere/-file09: data bandit4@bandit:~$ pwd /home/bandit4 bandit4@bandit:~$ cat /home/bandit4/inhere/-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh bandit4@bandit:~$ 

    댓글

    • 파일 inhere / * 및 cat / home / bandit4 / inhere / -file07

    답변

    find -type f ! -executable -size 1033c 

    실습에서 파일을 가져옵니다.

    답변

    find . -type f -size 1033c ! -executable | xargs file | grep text 

    1 라이너 팬

    답변

    나는 find와 grep을 사용하여 위에서 언급 한이 도적 수준의 암호를 찾는 더 긴 방법이 가장 설명적인 명령이라고 생각합니다.

    find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

    하지만 “file”명령을 사용한 후에는 전체 디렉토리 파일 유형을 확인하여 사람이 읽을 수있는 파일 (이 수준에서는 ASCII라고도 함)을 찾기가 매우 쉽다는 것을 깨달았습니다.inhere 디렉토리는 이름이 “-filexx”인 파일을 보유하거나 file ./*

    를 사용하여 전체 inhere 디렉토리를 신속하게 확인합니다.

    다음은 내 접근 방식입니다.

    bandit4@bandit:~/inhere$ file ./* ./-file00: data ./-file01: data ./-file02: data ./-file03: data ./-file04: data ./-file05: data ./-file06: data ./-file07: ASCII text ./-file08: data ./-file09: data bandit4@bandit:~/inhere$ cat ./-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh 

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다