골방잡담

리눅스 복습 (feat. 생활코딩) - 1 본문

PC방에서/리눅스

리눅스 복습 (feat. 생활코딩) - 1

sisu_ 2020. 7. 22. 22:18

업무에 정말 몇 개의 리눅스 커맨드만 이용하고 있는데, 최근 업무가 바뀌게 되어 리눅스 공부를 다시 하고 있다. 

생활코딩 수업을 들으며 정리한 내용이다.

(출처는 생활코딩 리눅스 수업임을 밝힙니다. 이고잉님 감사합니다 !!  : https://opentutorials.org/course/2598

 

알아둘만한 용어 

  • 뒤에 옵션 넣는걸 'parameter'라고 함. (ls -l 에서 -l 같은) 

  • 명령어 + --help 하면 옵션 등에 대한 설명을 볼 수 있음. 

  • man + 명령어를 하면 매뉴얼을 볼 수 있음. 

  • -r, -R, -recursive : 재귀적 : 아래있는 것까지 모두. 

  • 숨김파일은 디렉토리나 파일 앞에 .이 붙어 있음

 

mkdir

  • mkdir -p dir/dir2 하면 없음 directory를 다 만들어줌

 

ls

  • -S : 파일사이즈 순으로 정렬

 

파일 복사/이동/이름변경하기 

  • cp {파일명} {목적지디렉토리/파일명}

  • mv {파일명} {목적지디렉토리/파일명}

=> 이 때 파일명을 다르게 해서 복사하거나 이동시키려면, 목적지 디렉토리 뒤에 파일명을 바꿔주면 됨. 

=> 파일명 변경시에도 mv 명령어 이용함. mv test.txt test2.txt

 

사용자 권한

  • sudo : super user do : apt-get install git 같이 관리자 권한으로 뭔가 해야 한다면, sudo 명령어 이용

 

파일 만들고 편집하기

  • 메모장처럼, nano나 vi라는걸 쓸 수 있음. (nano 가 초급자용, vi는 중급자 이상 용)

  • 대부분의 유닉스 계열에서 사용하고 있음

  • 사용하려면 nano라고 치면 됨

  • ^O : ctrl + O 누르라는 뜻 : wirte out : 쓰기 모드.

package manager

  • 기본적으로 포함되어 있지 않지만, 설치해서 프로그램을 사용해야 하는 경우에, 다운로드 받고, 컴파일을 하는 등 굉장히 오래 걸림. 그래서 오늘 날의 리눅스는 패키지 매니저를 제공하는데, 모바일의 앱스토어같은 느낌. 필요한 프로그램을 찾아서 다운로드/설치/삭제를 모두 해주는 소프트웨어를 패키지매니저라고 함.

  • apt, yum 이 대표적임. 여기서는 apt만 설명

  • apt-get update; 로는 안 되고, sudo로 해야 함. 이 명령어는 인터넷에 접속하여 최신 소프트웨어 "목록"을 다운받아 줌.

  • sudo apt-cache search htop : htop과 관련되어있는 패키지의 목록을 검색해서 보여줌. 

  • sudo apt-get install htop : htop 프로그램을 다운로드 받아 줌.

  • sudo apt-get upgrade htop : htop 프로그램 업그레이드 함

  • sudo apt-get upgrade : apt-get으로 받은 여러 프로그램을 전부 업그레이드 함

  • sudo apt-get remove htop : 프로그램 삭제

 

top, htop

  • top은 윈도우로 치면 작업관리자. 보기 좀 어려움

  • 그래서 htop이라는 프로그램을 설치.

  • htop은 상당히 그래피컬하게 볼 수 있음

  • sudo htop 해야 모든 ㅡㅍ로그램에 대해서 볼 수 있음.

 

wget

  • url을 이용해서 다운로드 할 수 있는 명령어

  • wget -O paris.jpeg {uRL} 하면 paris.jpeg라는 파일명으로 저장 가능!

 

git, github

  • github은 git으로 만든 소스코드를 웹으로 다운로드 받을 수 있는 곳

  • git 명령어 쳐서 내 우분투 환경에 있는지 확인. (없으면 apt-get으로 install) 

  • git clone {github에 있는 URL} react_source 

    react_source라는 디렉토리에 react 소스파일들 모두 다운로드됨

 

cli방식의 장점

  • mkdir why; cd why; 이렇게 세미콜론으로 구분해서 명령어를 여러개 쓸 수 있음

 

pipeline

  • 하나의 프로세스의 출력을 다른 프로세스의 입력으로 사용

  • ls --help | grep sort 

    • ls --help 에 나오는 정보 중 sort 단어 검색 🙂 

  • ls --help | grep sort | grep file 

    • sort나오는 정보 중 file까지 나온 정보 검색 🙂 

  • ps aux | grep apache 하면 떠 있는 프로그램 중 apache 만 볼 수 있음

 

IO redirection

standard output

  • ls -l > result.txt

  • 입/출력 방향을 바꿀 수 있음. 

  • > 은 1> 을 생략한 것이며, standard output을 의미함.

    즉, 정상적인 결과가 나왔을 때, 내용을 > 로 redirection하여 저장 가능함

  • standard error 를 redirection 할 때에는 2> 를 이용해야함

    rm rename2.txt 2> error.log (rename2.txt파일이 존재하지 않을 때)  

 

 

프로그램 : 하드디스크나 SSD에 저장되어 있는 코드

프로세스: 프로그램이 실행되고 있는 상태를 프로세스, 하나의 프로그램은 여러 개의 프로세스를 갖고있을 수 있음

 

 

standard input

  • cat은 사용자가 키보드로 입력한 정보를 standard input으로 받음. 

  • 키보드로 입력한 내용 대신, 파일에 있는 정보를 redirect할수도있음

  • cat < hello.txt 하면, cat이라는 프로그램이 standard input으로 입력을 받은 것이라고 생각하면 됨

  • cat hello.txt 하면, command-line arguments(인자)로 받은거라고 생각하면 됨 

  • head linux.txt 하면, 기본 10줄 보여주고, 

  • head -n1 < linux.txt 하면, head라는 프로그램에 comand-line argumnet 로 -n1을 주고, <로 standard input을 준 것임.

  • head -n1 < linux.txt > one.txt 하면, 앞에서 뽑은 내용을 one.txt로 저장

 

*이렇게 input-> output으로 나가는 형국을 I/O stream 이라고 함. 

 

 

append

  • >>를 하면 기존 있는 내용 뒤에 덧붙이는 식으로 저장이 됨

 

/dev/null

  • 리눅스에서 휴지통 같은 곳. 뭔가 하면서 화면에도 출력하고 싶지 않고, 파일로 출력하고 싶지도 않을 때에 

  • ls -al > /dev/null 하면, 그냥 아무 출력도 없음 

 

Shell vs Kernel

  • 이 블로그에 잘 설명되어 있는듯 :  https://gaeko-security-hack.tistory.com/118

  • hardware : 물리적인 하드웨어: SSD 등

  • Kernel : 하드웨어를 조작해주는 파일. 사용자의 명령을 수행하면서 파일의 입출력을 담당하고, 하드웨어를 관리하는 프로그램

  • Shell : 사용자가 직접 커널을 제어하기엔 어려워. 기계적인 부분이 많기 때문에.. 그래서 사용자가 내린 명령을 커널이 이해할 수 있게 번역해주는 장치가 필요하고, 그게 쉘 프로그램임. 참고로 사용자마다 이용하는 shell 이 다를 수 있음. 

  •  

 

Shell 의 종류

  • echo $0 : 현재 사용하고 있는 shell 확인할 수 있음. 

 

Script 짜기

  • #!/bin/bash : 프로그램을 실행시켰을 때, 첫 줄의 #!을 보고, 그 뒤에 잇는 내용을 보고 운영체제에서 이 프로그램을 통해 해석되어야 한다는 사실을 알려주는 것. (약속) 

    • (/bin 밑에 모든 프로그램들이 있음. 위의 경우 /bin 밑에 bash 프로그램이 있는 것.)
  • if [-d bak] : 현재 디렉토리에 bak라는 디렉토리가 존재하는가? 

  • 조건문이 끝났다는건fi로 표현

  • 실행가능하게 바꿔주려면, chmod +x {파일명}

 

 

리눅스 디렉토리 구조 (외우자) 

  • /bin : binary 라는 뜻, 일반 사용자들이 쓰는 프로그램들 

  • /sbin : 시스템관리 목적을 가진사용자들이 사용하는 프로그램. 

  • /etc : configuration files : 

  • /dev

  • /proc

  • /var : variable files : 용량이나 내용이 바뀔 수 있는 파일들.  

  • /tmp: 임시파일로, 껏다 키면 날라감

  • /home : 사용자들의 디렉토리. 사용자의 파일들이 저장되는 디렉토리 : 어디에 있건 cd ~ 을 치면 바로 home으로 감

  • /boot : 운영체제 관련된 것으로 넘어가자

  • /lib : /bin, /sbin에서 쓰는 라이브러리들이 저장되는 곳

  • /opt : 소프트웨어 설치할 때, 디렉토리를 정해줘야하는데 애매하면 여길 쓰면 좋음

  • /usr : /usr/bin, /usr/sbin 의 경우, 보통 프로그램들이 /usr밑에 설치가 되고, 기본적으로 unix 계열에 설치가 돼서 제공되는건 /bin, /sbin에 있다고 생각하면 됨. 

    - 역사적으로는, 컴퓨터 킬때 필요한걸 /bin, /sbin에 넣고 켠 후에 필요한 프로그램을 /usr/bin 에 넣느라 그랬다고 함. 지금은 하드디스크나 ssd가 성능이 좋아서 필요 없음. 

    - /usr에는 사용자 데이터는 넣지않고, 사용자 데이터는 home 디렉토리에 넣게 되었다고 함. 

 

whereis {프로그램명} 하면 어디에 저장되어 있는지 알 수 있음

 

프로세스가 무엇인가 

 

컴퓨터의 구조부터 이해해보면, 

SSD, HDD : storage : 가격이 쌈 : 저장용량 큼 : 속도 느림

RAM (DDR 등) : memory : 가격이 비쌈 : 저장용량이 적음 : 속도 빠름

CPU : processor : 얘가 동작할 때, 굉장히 빠르기 떄문에, 스토리지가 갖고 있는 속도로는 cpu의 처리 속도를 따라올 수 없음. 

 

프로그램은 스토리지에 깔려있고, 실제 사용할 때는 그 프로그램을 읽어서 메모리에 적재시킴. 사용되지 않는 프로그램은 메모리에 올리지 않음. 메모리에 올라와있는 프로그램을 CPu가 읽어서 적힌대로 동작한 후 데이터를 처리하는 것. 즉, CPU가 빠르기 때문에 스토리지에 있는걸 쓸 수 없어서 메모리에 올려서 쓰는거라고 보면 됨. 

 

예를들면, 

mkdir, rop, rm 같은 프로그램은 스토리지에 파일 형태로 존재

이 프로그램들을 실행하면, 그게 메모리에 적재가 되고, 그게 cpu에서 processor에 의해 실행되고 있는 상태의 프로그램을  process라고 하는 것. 

 

 

프로세스 모니터링

  • ps : 프로세스 리스트를보여주는 명령

  • ps aux : 백그라운드에서 돌아가는 프로그램까지 모두 보고 싶을 때 

  • top : 어떤 프로그램이 있는지 볼 수 있음

  • htop : 카테고리별로 정렬 가능(클릭해서) . Time 은 실행된 시간, command는 어떤 명령으로 실행이 되엇는지. 실제 메모리 사용량은 RES, 물리적인 메모리 크기의 비율은 MEM% 보면 됨. 

 

MAC은 유닉스 계열이기 때문에, 거기서 htop 하면, 1,2,3,4라고 뜨는게 코어 수. 4개 코어를 쓰고 있다는 것. 

Load average는 CPU의 점유율과 관련된 것인데, 1분 간의 CPU 점유율, 5분, 15분 간의 CPU 점유율의 평균치임.

코어가 1개라고 치면, 1개의 프로세스가 처리되고 있는 동안, 예를들면 load average 가 5면, 4개의 프로세스가 대기를 타고 있다고 생각하면 됨. 

코어가 4개인데, 숫자가 4면 그냥 적절하게 쓰고 있다고 생각하면 됨. 숫자가 1이면 3개는 놀고 있다고 생각하면 됨. 

 

 

파일 은 크게 2가지로 쓰임

  • 데이터를 보관하기 위한 용도 

  • 해야할 일에 대한 명령을 보관하고 있는 실행파일

 

locate

  • locate + 파일이름 

  • ex) locate *.log 는 .log로 끝나는 모든 파일을 찾아줌

  • locate라는 명령은 디렉토리를 뒤지는게 아니라, database를 뒤짐.

    즉, 디렉토리를 뒤지는게 아니라 database는 파일들에 대한 정보를 갖고 있는 것이기 때문에 훨씬 더 빠르게 찾을 수 있음. locate가 사용하는 데이터베이스는 mlocate라고 부름. 

  • mlocate라는 데이터베이스에 있는 파일 목록은, updatedb라는 명령에 의해서 mlocate 데이터베이스에 여러가지 정보들이 저장이 됨. 그리고 이 작업은 많은 리눅스 시스템에서 하루에 한번씩 정기적으로 처리하게 되어 있음. 

 

