(Linux)리눅스 기초와 기본 명령어
[카카오 클라우드 스쿨] 리눅스 기본 개념 ~ 기초 명령어를 배워 보자
1. UNIX와 Linux
- 리눅스도 이 UNIX에서 파생됨
- 유닉스: 기업용, 가상화의 진골
- Multi User, Multi Tasking
- Linux Kernel 0.1 -> 0.2 공개
- kernel.org에서 공개된 커널 버전을 확인할 수 있다
- 커널을 가져다다 KSH, bash 등을 입맞에 맞게 수정할 수 있다 => 배포판 리눅스
[root@websrv ~]# uname -a
Linux websrv 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
- 리눅스
- 엄밀한 의미: 리눅스 Kernel
- 보편적 의미: 리눅스 배포판
- 데비안 계열
- Ubuntu (컨테이너, K8S)
- 레드햇 계열
- RHEL(기업용, 패치 기술지원 업데이트 등에 대한 비용을 과금)
- CentOS(클라우드, 관리IaC)
Kernel
- OS에서의 사용하는 모든 애플리케이션, Tool, Service 등은 Kernel의 허락을 받아야 물리자원에 접근이 가능함
- 또한 Kernel의 허락을 받아야 해당 서비스를 실행/중지 시킬 수 있다
2. 클라우드에서의 리눅스
- 클라우드 환경을 위한 다양한 도구들은 독립적으로 작동해서는 큰 효과를 볼 수 없다
- 다른 도구들(오픈소스)과 같이 연계하여 효과를 극대화할 수 있다
- 이를 위해서는 서로간의 호환 문제가 해결되어야 하지만, 리눅스 상에서는 이러한 문제를 해결할 수 있다
- UNIX 서버에서 x86 서버로 갈아타게 되는 과정
- 클라우드의 등장 배경
- 배포판 리눅스는 모두 다를까?
- 대부분 비슷하나, 파일 시스템의 구조는 다르다
- ONOS: 클라우드 및 5G 환경에서의 SDN(Software Defined Nerwork)을 위한 리눅스
- Kali Linux: 데비안 계열로, 해킹 모의 침투 테스트를 위한 리눅스
- 대부분의 리눅스는 현재 BASH와 같은 셸을 사용하고 있으므로 명령어는 큰 틀에서 비슷함 (Tree 형태)
- 대부분 비슷하나, 파일 시스템의 구조는 다르다
3. 리눅스의 사용자 정보
- 사용자는 로그인을 하게 되면 각 사용자별로 별도의 시스템 환경 변수를 할당 받는다
- printenv 명령어를 통해 사용자 환경 변수를 확인할 수 있다
[root@websrv ~]#
[root@websrv Desktop]#
- root: 현재 사용자
- websrv: 서버의 이름
- ~ : 현재 위치(현재 root의 홈 디렉터리 /root에 있음)
- /etc/passwd
- 현재 시스템 내에 있는 사용자들의 (계정) 정보를 담아 두는 곳
- root, user1은 일반적인 사용자를 의미
- apache는 일반적인 사용자가 아닌 웹서비스를 실행할 수 있는 ‘서비스’
- ex) 사용자 > systemctl restart httpd > apache > 웹서비스 재실행
[root@websrv Desktop]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
user1:x:1000:1000:user1:/home/user1:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
...
[root@websrv Desktop]# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
- root
- 계정 이름
- x
- 패스워드, /etc/shadow에 저장이 된다
- 0
- UID 번호, root는 슈퍼유저이므로 0임, 일반 사용자(user1)는 1000부터 시작함
- 0
- 해당 사용자가 소속되어 있는 그룹의 번호(GID)
- 리눅스의 모든 사용자들은 최소 하나의 그룹(Primary Group)에 포함되어야 함
- 처음 사용자를 생성할 때 사용자명과 동일한 그룹이 생성되고 사용자는 여기에 포함됨
- 하나의 User는 여러 그룹의 포함될 수 있지만, 최소 하나의 Primary Group에는 포함되어야함
- root
- 계정의 full name
- /root:
- 홈 디렉터리
- root: /root
- user1: /home/user1
- /bin/bash
- 사용하는 기본 셸, 최근 linux의 기본 셸
- 우분투의 경우 조금 가벼운 dash를 하용하지만, 인증과증에서는 bash를 사용함
- 물론 바꿀 수 있다
- su 명령어로 사용자 변경
- exit 명령어로 원래 사용자로 돌아옴
- whoami 명령어로 현재 로그인한 사용자 확인 가능
[root@websrv ~]# su user1
[user1@websrv ~]$ exit
exit
[root@websrv ~]# whoami
root
4. 리눅스의 경로
- 경로이동: cd 명령어 사용
- 절대경로 : /부터 시작
- 상대경로 : 상위 디렉터리(..), 현재 디렉토리(.)
- 경로 내에 있는 파일/폴더 표시: ls 사용
- ls -a : 현위치의 숨김파일/디렉토리 표시
- ls -l : 상세정보 출력(권한 등)
- ls -al : 상세정보 숨김파일 포함하여 전부 출력
- ls -al 수행 시 보여지는 모습
- 맨 첫글자
- : 일반파일
- d : 디렉토리
- l : 링크가 걸려 있는 파일 (soft link(심볼릭)-바로가기, hard link)
- rwxrwxrwx
- “r” : read
- “w” : write
- “x” : excute
- root root
- 소유주와 그룹
- 맨 첫글자
drwxr-xr-x. 2 root root 6 Jul 13 14:33 Videos
-rw------- 1 root root 49 Jul 19 16:05 .xauthXpRXcq
5. 파일의 내용 살펴보기
- cat 명령어
- 파일의 전체 내용 살펴보기
- more
- 파일의 내용을 한 페이지/한 줄씩 살펴보기
- 방향키, pgUp, pgDown 키가 사용이 가능하며, 문서 읽은 정도를 퍼센트로 표시해줌
- b: 처음으로, sp: 한 페이지씩, enter: 한줄씩 출략, q: 나가기
- less
- more과 비슷함
- 방향키 사용이 가능함
- head/tail
- 기본적으로 상위 10줄/하위 10줄을 보여줌
- head -3 test.txt 처럼 보여줄 라인 수 지정 가능
- 특히 tail의 경우, 실시간으로 특정 파일의 내용/로그 등을 확인할 때 유용함
- tail을 통해 실시간 로그 확인
- 2줄을 실시간으로 보겠다: tail -2f [로그파일]
[root@srv7 0720]# cat /var/log/httpd/access_log
::1 - - [19/Jul/2022:14:06:24 +0900] "GET / HTTP/1.1" 200 36 "-" "curl/7.29.0"
::1 - - [19/Jul/2022:14:06:30 +0900] "GET / HTTP/1.1" 200 36 "-" "curl/7.29.0"
[root@srv7 0720]# tail -3f /var/log/httpd/access_log
::1 - - [20/Jul/2022:10:21:12 +0900] "GET / HTTP/1.1" 200 36 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
::1 - - [20/Jul/2022:10:21:12 +0900] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"
6. 파일 만들기
1 . touch 명령어를 사용
- 빈 파일을 만든다
- 원래의 목적은 파일 수정 시간을 갱신하기 위한 것
- 이미 파일이 존재하는 경우, 내용은 달라지지 않고 파일 수정 시간만 달라진다
[root@websrv ~]# touch test.txt 파일생성
[root@websrv ~]# echo "hello" > test.txt 출력, >로 파일에 출력
[root@websrv ~]# cat test.txt 파일보기
hello
[root@websrv ~]# touch test.txt 한번 더 touch
[root@websrv ~]# cat test.txt 내용은 변하지 않음
hello
2 . echo 명령어를 사용
- 출력하는 용도지만 부등호를 통해 파일로 저장할 수 있음
[root@websrv ~]# echo "MUYAHO" > test.txt
[root@websrv ~]# cat test.txt
MUYAHO > 파일 생성, 혹은 덮어쓰기
[root@websrv ~]# echo "ALASKA" >> test.txt
[root@websrv ~]# cat test.txt
MUYAHO
ALASKA >> 파일 생성, 혹은 맨 밑줄에 추가하기
3 . 편집기를 통해 수정하는 방법
- gedit
- GUI 환경에서 편집 가능
- vim (vi improved)
- 기존에 있었던 편집기인 vi의 성능을 개선시킨 것
- vi를 사용할 경우, 방향키, 키패드 등의 사용에서 불편함이 많음
- 화면 단위 편집기
- ed, ex, sed
- 행 단위 편집기
- 한 행씩 편집할 수 있다
vi를 입력해도 vim 편집기로 연결시키기
[root@websrv ~]# vi .bashrc
...
alias cp='cp -i'
alias mv='mv -i'
alias vi='vim'
...
.bashrc
- 사용자가 처음 부팅할 때 읽어들이는 파일
- 주로 환경정보 적용이나 alias 등을 현재 환경에 적용하고자하는 것을 미리 입력해 두면 편리함
- 다만 오타가 있을 경우 로그인이 되지 않을 수 있으므로 주의!
- 변경된 .bashrc를 현재 환경에 적용하고 싶다면?
- su를 사용하여 재로그인
- source .bashrc
4 . CAT과 EOF(end of file)를 이용하는 방법
- 여러 줄이 들어간 새로운 파일을 만들어 보자
test.txt의 파일의 내용을 출력한다
[root@websrv ~]# cat < test.txt
test.txt의 파일의 내용을 test11.txt에 저장한다
[root@websrv ~]# cat < test.txt > test11.txt
EOF로 여러줄 입력한다
[root@websrv ~]# cat << EOF > test4.txt
> hello
> world
> EOF
[root@websrv ~]# cat > test5.txt << ZZZ
> hello
> world
> ZZZ
꺽쇄(<, «, >, ») 활용하는 방법이 궁금해요!
- 입력 1> 파일명 : 정상처리 결과값만 파일에 저장
- 입력 2> 파일명 : 오류 결과값만 파일에 저장
[root@srv7 0720]# ping -c 1 www.google.com 1> abc.txt 오류는 출력하고 내용만 담아라
[root@srv7 0720]# cat abc.txt
PING www.google.com (172.217.26.228) 56(84) bytes of data.
64 bytes from bom05s09-in-f4.1e100.net (172.217.26.228): icmp_seq=1 ttl=128 time=29.8 ms
...
[root@srv7 0720]# ping -c 1 www.google.com 2> abc.txt 내용은 출력하고 오류만 담아라
(정상 내용이 출력됨)
7. 복사, 이동
- cp, mv 명령어 사용
- 기본적인 파일 복사
[root@websrv ~]# mkdir 0719
[root@websrv ~]# cd 0719
[root@websrv 0719]# touch a.txt b.txt x.txt 가변 길이 매개변수
[root@websrv 0719]# cp x.txt c.txt
- 다른 디렉터리에서의 파일 복사 (이름은 그대로)
[root@websrv 0719]# cp ~/anaconda-ks.cfg .
[root@websrv 0719]# ls
anaconda-ks.cfg a.txt b.txt c.txt x.txt
- 덮어쓰기
- 기본적으로 i옵션이 실행 됨, 기본적으로 덮어쓸 지 물어본다
- (.bashrc에서 옵션 수정 가능)
[root@websrv 0719]# cp a.txt c.txt
cp: overwrite ‘c.txt’? no
- 기본 디렉터리의 복사
- r 옵션 사용
[root@websrv 0719]# cp -r ../Downloads/ .
[root@websrv 0719]# ls
anaconda-ks.cfg a.txt b.txt c.txt Downloads x.txt
- 기본적인 파일 이동
[root@websrv 0719]# mv x.txt Downloads/
- 한꺼번에 파일 이동
[root@websrv 0719]# mv a.txt b.txt c.txt Downloads/
- mv를 통해 이름 변경
- 동일한 디렉터리에서 수행 시 이름이 변경 됨
- 디렉터리도 이름 변경 가능
[root@websrv 0719]# mv mvtest.txt mvtest1.txt
- 디렉터리의 이동
[root@websrv 0719]# mv ../Public/ .
[root@websrv 0719]# mv Public/ ../
8. 파일 삭제, 디렉터리 삭제, 생성
- 디렉터리: mkdir, rmdir 명령어 사용
- 파일: rm으로 삭제 가능
- rm
- -f: 강제 삭제
- -r: 디렉터리 삭제 가능
- -rf: 비어있지 않은 디렉터리 강제 삭제 가능
- 디렉터리 한꺼번에 생성
- p 옵션으로 parent 생성과 동시에 child 생성 가능
[root@websrv 0719]# mkdir -p parents/child
- 디렉터리 삭제
- 단, 비어있는 디렉터리는 삭제 불가
[root@websrv 0719]# mkdir yes
[root@websrv 0719]# rmdir yes
[root@websrv 0719]# rmdir ../0719
rmdir: failed to remove ‘../0719’: Directory not empty
- 파일 삭제
- f 옵션으로 강제 삭제 가능
[root@websrv 0719]# rm anaconda-ks.cfg
rm: remove regular file ‘anaconda-ks.cfg’? y
[root@websrv 0719]# rm -f hello.txt
- 비어있지 않은 디렉터리 삭제
- rm 명령어에 -rf(디렉터리 강제 삭제) 옵션으로 즉시 제거 가능
[root@websrv 0719]# rm -rf ../0719
9. init 명령어(중요)
- Run level
- 시스템 관리를 용이하게 하기 위해 만들어 짐
- 특히 컨테이너 관리에 아주 용이할 것이다
멀티 유저, 멀티 태스킹 시스템 => 리눅스!
- namespace
- 별도의 독립적인 작업 공간을 가질 수 있다
- cgroup
- 각각 별도의 작업공간에 별도의 리소스를 적용시킬 수 있다
- 미리 리소스에 대한 제한을 걸어 둠
- ex) 이 컨테이너는 CPU를 0.250개정도 쓸 수 있다, 메모리는 128mb 쓸 수 있다
- init 명령어와 run level
- init 0
- 시스템 중지(종료 모드), 기본값 불가
- ex) init0, poweroff, shutdown -P now
- init 1
- 단일 사용자 모드(복구 모드용), root 계정으로 로그인, 시스템 관리 목적으로 사용
- 네트워킹/다중접속 불가능
- init 2
- Multiuser without NFS
- 즉, 네트워크를 허용하지 않는 다중 사용자 모드, run level3에서 네트워크만 빼면 2레벨임 (사실상 쓸 일이 없음)
- init 3
- Multi user mode, 네트워크 지원, 일반적인 CLI 부팅
- init 4
- 사용자가 직접 정의해서 쓰는 모드 (쓸 일이 없음)
- init 5
- 네트워크가 지원되는 multi user, 그래픽 환경으로의 부팅
- init 6
- 시스템 재기동 할 때 사용, 기본값 불가
- ex) init6, reboot, shutdown -r now
- shutdown -c: 셧다운 예약 취소
- shutdown -k +15: 15분 후에 종료됨을 알린다 (종료되지는 아님)
- run level 변경 실습
- /etc/inittab
[root@websrv 0719]# systemctl set-default multi-user.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.
init 6
- run level 3으로 변경된 것을 확인할 수 있다
- (처음 부팅할 때 화면에 보여주는 메시지 MOTD(message of the day)로 변경 가능)
[root@websrv ~]# gedit /etc/motd
- MOTD가 수정된 모습(인사말 추가함)
- startx 실행 시 그래픽 환경으로 전환 됨
- (재부팅 환경에는 다시 CLI 환경으로 돌아감)
10. curl 명령어
프록시 서버 접속하기
curl: 기반의 웹 요청 도구. http 메시지를 요청해 결과를 확인하는 명령어
- L옵션: 해당 페이지까지 들어가서 코드의 내용을 확인한 뒤 화면에 출력
- i 옵션: 헤더 내용을 포함하여 확인
웹파일 기본 출력
[root@websrv 0719]# curl http://localhost
<center><h2>SSK_WORLD</h2></center>
헤더까지 출력(i옵션)
[root@websrv 0719]# curl -i http://localhost
HTTP/1.1 200 OK
Date: Tue, 19 Jul 2022 05:06:30 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 07 Jul 2022 02:21:12 GMT
ETag: "24-5e32dbd4cbe48"
Accept-Ranges: bytes
Content-Length: 36
Content-Type: text/html; charset=UTF-8
<center><h2>SSK_WORLD</h2></center>
포트포워딩이 되어 있다면 해당 페이지까지 들어가서 코드의 내용을 확인한 뒤 화면에 출력
[root@websrv 0719]# curl -L http://www.naver.com
curl 을 이용하여 페이지의 헤더 내용을 포함하여 확인
[root@websrv 0719]# curl -Li http://naver.com -0 naverheader.html
10-1.리눅스 Proxy 서버
- 프록시
- 내부 사용자들의 웹 접속 속도 향상
- 인증 등을 거쳐 인터넷 사용 가능
- URL 필터링, 특정 컨텐츠 필터링이 가능함
- 보안에도 활용 가능!!
- ex) 이미지 제거, pdf, zip, exe 등 제거
- 이와 같이 프록시 서버를 구성하면 모든 PC가 8.8.8.8에 요청을 보내지 않아도 됨
- 효과
- 대역폭을 여유롭게 쓸 수 있음
- 인증/방화벽 기능 추가 가능
- 프록시 + 인증서버 + 방화벽
- 프록시를 이용해서 CURL을 접속하기
- curl -x —proxy서버주소:포트번호 실제접속하고싶은주소
- curl -x —proxy서버주소:포트번호 -L http://www.naver.com -o test.html(파일로 저장)
- o는 output 파일로 저장
- curl로 ‘파일’ 다운로드도 가능
- curl -O http://www.test.com/test.zip
- 물론 wget으로 가능한 기능임
11. 기타 명령어
- pwd(print working directory)
- 현재 작업중안 디렉터리가 어디인지 표시해 줌
- clear
- 페이지 지우기
- wget 명령어
- 웹사이트 주소를 통하여 해당 페이지의 코드를 다운로드 하거나 api 연결, 파일 다운로드 등에 활용
- 특정 웹주소로부터 파일 등을 다운로드 하기 위한 툴
- ex) wget https://www.rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/gedit-3.28.1-3.el7.x86_64.rpm
- netstat 명령어
- 네트워크 상태 정보를 출력한다
netstat -anpt grep LISTEN - a: 모든 연결 및 수신 대기 포트를 표시함
- n: 이름이 아닌 IP 주소로 확인하겠다
- p: 각 서비스가 몇번 PID를 사용하고 있는지
- t: TPC 서비스만 출력
- u: UDP 서비스만 출력
- grep 명령어
- 특정 문자열에 매치하는 행을 출력시켜 준다
- grep 문자열 입력파일
- ex1) grep Listen /etc/httpd/conf/httpd.conf
ex2) cat anaconda-ks.cfg grep root
- 인터페이스 비활성화 및 활성화
- systemctl start network (서비스 시작)
- systemctl enable network (부팅시 자동으로 실행)
- df 명령어
- 디스크 사용량과 마운트 정보를 확인 가능함
- mount 명령어
- mount [물리장치(from)] [논리경로(to)]
- mount /dev/sr0 /test
- sysstat 명령어
- yum -y install sysstat
- 시스템 자원 사용량 확인 가능
- 1초마다 한번씩 5번을 측정, 맨 하단에는 평균값
[root@srv7 ~]# sar 1 5
Linux 3.10.0-1160.el7.x86_64 (srv7) 07/22/2022 _x86_64_(2 CPU)
09:37:35 AM CPU %user %nice %system %iowait %steal %idle
09:37:36 AM all 1.55 0.00 0.00 0.00 0.00 98.45
09:37:37 AM all 3.74 0.00 2.14 0.00 0.00 94.12
09:37:38 AM all 2.69 0.00 0.54 0.00 0.00 96.77
09:37:39 AM all 1.57 0.00 0.52 0.00 0.00 97.91
09:37:40 AM all 3.28 0.00 2.19 0.00 0.00 94.54
Average: all 2.55 0.00 1.06 0.00 0.00 96.39