들어가기
이전 시간에는 Rocky Linux를 VMware 가상머신에 설치했습니다.
이번 시간에는 리눅스를 사용할 때 가장 많이 마주치는 커맨드라인(Command Line) 환경에 대해 알아보고,
SSH를 통해 서버에 접속하는 방법부터 기본 명령어 사용 패턴까지 익혀보겠습니다.
커맨드라인이란? (Command Line)
커맨드라인(Command Line)은 운영체제에 문자 기반 명령을 전달하는 인터페이스입니다.
리눅스에서는 이 방식을 통해 커널과 보다 직접적으로 상호작용하게 됩니다.
우리가 일반적으로 익숙한 인터페이스는 두 종류로 나뉩니다.
| 구분 | 풀네임 | 특징 | 주 사용 환경 |
|---|---|---|---|
| GUI | Graphical User Interface | 마우스로 클릭하는 시각적 인터페이스 | Windows, macOS |
| CUI / CLI | Character(Command) User Interface | 키보드로 명령어를 입력하는 텍스트 인터페이스 | Linux 서버 환경 |
물론 두 운영체제 모두 GUI와 CUI를 지원하지만, 리눅스 서버 환경에서는 GUI가 없는 경우가 대부분입니다.
그 이유는 간단합니다. GUI는 화면을 렌더링하는 데 추가적인 CPU와 메모리를 소비합니다.
서버처럼 24시간 돌아가야 하는 환경에서는 그 자원을 낭비할 이유가 없으니까요.
처음에는 어색하게 느껴지겠지만, 조금만 익숙해지면 GUI보다 오히려 빠르고 강력하다는 것을 느끼게 됩니다.
리눅스를 잘 다룬다는 것은 결국 커맨드라인을 잘 다룬다는 것과 동의어입니다.
SSH를 이용한 리눅스 서버 접근
SSH란?
SSH(Secure Shell)는 네트워크를 통해 원격 서버에 안전하게 접속하기 위한 프로토콜입니다.
이름에 "Secure"가 붙은 이유는 통신 내용이 암호화되기 때문입니다.
SSH 이전에는 Telnet이라는 원격 접속 프로토콜이 있었는데, Telnet은 데이터를 평문(Plain Text)으로 전송했습니다.
즉, 중간에 네트워크를 감청하면 로그인 정보가 그대로 노출되었습니다.
SSH는 이 문제를 해결하기 위해 1995년에 등장했으며, 현재 리눅스 서버 접속의 사실상 표준입니다.
SSH의 동작 방식을 간략하게 정리하면 아래와 같습니다.
plain[내 컴퓨터 (클라이언트)]
↓ 명령 입력
[SSH 클라이언트] → 암호화 → [네트워크] → 복호화 → [SSH 서버 (sshd)]
↓
[리눅스 쉘 실행]
↓
결과를 다시 암호화하여 반환
기본 포트는 22번을 사용하며, 보안을 위해 다른 포트로 변경하는 경우도 많습니다.
SSH 클라이언트 설치 여부 확인
Windows와 macOS 최신 버전에는 기본적으로 SSH 클라이언트가 내장되어 있습니다.
Windows는 PowerShell 또는 cmd를, macOS는 터미널을 열어 아래 명령어를 실행해봅니다.
bash$ ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address]
[-c cipher_spec] [-D [bind_address:]port] [-E log_file]
[-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file]
[-J destination] [-L address] [-l login_name] [-m mac_spec]
[-O ctl_cmd] [-o option] [-P tag] [-p port] [-R address]
[-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
destination [command [argument ...]]
ssh [-Q query_option]
위와 같이 사용법(usage)이 출력되면 정상입니다.
설치가 안 되어 있다면 command not found 오류가 출력되며, 이 경우 구글에서 OS에 맞는 설치 방법을 검색해 진행하면 됩니다.
가상머신 IP 주소 확인
SSH로 접속하려면 먼저 접속 대상 서버의 IP 주소를 알아야 합니다.
가상머신 콘솔에서 아래 명령어를 입력합니다.
baship addr
또는 간단히:
baship a

출력 내용 중 enp2s0(또는 ens33, eth0 등 환경마다 이름이 다를 수 있습니다) 아래의 inet 항목에 표시된 것이 서버의 IP 주소입니다.
위 예시에서는 172.16.101.128이 가상머신의 IP 주소입니다.
lo(Loopback) 인터페이스의 IP인127.0.0.1은 서버 자기 자신을 가리키는 주소로, 외부에서는 접근할 수 없습니다.
SSH 접속에는enp2s0처럼 실제 네트워크 인터페이스의 IP를 사용해야 합니다.
SSH로 서버 접속
IP 주소를 확인했으면 로컬 컴퓨터(호스트)의 터미널에서 아래 명령어로 접속합니다.
bashssh 사용자명@IP주소
예시:
bash$ ssh user@172.16.101.128
The authenticity of host '172.16.101.128 (172.16.101.128)' can't be established.
ED25519 key fingerprint is SHA256:a96g9Fu12mnZjdX58+mwzBYcynjRwuYZ5AcZBoSZAaY.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.16.101.128' (ED25519) to the list of known hosts.
user@172.16.101.128's password:
Last login: Sun Jan 25 19:10:56 2026 from 172.16.101.1
[user@localhost ~]$
처음 접속하는 서버에서는 위와 같은 경고 메시지가 나타납니다.
이것은 "이 서버의 신원을 확인할 수 없는데, 신뢰하고 계속 접속하겠습니까?"라는 의미입니다.
yes입력 → 서버의 키를~/.ssh/known_hosts파일에 저장하고 접속 진행no입력 → 접속 중단
같은 서버에 다시 접속할 때는 저장된 키와 대조하여 확인하므로 이 메시지가 나타나지 않습니다.
반대로 서버를 재설치했는데 같은 IP에서 이 경고가 다시 나타난다면, 서버 키가 바뀐 것이므로 주의가 필요합니다.
yes를 입력하고 비밀번호를 입력하면 접속이 완료됩니다.
비밀번호는 입력해도 화면에 표시되지 않습니다. 이는 보안을 위한 정상 동작입니다.
자주 쓰는 SSH 옵션
bashssh -p 2222 user@192.168.1.100 # 포트를 22가 아닌 2222로 지정 ssh -i ~/.ssh/my_key user@host # 비밀번호 대신 키 파일로 인증 ssh -v user@host # 접속 과정 상세 출력 (디버깅에 유용)
쉘 프롬프트 읽기
접속에 성공하면 아래와 같은 프롬프트가 표시됩니다.
plain[user@localhost ~]$
이 프롬프트는 단순한 입력 대기 표시가 아니라, 현재 상태를 알려주는 정보를 담고 있습니다.
| 구성 요소 | 의미 |
|---|---|
user |
현재 로그인한 사용자명 |
localhost |
현재 접속한 서버의 호스트명 |
~ |
현재 위치한 디렉토리 (~는 홈 디렉토리를 의미) |
$ |
일반 사용자로 로그인 중 (root라면 #으로 표시) |
예를 들어 프롬프트가 [root@webserver /etc]# 라면:
root계정으로webserver라는 서버에/etc디렉토리에서- 관리자 권한으로 작업 중
이라는 것을 한눈에 파악할 수 있습니다.
tty 명령어 — 어떤 터미널에서 작업 중인지 확인
SSH로 접속하는 데 성공했다면, 이제 현재 작업 중인 터미널의 정체를 확인해봅니다.
명령어: tty
bash[user@localhost ~]$ tty
/dev/pts/0
tty 명령어는 현재 세션이 연결된 터미널 디바이스 경로를 출력합니다.
SSH로 접속했다면 /dev/pts/숫자 형태가 출력됩니다.
여러 SSH 세션을 동시에 열면 각각 다른 숫자가 부여되는 것을 확인할 수 있습니다.

터미널 디바이스 종류 요약
| 디바이스 | 설명 |
|---|---|
tty |
실제 물리 콘솔 (키보드·모니터 직접 연결) |
console |
커널이 사용하는 대표 콘솔 |
pts |
가상 터미널 (SSH, 터미널 앱 등) |
ptmx |
pts를 생성·관리하는 마스터 디바이스 |
ttyS |
시리얼 콘솔 (서버·장비 관리) |
ttyUSB |
USB 시리얼 어댑터 |
ttyAMA |
ARM 기반 시리얼 콘솔 |
who 명령어를 함께 사용하면 현재 서버에 접속 중인 모든 사용자와 그들의 터미널 정보를 확인할 수 있습니다.
bash[user@localhost ~]$ who
user pts/0 2026-01-25 19:10 (172.16.101.1)
user pts/1 2026-01-25 19:15 (172.16.101.1)
명령어와 쉘 (Command & Shell)
Shell이란?
쉘(Shell)은 사용자의 명령을 해석하여 실행하는 사용자 공간 프로그램입니다.
이름이 "쉘(껍데기)"인 이유는 커널(핵심)을 감싸고 있는 껍데기 역할을 하기 때문입니다.
사용자가 명령어를 입력하면 쉘은 이를 해석하여 새로운 프로세스를 생성하고 실행합니다.
실행된 프로그램은 시스템 콜(System Call)을 통해 커널과 직접 통신하며,
커널은 하드웨어를 제어하고 그 결과를 다시 사용자 공간으로 반환합니다.
plain사용자 입력
↓
[Shell] ← 명령 해석 및 프로세스 생성
↓
[Kernel] ← 시스템 콜로 통신
↓
[Hardware] ← CPU, 디스크, 메모리 등 제어
↓
결과 반환 → Shell → 터미널 출력

쉘의 종류
리눅스에는 여러 종류의 쉘이 있습니다. 현재 내 쉘을 확인하려면 아래 명령어를 사용합니다.
bashecho $SHELL
대표적인 쉘 종류는 아래와 같습니다.
| 쉘 이름 | 특징 |
|---|---|
sh (Bourne Shell) |
가장 오래된 쉘. 거의 모든 유닉스/리눅스에 존재 |
bash (Bash) |
현재 가장 널리 사용되는 쉘. 대부분의 Linux 배포판 기본값 |
zsh |
강력한 자동완성과 플러그인 지원. macOS 기본 쉘 |
fish |
사용자 친화적. 설치 직후부터 자동완성이 강력 |
sh |
스크립트 호환성이 중요한 경우 사용 |
Rocky Linux(RHEL 계열)의 기본 쉘은 bash입니다.
이 시리즈에서 다루는 모든 내용은 bash 기준입니다.
표준 입출력 (stdin / stdout / stderr)
명령어가 어떻게 동작하는지 이해하려면 표준 입출력 개념을 알아두면 도움이 됩니다.
리눅스의 모든 프로세스는 기본적으로 세 가지 스트림을 가집니다.
| 스트림 | 번호 | 설명 |
|---|---|---|
| stdin (표준 입력) | 0 | 프로그램이 데이터를 읽어오는 곳. 기본값은 키보드 |
| stdout (표준 출력) | 1 | 프로그램이 정상 결과를 내보내는 곳. 기본값은 터미널 화면 |
| stderr (표준 에러) | 2 | 프로그램이 오류 메시지를 내보내는 곳. 기본값은 터미널 화면 |
보통은 화면에 출력되는 게 전부처럼 보이지만, stdout과 stderr는 별도의 채널이기 때문에
나중에 배울 리다이렉션(Redirection) 을 사용하면 각각을 파일로 저장하거나 분리해서 처리할 수 있습니다.
명령어 사용 패턴
기본 형태
쉘에 명령을 전달하는 기본 형태는 아래와 같습니다.
bash명령어 [옵션] [인수]
예를 들어 sleep 5를 실행하면 쉘은 약 5초 동안 아무 입력도 받지 않는 상태가 됩니다.
5초가 지나면 쉘은 다시 $ 프롬프트를 출력하고 다음 명령을 기다립니다.
이처럼 프롬프트가 표시되어 있는 상태 = 명령을 입력할 수 있는 상태입니다.
반대로 프롬프트가 없는 상태는 이전 명령이 아직 실행 중임을 의미합니다.
옵션 (Options)
옵션은 명령어의 동작 방식을 변경하거나 확장합니다.
| 스타일 | 예시 | 설명 |
|---|---|---|
| 단축 옵션 | -a, -l |
대시(-)와 알파벳 한 글자. 여러 개 합칠 수 있음 |
| 장문 옵션 | --all, --long |
대시 두 개와 단어. 가독성이 좋음 |
ls 명령어를 예로 들면 다음과 같습니다.
bashls # 현재 디렉토리의 파일과 디렉토리 목록
ls -a # 숨김 파일(.으로 시작하는 파일)을 포함하여 출력
ls -l # 파일 권한, 소유자, 크기, 날짜 등 상세 정보 출력
ls -a -l # 위 두 옵션을 함께 적용
ls -al # 위와 동일. 단축 옵션은 합쳐서 쓸 수 있음
ls --all # -a 와 동일한 장문 옵션
ls /etc # /etc 디렉토리의 내용을 출력 (인수로 경로 지정)
명령어 도움말 확인
낯선 명령어를 마주쳤을 때 사용할 수 있는 방법입니다.
--help 옵션: 간단한 사용법을 빠르게 확인할 때
bashls --help
man 명령어(Manual): 상세한 공식 매뉴얼을 확인할 때
bashman ls
man 페이지는 j/k 키로 위아래 이동, /검색어로 내용 검색, q로 종료합니다.
처음에는 영어로 되어 있어 어렵게 느껴지지만, 익숙해지면 가장 신뢰할 수 있는 참고 자료입니다.
다중 명령어 실행
여러 명령어를 순서대로 실행해야 할 때 매번 하나씩 입력하는 것은 번거롭습니다.
리눅스 쉘은 한 줄에서 여러 명령어를 연결하는 다양한 방법을 제공합니다.
; — 순차 실행 (결과에 상관없이)
가장 기본적인 방법입니다. 앞 명령어의 성공/실패에 관계없이 다음 명령어를 실행합니다.
bashdate ; sleep 10 ; cal
bash[user@localhost ~]$ date ; sleep 10 ; cal
Mon Jan 26 12:39:32 UTC 2026
(10초 대기)
January 2026
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
...
&& — 앞 명령어가 성공했을 때만 실행
앞 명령어가 성공(종료 코드 0) 했을 때만 뒤 명령어를 실행합니다.
"A가 성공하면 B를 실행"하는 패턴에 사용합니다.
bashmkdir /tmp/test && cd /tmp/test
디렉토리 생성에 실패했다면 cd는 실행되지 않습니다.
; 를 사용했다면 존재하지 않는 디렉토리로 이동하려다 오류가 발생했겠지만,
&&를 사용하면 그런 상황을 예방할 수 있습니다.
|| — 앞 명령어가 실패했을 때만 실행
앞 명령어가 실패(종료 코드 1 이상) 했을 때만 뒤 명령어를 실행합니다.
"A가 실패하면 B를 실행"하는 패턴, 즉 대체(fallback) 에 자주 사용됩니다.
bashping -c 1 google.com || echo "네트워크 연결을 확인하세요"
| — 파이프 (앞 명령어의 출력을 뒤 명령어의 입력으로)
파이프(pipe)는 앞 명령어의 stdout(표준 출력) 을 뒤 명령어의 stdin(표준 입력) 으로 연결합니다.
여러 명령어를 체인처럼 연결하여 복잡한 작업을 한 줄로 처리할 수 있습니다.
bash# 현재 디렉토리 파일 목록 중 .conf 파일만 필터링
ls /etc | grep ".conf"
# 실행 중인 프로세스 목록에서 sshd 찾기
ps aux | grep sshd
# 파일 내용을 페이지 단위로 보기
cat /etc/passwd | less
파이프는 리눅스를 강력하게 만드는 핵심 개념 중 하나입니다.
단순한 명령어들을 파이프로 조합하면 복잡한 작업도 깔끔하게 처리할 수 있습니다.
비교 요약
| 연산자 | 의미 | 사용 상황 |
|---|---|---|
; |
A 실행 후 B 실행 (무조건) | 순서만 보장하고 싶을 때 |
&& |
A 성공 시 B 실행 | A의 결과에 B가 의존할 때 |
|| |
A 실패 시 B 실행 | 실패 시 대체 처리가 필요할 때 |
| |
A의 출력 → B의 입력 | 명령어를 체인으로 연결할 때 |
알아두면 편한 단축키
커맨드라인 작업 효율을 높여주는 단축키입니다.
처음부터 모두 외울 필요는 없지만, 조금씩 쓰다 보면 자연스럽게 손에 익게 됩니다.
커서 이동
| 단축키 | 동작 |
|---|---|
Ctrl + A |
줄의 맨 앞으로 이동 |
Ctrl + E |
줄의 맨 끝으로 이동 |
Ctrl + ← / Alt + B |
단어 단위로 왼쪽 이동 |
Ctrl + → / Alt + F |
단어 단위로 오른쪽 이동 |
편집
| 단축키 | 동작 |
|---|---|
Ctrl + U |
커서 앞의 내용 전체 삭제 |
Ctrl + K |
커서 뒤의 내용 전체 삭제 |
Ctrl + W |
커서 앞 단어 하나 삭제 |
Ctrl + Y |
삭제한 내용 붙여넣기 |
프로세스 제어
| 단축키 | 동작 |
|---|---|
Ctrl + C |
실행 중인 명령어 강제 종료 |
Ctrl + Z |
실행 중인 명령어를 백그라운드로 일시 중단 |
Ctrl + D |
입력 종료(EOF). 터미널에서 로그아웃 |
히스토리 & 자동완성
| 단축키 | 동작 |
|---|---|
↑ / ↓ |
이전/다음 명령어 히스토리 탐색 |
Ctrl + R |
히스토리 역방향 검색 (입력하면서 필터링) |
Tab |
명령어, 파일명, 경로 자동완성 |
Tab 두 번 |
가능한 자동완성 후보 목록 출력 |
특히 Ctrl + R은 알면 작업 속도가 확 올라갑니다.
자주 쓰는 긴 명령어를 처음 몇 글자만 입력하면 히스토리에서 찾아줍니다.
bash(reverse-i-search)`ssh': ssh user@172.16.101.128
명령어 히스토리 관리
history 명령어로 이전에 입력한 명령어 전체를 확인할 수 있습니다.
bash[user@localhost ~]$ history
1 ip addr
2 ssh user@172.16.101.128
3 tty
4 ls -al
5 history
히스토리 번호를 이용해 바로 실행할 수도 있습니다.
bash!3 # 3번 명령어 재실행 (tty)
!! # 바로 직전 명령어 재실행
히스토리는 기본적으로 ~/.bash_history 파일에 저장됩니다.
민감한 명령어(예: 비밀번호를 포함한 명령어)를 히스토리에서 지우고 싶다면:
bashhistory -d 번호 # 특정 번호 삭제
history -c # 전체 히스토리 삭제
마치면서
이번 글에서는 리눅스 커맨드라인 환경의 기초를 다졌습니다.
다룬 내용을 정리하면 아래와 같습니다.
- 커맨드라인(CLI) 이 무엇인지, GUI와 어떻게 다른지
- SSH를 통해 서버에 접속하는 방법과 원리
- 프롬프트 구조 읽는 법 (
[user@host 경로]$) - Shell이 무엇인지, 어떻게 커널과 연결되는지
- 명령어 기본 패턴 (명령어 + 옵션 + 인수)
- 다중 명령어 연산자 (
;,&&,||,|) - 단축키 및 히스토리 관리
아직은 명령어 몇 개를 실행해본 수준이지만, 터미널과 쉘이 어떤 관계로 동작하는지
개념을 한 번 짚고 넘어갔다는 것만으로도 이후 내용을 이해하기 훨씬 수월해집니다.
다음 글에서는 파일 시스템 구조와 디렉토리를 탐색하는 기본 명령어(ls, cd, pwd, find 등)를 다루겠습니다.
서버 안을 자유롭게 돌아다니는 감각을 조금씩 익혀보겠습니다.