find

  • 실제로 디렉토리를 뒤짐. 그래서 성능은 locate보다 낮음. 대신 현재 상태를 가져올 수 있고, 굉장히 다양한 사용법들이 있기 때문에 많이 씀

  • find --help | head 로 앞부분만 볼 수 있음. 

  • find [path...] (어느 디렉토리부터 찾을 것이냐) 

    find / (root 부터 찾겠다)

    find . (현재 디렉토리부터 찾겠다) 

  • find -name : 이름으로 찾겠다 

    find / -name *.log : 루트 밑에 .log로 끝나는 모든 파일 찾겠다. 

    find ~ -name *.log : 홈디렉토리 밑에서 찾는다는 뜻 

  • find . -type f -name tecmint.php

    파일의 확장자를 f로함, 파일이라는 뜻임. (디렉토리 말고 파일)

  • find . -type f -name "tecmint.txt" -exec rm -f {} \

    저 파일을 찾은 후, 삭제를 "묻지도 따지지도 말고" "실행" 하고, 앞에서검색한 파일의 이름을 {} 여기다가 넣는다는 뜻 

 

whereis

  • 실행파일을 찾아주는 명령어 

  • whereis ls 

    앞에 뜨는게 위치하는 디렉토리, 뒤에 있는 디렉토리가 manual 위치 

  • whereis 명령어를 쓰면, 프로그램 위치를 $PATH, $MANPATH에서 뒤짐. 

  • /bin/ls 에 프로그램이 있는데, 왜 우리는 어디서든 ls라고 입력하면 그게 실행될까? 

  • 이유는 $PATH 라는 변수 때문.

  • echo $PATH 하면, 이 PATH 에서 가지고 있는 정보를 볼 수 있음. 여러 개의 경로를 : 로 구분하여 저장하고 있음.

  • ls 명령어를 치면, $PATH에 있는 디렉토리들을 다 검색해서 ls를 찾아서 실행함.

  • $PATH를 결국, 직접 수정해서 활용할 수도 있다는 뜻이 됨. 

 

