UNIX 명령-찾기


9

저는 UNIX 명령을 배우려고 노력 중이며 배우기 위해이 게임을하고 있습니다. 나는 ssh를 통해 서버에 있고 디렉토리는 임의의 파일과 폴더로 가득 차 있으며 다음 레벨의 비밀번호는 파일 중 하나 안에 있습니다. 파일에 다음과 같은 특징이 있다고 들었습니다.

  • 인간이 읽을 수있는
  • 1033 바이트
  • 비 실행

나는 find명령을 사용해야한다고 생각하고 시도 find ! -executable했지만 많은 파일을 반환했습니다. 매뉴얼이나 온라인에서 찾을 수있는 사람이 읽을 수있는 유일한 도움말은 사람이 읽을 수있는 파일 크기를 인쇄하는 것입니다. 그래서 나는 거기서 조금 길을 잃었습니까?

또한 나는 시도 find ~ -size 1033b했지만 아무것도 반환하지 않았습니다. 그러나 시도했을 때 find ~ -size -1033b디렉토리의 모든 파일을 반환했습니다.


이 게임에 대해 더 알고 싶습니다!
ivanivan 2016 년

2
@ivanivan bandit.overthewire.org
avgvstvs

답변:


16

사람이 읽을 수있는 파일 이름을 필터링하기 위해 [: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-part의 작동 방식입니다.

  • -exec술어가 실행 sh -c 'file -b $0 | grep -q text' FILENAME각각 FILENAME만족 이전의 모든 조건 (종류, 사이즈, 비 실행).
  • 그 파일 각각에 대해, 쉘은 ( sh)이 짧은 실행 스크립트를 : file -b $0 | grep -q text, 대체 $0파일 이름으로.
  • 그만큼 file프로그램은 각각의 파일의 콘텐츠 타입을 결정하고,이 정보를 출력한다. 이 -b옵션은 테스트 된 각 파일의 이름을 인쇄하지 못하게합니다.
  • grep 출력을 필터링합니다. file"text"가 포함 된 행을 검색하여 프로그램에서 . (일반적인 file명령 출력 결과를 참조하십시오 .)
  • 그러나 (quiet) 옵션이 제공 grep되므로 필터링 된 텍스트를 출력하지 않습니다 -q. 그것이하는 것은 종료 상태를 변경하는 것입니다. 중 하나에 0( "true"로 표현 - 필터링 된 텍스트가 발견되었다) 또는 1 (- 텍스트 "오류"를 의미하는 "텍스트" 의 출력에 표시되지 않았다 file).
  • 에서 나오는 참 / 거짓 종료 상태 grep 로 더 전달 shfind전체 "의 최종 결과의 역할을 -exec sh -c 'file $0 | grep -q text' {} \;"테스트.
  • 경우에는 위의 테스트는 반환 사실 , -print(즉, 테스트 파일의 이름이 인쇄되어 있습니다) 명령이 실행됩니다.

나는 이것이 오래되었다는 것을 알고 있지만 사용 find . -type f -size 1033c하면 정확히 동일한 응답을 반환 한다고 덧붙이고 싶습니다 .
Brandon Benefield 21시 44 분

8
find . -type f -readable -size 1033c ! -executable

파일 크기 c대신 사용 했습니다 b. b512 바이트 블록입니다. c실제 바이트입니다.


2
나는 -readable사람이 읽을 수있는 (즉, 이진이 아닌) 의미를 생각하지 않습니다
hhaamu

1
@hhaamu-맞습니다. 그러나 사용자가 읽을 권한이없는 파일을 필터링하는 것은 나쁘지 않습니다! 파일은 사람이 읽을 수있는 내용이 포함되어 있는지 확인하기 위해, 파이프 이름에 의해 반환 findfile.
D_Bye

2

내가 쓴 것은 다음과 같습니다.

find -size 1033c ! -executable

파일을 얻었습니다. 분명히 사람이 읽을 수있는 부분은 당신을 버리는 것이 었습니다.


0
find . -readable -size 1033c \! -executable

-readable은 계정에서 파일을 읽을 수 있음을 의미하므로 반드시 사람이 읽을 수있는 것은 아닙니다.
Anthon

0

나는 게임을 생각하지만 올바른 구문은 다음과 같습니다.

file ./* 

각 파일이 구성된 것을 나열한 리턴을 얻습니다. 그것은 당신이 Bandit 게임에서 달성하려는 것에 정말 효과적이었습니다. 이 작업의 실제 곡선은 각 파일이-(하이픈)으로 시작한다는 것입니다.


이 명령에 하이픈을 추가하여이를 개선 할 수 file ./-*있습니다.
ConstantFun

0

나는 이것이 3 가지 조건 모두를 포괄하는 가장 실제적인 대답이라고 생각합니다.

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

그러나 많은 사람들이 말했듯이 실행 파일과 사람이 읽을 수있는 것은 우리를 버려야했습니다.

find inhere/ -type f -size 1033c 

꽤 충분합니다!

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