개발이군고구마

PuTTY로 SSH 접속하면 서버에서 무슨 일이 일어날까 본문

SERVER/CS

PuTTY로 SSH 접속하면 서버에서 무슨 일이 일어날까

김구황 2026. 3. 27. 08:04
728x90

PuTTY는 SSH 클라이언트, bash는 명령 해석기, Linux 커널은 실제 실행 주체, 파이프는 프로세스 간 데이터 통로

 

[내 키보드]
    |
    v
[PuTTY]
  - SSH 클라이언트
  - 입력을 암호화해 전송
  - 서버 출력 화면 표시
    |
    v
~~~~~~~~~~~~~~ 네트워크 ~~~~~~~~~~~~~~
    |
    v
[sshd]
  - SSH 서버 데몬
  - 연결 수락
  - 인증 처리
  - 세션 생성
    |
    v
[로그인 셸: bash]
  - 명령 해석
  - 프로그램 실행 요청
  - 파이프/리다이렉션 구성
    |
    v
[Linux 커널]
  - 프로세스 생성/실행
  - stdin/stdout/stderr 연결
  - pipe 생성

PuTTY로 접속했을 때 bash는 왜 보일까

PuTTY를 열고 서버에 접속하면 보통 검은 화면에 명령어를 입력하게 됨.
이때 사용자는 마치 “PuTTY에서 명령을 실행”하는 느낌을 받음.
하지만 실제로는 서버 쪽에서 실행 중인 셸과 대화하는 것임.

즉,

  • PuTTY = 내 PC에서 돌아가는 SSH 클라이언트
  • bash = 서버에서 돌아가는 셸
  • 명령 실행 대상 = 서버 OS

 

stdin, stdout, stderr란 무엇인가

리눅스/유닉스 프로그램은 시작할 때 기본적으로 3개의 표준 스트림을 가짐.

0 -> stdin   : 표준 입력
1 -> stdout  : 표준 출력
2 -> stderr  : 표준 에러 출력
 

이 3개는 프로그램이 “어디서 입력을 받고, 어디로 출력할지”에 대한 기본 통로임.
C 표준 라이브러리와 POSIX 문서에서도 stdin, stdout, stderr를 기본 표준 스트림으로 정의함.

 

 

bash는 정확히 무슨 일을 하는가

bash는 사용자가 입력한 문자열을 읽고, 그 문장을 실행 가능한 형태로 바꾸는 명령 해석기임.

 

grep ssh /var/log/auth.log | tail -n 10

 

bash가 하는 일은 대략 다음과 같음.

  1. 문자열 파싱
  2. |가 있으니 파이프라인으로 인식
  3. grep 프로세스와 tail 프로세스를 실행할 준비
  4. 둘 사이에 파이프 생성
  5. grep의 stdout을 파이프 쓰기 쪽에 연결
  6. tail의 stdin을 파이프 읽기 쪽에 연결
  7. 각 프로그램 실행
  8. 종료 상태 수집

Bash 매뉴얼은 파이프라인에서 각 명령이 별도 프로세스로 실행되며, 셸이 파이프라인의 종료를 기다린다고 설명함.

 

 

| 파이프의 진짜 원리

파이프는 메모리나 커널 버퍼에 연결된 읽기/쓰기 통로임.
커널은 pipe() 시스템 콜로 파이프를 만들고, 프로세스는 그 양 끝을 파일 디스크립터처럼 다룸. dup/dup2는 한 파일 디스크립터를 다른 번호에 복제해 같은 열린 파일 설명을 가리키게 함. 이 메커니즘으로 stdout과 stdin을 원하는 대상으로 연결함

명령어:
cat file.txt | grep error

실행 구조:

[file.txt] -> [cat 프로세스] --stdout--> [pipe] --stdin--> [grep 프로세스] -> 화면