background 실행

  • vi 편집기를 쓰다가, ctrl+Z를 누르면 해당 프로그램이 백그라운드로 돌게 됨 

  • fg를 누르면 해당 프로그램이 다시 foreground 에서 실행 됨

  • jobs라고 치면 현재 백그라운드에 돌고 있는 프로그램들을 볼 수 있음. 

  • +는 fg를 쳤을 때 보여줄 프로그램이 어느 것인지 알려주는 것. 

  • fg %1 하면, 백그라운드에서 도는 것 중 1번을 실행시킴

  • kill %4 해서 죽일 수 있는데, 이건 정상적인 종료 방식으로 안꺼질수도 있어. kill -9 %4 하면 무조건 강제 종료.

 

실행할때부터 백그라운드에서 돌게 하고 싶다면? 

  • 그럴 떄는 명령 뒤에 &를 치면 됨. 

 

daemon 

  • 인간이면서 신인 존재 

  • 항상 실행되고 있는 프로그램. (like 냉장고) 

  • server들은 daemon 에 해당됨. 

  • 서버에서는 클라이언트(ex. web browser)이 언제 접속할지 알 수 없기 때문에, 서버 프로그램 중에 웹브라우저의 counterpart로 webserver을 쓰고, daemon/service 를 씀. 

  • apache2(웹서버)를 한번 설치해보자

    /etc/init.d 에 데몬 서비스들이 모두 설치됨. 여기 있는 프로그램들을 키고 끌 때는 service 로 시작해야함

  • sudo service apache2 start

  • sudo service apache2 stop 

  • 데몬 서비스들은 모두 start, stop 명령어를 쓰고 있음. 

  • 데몬 서비스들은 컴퓨터가 켜질 떄, 자동으로 실행이 되어야 함. 그런 경우에는

    cd /etc/rc3.d(CLI의 경우), rc5.d (GUI로 구동하고 있는 경우) 에 들어가서 봤을 때 S 로 시작하면, 자동으로 시작된다는 뜻 . 자동으로 시작되게 하고 싶으면 여기에 링크를 걸면 됨. 

 

 

