📌 문제
앞선 문제들과 비슷하게 홈 디렉터리 아래의 - 파일안에 bandit2의 비밀번호가 들어있다고 한다.
- 파일 안에 있는 비밀번호를 읽으면 된다.
이 문제를 통해 -로 시작하는 파일 읽는 방법에 대해알아보자
📌 풀이
파일을 읽는 명령어는 cat이므로 cat [ 파일 이름] 을 이용하여 내용을 읽으려고 했다.
그런데 그렇게 입력해도 계속 대기만 할 뿐 파일의 내용을 읽지 않는다. 그 이유는 파일의 이름과 관련이 있었다.
파일의 이름이 - 이다. 보통 리눅스의 명령어에서 - 다음에 옵션들을 붙여서 여러가지 기능들을 추가적으로 수행 할 수 있도록 해준다.
그래서 쉘은 cat 다음에 들어온 - 를 파일의 이름으로 읽는것이 아닌, - 옵션을 위한 특수문자로 인식하여 사용자로부터의 입력을 기다리고 있고 있던 것이다.
bandit1@bandit:~$ ls
-
bandit1@bandit:~$ cat -
^C
이러한 파일을 읽기 위한 방법은 파일의 경로를 명시적으로 지정해주거나, 절대경로를 이용하면 된다.
$ cat ./-
$ cat home/bandit1/-
아니면 cat 명령의 입력으로 - 파일을 사용한다. (입력 리다이렉션)
$ cat < -
🍪 cat [파일 이름] 과 cat < [파일 이름] 의 차이점
https://askubuntu.com/questions/1190700/what-is-the-difference-between-cat-filename-and-cat-filename
What is the difference between "cat < filename" and "cat filename"?
The simplest way to display file contents is using the cat command: cat file.txt I can get the same result using input redirection: cat < file.txt Then, what is the difference between them?
askubuntu.com
- 첫번째의 경우 cat 명령어가 직접 파일을 읽는 것이고, 두번째 명령어는 쉘이 파일을 읽고 cat에게 전달하는 것이다.
- 첫번째 명령의 경우 여러개의 파일을 읽을 수 있지만, 두번째는 한개의 파일만을 읽을 수 있다.
- cat이 파일을 읽는 경우, 파일을 읽을때 마다 새로운 파일 디스크립터를 열기 때문에 파일 디스크립터 한계에 도달하면 "Too many open files" 오류가 발생할 수 있다. 하지만 쉘이 파일을 읽는 경우에는 이미 열려있는 표준 입력을 이용하기 때문에 추가적으로 파일 디스크립터를 사용하지 않는다고 한다.
따라서 대량이 파일을 읽을때는 두번째 명령어가 파일 디스크립터의 소비가 적을 수 있다.
※ 파일 디스크립터? 열린 파일이나 입출력 자원들을 고유하게 식별하고 접근하기 위한 참조값
그리고 이러한 파일 디스크립터는 시스템 혹은 운영체제 별로 최대값이 설정되어있지만, 사용자에 따라 그 값을 바꿀 수 있다.
리눅스 오픈 가능한 파일 - Too many open files
"Too many open files" 라는 에러가 발생하였을 때의 조치 방법입니다. 리눅스는 모든 것(파일, 세션 등)을 파일로 취급합니다. 파일 디스크립터는 시스템 에서 파일이나 소켓과 같은 I/O 리소스를 참조
hunnie.co.kr
📌 정리
파일이름에 특수문자가 포함되어있어 읽혀지지 않는다면, 명시적으로 파일의 경로를 작성해주거나 절대경로를 이용하여 파일을 읽자. 또는 입력리다이렉션을 이용해보자
'OverTheWire > bandit' 카테고리의 다른 글
Bandit Level 5 → Level 6 (0) | 2025.01.11 |
---|---|
Bandit Level 4 → Level 5 (0) | 2025.01.10 |
Bandit Level 2 → Level 3 (0) | 2025.01.10 |
Bandit Level 0 → Level 1 (0) | 2025.01.10 |
Bandit Level 0 (0) | 2025.01.10 |