Python을 활용한 POSIX 스타일 TTY 제어 개요
Python의 termios 모듈은 POSIX 시스템에서 TTY(터미널) 입출력을 제어할 수 있는 인터페이스를 제공합니다. 이 모듈은 Unix 계열 운영체제에서만 사용 가능하며, Windows 환경에서는 지원되지 않습니다.
termios 모듈을 사용하려면 먼저 임포트해야 합니다.
import termios
이 모듈의 모든 메서드는 파일 디스크립터(file descriptor)를 인자로 받습니다. 주요 메서드들을 하나씩 자세히 살펴보겠습니다.
1. termios.tcgetattr(fd)
지정된 파일 디스크립터에 대한 TTY 속성 목록을 반환합니다. 반환되는 속성은 다음과 같습니다.
- iflag — 입력 플래그
- oflag — 출력 플래그
- cflag — 제어 플래그
- lflag — 로컬 플래그
- ispeed — 입력 속도
- ospeed — 출력 속도
- cc — 특수 제어 문자
2. termios.tcsetattr(fd, when, attributes)
속성 목록을 사용해 터미널 속성을 설정하는 메서드입니다. 두 번째 인자인 when은 속성이 언제 변경될지를 결정하며, 아래 상수 중 하나를 사용합니다.
| 번호 | 상수 및 의미 |
|---|---|
| 1 | TCSANOW 즉시 속성을 변경합니다. |
| 2 | TCSADRAIN 대기 중인 모든 출력이 전송된 후 속성을 변경합니다. |
| 3 | TCSAFLUSH 대기 중인 모든 출력을 전송하고, 대기 중인 모든 입력을 버린 후 속성을 변경합니다. |
3. termios.tcsendbreak(fd, duration)
파일 디스크립터에 브레이크(break) 신호를 전송합니다. duration 값이 0이면 약 0.25~0.5초 동안 브레이크 신호를 보냅니다.
4. termios.tcdrain(fd)
파일 디스크립터에 기록된 모든 출력이 전송될 때까지 대기하는 메서드입니다.
5. termios.tcflush(fd, queue)
파일 디스크립터의 큐(queue) 데이터를 삭제합니다. queue 선택자를 통해 어떤 큐를 처리할지 지정할 수 있습니다.
- TCIFLUSH — 입력 큐 삭제
- TCOFLUSH — 출력 큐 삭제
- TCIOFLUSH — 입력 큐와 출력 큐 모두 삭제
실전 예제: 비밀번호 입력 시 에코(Echo) 비활성화하기
다음 예제는 termios 모듈을 활용해 비밀번호를 입력받을 때 화면에 문자가 그대로 노출되지 않도록 에코를 비활성화하는 실용적인 코드입니다.
import termios, sys
def get_password(prompt="Enter Password: "):
file_desc = sys.stdin.fileno()
old_pass = termios.tcgetattr(file_desc)
new_pass = termios.tcgetattr(file_desc)
new_pass[3] &= ~termios.ECHO
try:
termios.tcsetattr(file_desc, termios.TCSADRAIN, new_pass)
password = input(prompt)
finally:
termios.tcsetattr(file_desc, termios.TCSADRAIN, old_pass)
return password
코드 동작 원리: 먼저 현재 터미널 속성을 백업한 뒤, lflag에서 ECHO 비트를 제거한 새 속성을 생성합니다. TCSADRAIN 옵션으로 속성을 적용하면 비밀번호 입력 내용이 화면에 표시되지 않으며, finally 블록에서 반드시 원래 속성을 복원해 안전하게 마무리됩니다.
실행 결과
$ python3 example.py
Enter Password:
Entered Password: my_password