cron

  • crontab -e 를 치면, 하고자 하는 일을 적어놓을 수 있는 에디터가 열림

  • */10 *  10분에 한번, 매시,

  • */1 * * * * date >> date.log 2>&1

  • 여기서 2>&1은, 에러의 경우 standard output (1)로 redirection한다는 의미로 오류가 나도 date.log에 쌓이게 됨

  • 실제 사용하는 사례가 어떤게 있을까?

    • 메일 10만통 보내는 것을 예로 듬. 10만통을 보내는데는 오래걸리기때문에, 사용자가 발송한 후에 실제로 다 보내질때까지 기다렸다가 결과값을 주면 너무 늦음. 그러니까 서버에 일단 수신인명단 등 필요한 정보를 저장하고, saved라고 메세지를 주고 client 에게도 saved메세지를 줘서 사용자에게 발송이 완료됐다고 한 후에, crontab이용해서 주기적으로 저장된 정보를 확인하면서 작업을 하는 것. 실제로는 메일 발송이 1시간 후에 끝나도, 사용자는 신경을 안 써도 됨.

 

shell의 스타트업 스크립트

  • 쉘이 실행되면 자동으로 실행되게 하는 스크립트

  • alias : alias l='ls -al' 을 걸어주면, l이라고 입력하면 ls -al 이 실행됨

  • home directory에 .bashrc 로 들어가면, bash가 실행됐을 때 실행되는 명령어들이 들어가는 곳

  • 프롬프트 형태를 바꿔주는 것을 한다던가(색깔 같은거, 김순홍수석님이 하신거인듯), 어떤 특정 명령을 찾을 때, 어디에 있는 명령어인지 찾는 것 ($PATH) 을 변경한다든지, 하는 것들을 설정할 수 있음.

  • 여기서 bashrc어떻게 customizing 할 수 잇는지 참고 가능

https://www.howtogeek.com/307701/how-to-customize-and-colorize-your-bash-prompt/

 

 

다중사용자

  • id

ubuntu@ip-172-31-43-2:~$ id

uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),108(lxd),114(netdev)

  • who : 누가 접속해있는지 알 수 있음

 

root user

  • 일시적으로 슈퍼유저의 권한으로 명령어를 실행할 수 이씀 : sudo apt-get update; 같은

  • root 유저의 경우, $표시 대신 #으로표시됨

  • ubuntu의 경우 일단 root로 들어가는게 막혀있음;;

  • su : change user id or become superuser

  • su - root : root로 로그인하게 됨

  • sudo passwd -l root 하면 root 계정으로 로그인 못 하게 락을 거는 것

  • sudo passwd -u root 하면 root 계정이 잠긴 것을 풀어줌 (ubuntu의 경우)

  • 참고로 root 사용자는 /root 라는 디렉토리가 home 디렉토리임.  (최상위 디렉토리인 / 와는 다름)

 

사용자의 추가

  • 사용자 추가한 후, passwd도 설정해줘야함.

ubuntu@ip-172-31-43-2:~$ sudo useradd -m yechin

ubuntu@ip-172-31-43-2:~$ cd /home/

ubuntu@ip-172-31-43-2:/home$ ll

total 16

drwxr-xr-x  4 root   root   4096 Jul 15 14:27 ./

drwxr-xr-x 23 root   root   4096 Jul  8 06:09 ../

drwxr-xr-x 12 ubuntu ubuntu 4096 Jul 15 14:05 ubuntu/

drwxr-xr-x  2 yechin yechin 4096 Jul 15 14:27 yechin/

ubuntu@ip-172-31-43-2:/home$ sudo passwd yechin

Enter new UNIX password:

Retype new UNIX password:

passwd: password updated successfully

ubuntu@ip-172-31-43-2:/home$

  • 사용자에게 sudo 권한 주기 : sudo usermod -a -G sudo yechin

 

 

파일 권한

 

  • 권한을 'access mode'라고 함. 권한을 바꾸는 명령어는 'chmod'(change mode)

  • 'other'의 read 권한을 빼려면? chmod o-r {파일명}

  • 반대로 모든 사용자에게 read 권한 넣으려면 ? chmod o+r  {파일명}

  • chmod o+w {파일명}

  • chmod u-r {파일명} : 소유자의 read 권한을 뺌

  • chmod u+r {파일명} : 소유자에게 다시 read권한 넣음

  • 실행파일을 만들고, x가 안 들어가 있는 상태에서 실행을 하려고 하면 실행이 안 됨. 대신, /bin/bash hi-machine.sh 식으로 하면 실행이 됨. why?>?

    • /bin/bash 처럼 특정 프로그램을 통해 실행하는건 아무런 제약이 없음 (다른 프로그램으로 실행하는것도 제약 X)

    • 근데 해당 shell을 마침 프로그램처럼 실행하려고 하면, 실행 권한이 필요함

    • chmod u+x hi-machine.sh

    • ./hi-machine.sh 를 실행하면, 일단 사용자가 권한이 있는지 체크를 한 후, #!/bin/bash를 확인한 후 /bin/bash프로그램에 저걸 전달하여 실행하는 것.

 

디렉토리 권한

  • 디렉토리에 대해서 읽기 권한을 없애면?

    • 해당 디렉토리에 들어갈 수가 없음.  디렉토리 안에 소속되어 있는 파일을 열람할 수 있느냐의 여부임.

  • w가 있는 것과 없는 것의 차이는?

    • 디렉토리 아래에서 새로운 파일을 만들 수가 없음.

    • w를 주면, 파일 생성/삭제/이름바꾸기가 됨.

  • x는?

    • 빼버리면 디렉토리에 들어갈 수가 없음.

  • 특정 디렉토리 밑에 있는 디렉토리/파일의 권한을 전부 한번에 바꾸려면?

    • chmod -R o+w {디렉토리명}

    • 여기서 R은 recursive 옵션.

 

chmod 명령어 정리

  • 중급자로 갈수록 중요함!

  • o+w 식으로 하면, 한번에 하나 권한만 줄 수 있음. (예를들면 other에 읽기권한, 쓰기 권한, 실행권한 따로 줘야함 )

  • octal modes라는걸 보면, 숫자별 권한과 맵핑되어 숫자로 그냥 권한을 넣어줄 수 있음. (ㅠㅠ 바로 외울필요없이 그때그때 하다보면 외워진다고 함)

  • 글자로 하는 방식도 있어

    • chmod a=rwx perm.txt :모든 사용자에게 rwx권한 다 줌

    • chmod a= perm.txt:모든 사용자 권한 빠짐

    • chmod a=r perm.txt 모든 사용자에게 읽기 권한만 줌

    • u: user g: group o: other a: all

    • +: 넣기 -:빼기 =:원하는 권한 명시

 

group을 추가해서 권한 관리하기

  • groupadd developers : developers라는 group을 만듬.

    • groupadd는 일반사용자는 못 하고, sudo로 해야함

    • /etc/group 에서 그룹 확인 가능

  • usermod - modify a user account

    • sudo usermod -a -G developers egoing :  developers그룹에 egoing을 추가한다.

    • 변경 후에는, 재접속 하면 반영됨

  • 그럼 특정 디렉토리에 대해서 그룹을 권한에 넣어주려면?

    • chown root:developer .

    • 현재 디렉토리에 대해, 소유자를 root그룹에서 developer로 바꾼다.

 

Comments