Linux
Linux
왜 Linux를 배울까?
인터넷과 함께 웹이 폭발적으로 성장하면서 저렴한 운영체제에 대한 수요가 증가하고 있습니다. 이러한 맥락에서 오픈소스이고, 무료이면서, 커뮤니티에 의해서 빠른 속도로 발전하고 있는 리눅스의 수요가 폭증하고 있죠.
명령을 하는데 두 가지 방식이 있습니다.
첫 번째는 명령어를 통해서 제어하는 것입니다(CLI - Command Line Interface). 예를 들어 파일들의 목록을 보고 싶으면 ls -al을 쳐서 현재 머물고 있는 디렉토리의 목록을 볼 수 있습니다.
두 번째. 마우스로 아이콘을 선택해서 제어할 수 있습니다.(GUI - Graphical User Interface)
리눅스는 첫 번째의 방식인 CLI를 이용해 제어합니다. 그리고 linux는 대소문자를 구별합니다.
디렉토리와 파일
리눅스에서 중요한 점은 명령어가 현재 머물고 있는 디렉토리 안에서 이루어진다는 것입니다. 여기 밑에는 각각의 명령어가 있습니다.
pwd -\> 현재 자신이 위치한 디렉토리를 알려줍니다. (print working directory)
ls -\> 현재 디렉토리의 파일 목록을 출력하는 명령어입니다. (list)
touch empty.txt -\> empty.txt라는 이름의 빈 파일이 만들어집니다.
mkdir dir -\> dir이라는 디렉토리가 만들어집니다. (make directory)
cd 이동할 디렉토리의 경로명-\> 디렉토리를 변경합니다. 경로의 이름을 조금만 입력하고 tab을 누르면 자동 생성됩니다. (change directory)
그냥 ls를 치면 empty.txt와 hello와 같이 그냥 이름만 나오게 됩니다. so, ls뒤에 옵션을 붙여주면 더 자세한 정보를 얻을 수 있습니다. 예를 들어 ls -a, ls -al같이. 이를 파라미터를 넣는다고 합니다.
그리고 ls -al를 쳤을 때 맨 앞에 drwxrwxr 뭐 이런 식으로 나오는데 d가 있으면 디렉토리란 뜻이고 없으면 파일이란 뜻입니다.
상대경로와 절대경로
상대경로는 현재 디렉토리의 위치를 기준으로 다른 디렉토리의 위치를 표현하는 것으로 ..은 부모 디렉토리를 의미합니다. 'cd ..'은 현재 디렉토리의 부모 디렉토리로 이동하는 명령이 됩니다. 참고로 현재 디렉토리는 '.' 입니다.
절대경로는 최상위 디렉토리를 기준으로 경로를 표현하는 것을 의미합니다. 최상위 디렉토리는 루트(root) 디렉토리라고 하고 '/' 입니다. 'cd /'는 최상위 디렉토리로 이동한다는 뜻입니다. 'cd /home/egoing'은 현재 디렉토리가 무엇이건 언제나 '/home/egoing'을 의미하는데 이런 식의 경로 표현을 절대경로라고 합니다.
clear -\> 현재까지 썼던 명령어가 깔끔하게 지워집니다.
rm 파일명 -\> 파일이 삭제됩니다. (remove)
rm -r 디렉토리명 -\> 디렉토리가 삭제됩니다. -r을 따로 붙여주는 이유는 파일보다 디렉토리가 더 위험하고 조심해야 되기 때문입니다.
rm –help -\> 명령어 –help를 치면 그 화면에서 어떻게 쓰는지 알려줍니다. 예를 들어 cd –help처럼 쓰면 됩니다.
man ls -\> man도 마찬가지로 메뉴얼이 나오는데 아예 다른 쪽으로 넘어가서 –help보다 더 자세히 알려줍니다.
man에서 단어를 찾으려면 /를 하고 원하는 단어를 찾으면 되고 다음 단어로 넘어갈 때는 n을 누르고 빠져나올 때는 q를 누르면 됩니다.
man이나 help를 보시면 알겠지만 -가 하나 있으면 축약형 -가 2개면 풀네임으로 합니다.
mkdir -p dir1/dir2/dir3/dir4 -\> 부모 디렉토리를 생성해주면서 디렉토리를 생성합니다. mkdir를 해주면 하나하나 다 만들어야 하니까요.
ls는 상당히 중요한 명령어입니다. ls -a를 치면 현재 디렉토리에 있는 모두 보여주는데 숨김 파일은 앞에 .이 붙습니다. 즉, ls -al을 치면 숨김 파일과 구체적인 것 다 나오는 것이죠. 그리고 man에 보면 나와있다시피 ls -alS를 치면 파일 크기대로 순서대로 정렬해 보여줍니다.
cp /dev/test /var/html/test -\> 파일을 복사할 수 있습니다. 파일 위치 및 파일 경로를 써주면됩니다.(copy)
cp -r /dev/test /var/html/test -\> 폴더를 복사할 수 있습니다.
mv /dev/test /var/html/test -\> 파일을 옮기거나 파일 이름을 변경할 수 있습니다. 그대로 파일 이름만 써주면 파일이름이 변경됩니다.
google에서 필요한 명령들을 검색하는 법
자신에게 필요한 명령을 검색할 때는 google을 이용하는 게 좋습니다. google이 아무래도 전 세계에서 많이 사용하다 보니 네이버보다는 지식과 정보가 훨씬 많이 널려 있는 것 같습니다. 이를 위해서라도 영어가 절실하게 됩니다 ㅠㅠ 명령어를 검색하는 것도 create directory in linux 또는 file copy in linux 이런 식으로 영어로 검색하면 잘 나옵니다.
명령의 빈도수
모든 명령어를 처음부터 알고 있을 필요는 없습니다. 빈도수가 높은 명령어들을 중심으로 알고 있다가 그 외의 것들은 맥락적으로, 경험적으로 알아가면 됩니다. 결과적으로 의미있는 통계는 찾지는 못했습니다만, 자기가 사용한 명령의 빈도를 통계 내는 방법을 찾았습니다.
history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head -10 |
sudo(substitute user do)
옛날에 컴퓨터가 비쌌던 시절, 하나의 운영체제를 여러 사람이 쓰다 보니 권한(permission)이 생겼습니다. 그리고 또 만약 평소에 우리들이 항상 root의 사용자로 쓰게 된다면 rm -rf / 같은 문장을 썼을 때 모든 걸 삭제하기 때문에 아주 위험한 일이 벌어집니다. 그래서 처음에는 일반 사용자로 사용하다가 경우에 따라 높은 권한인 sudo를 써서 사용하면 됩니다. 예를 들어 git을 설치하기 위해 리눅스에서 apt-get install git을 쓰면 git이 설치가 안 되고 permission denied가 뜹니다. 권한이 높아야 설치가 가능하다는 뜻이죠. 그래서 sudo apt-get install git을 쓰면 설치가 됩니다.
Package manager
패키지라는 것은 간단하게 앱이라고 보면 됩니다. ls, mkdir도 모두 패키지(프로그램)입니다. 오늘날의 리눅스, 유닉스는 패키지 매니저(애플의 앱스토어 느낌)를 기본적으로 제공합니다. 리눅스의 대표적인 패키지 매니저는 apt, yum이고 두 가지가 있는데 apt가 많이 쓰이기 때문에 얘만 설명하겠습니다
sudo apt-get update -\> 설치할 수 있는 프로그램의 목록이 다운받아집니다.
sudo apt-cache search htop -\> 업데이트된 목록 중에서 htop이라는 걸 찾습니다.
top -\> 리눅스에서 기본적으로 설치 되어있는 작업관리자. (q를 누르면 빠져나감.) 보기가 어려우니 그래픽컬하게 보여줄 수 있는 htop을 설치해줍시다.
sudo apt-get install htop -\> htop을 설치합니다.
htop -\> htop을 실행시키면 신기하게 그래픽컬하게 나옵니다. (sudo htop을 하는 게 더 정확합니다. 더 많은 프로그램이 나오죠. )
sudo apt-get upgrade htop -\> htop을 업그레이드를 실행합니다. htop을 빼고 하면 모드 프로그램을 업그레이드 시킵니다.
sudo apt-get remove htop -\> htop을 삭제합니다.
다운로드 방법(wget, git)
윈도우에서는 그냥 브라우저에서 클릭만 하면 다운받아집니다. 그렇다면 CLI에서는 어떻게 다운로드를 할까요? CLI에서는 다운로드할 때 프로그램이 필요합니다. wget이라는 프로그램에서 url을 복사해 그대로 붙여넣으면 됩니다. 그런데 그냥 download라고 알아서 정해지기 때문에 이쁘지 않죠. 저장하면서 바로 파일명을 바꾸고 싶다면
wget -O paris.jpeg url~을 써줍니다. 그러면 paris.jpeg로 저장이 됩니다.
git은 버전관리시스템입니다. git 통해서 만든 프로그램을 github에 올려 온라인상으로 공유할 수 있습니다. (오픈소스 프로젝트를 사용하는 법.)
소스코드를 받는 방법에는 그냥 다운로드 받는 방법과 git을 통해서 받는 방법이 있습니다. git을 통해서 받는 방법을 알아보겠습니다. Clone or download을 누르면 URL이 나옵니다. 이 URL은 오픈소스 프로젝트의 소스코드의 주소입니다. 리눅스는 기본적으로 설치되어 있는 경우도 있고 아닌 경우도 있습니다. 없을 경우에는 아까처럼 sudo apt-get install git을 치면 됩니다. 설치가 됐다면 git clone url.git react_src을 쓰고 url에 내가 원하는 프로젝트의 소스코드 url을 붙여넣으면 됩니다. 그리고 나서 ls를 누르면 react_src라는 디렉토리가 생성되어있고 그 안에 url의 소스코드가 들어가 있습니다.
왜 CLI인가?
GUI VS CLI가 있습니다. 어떤 게 에너지를 많이 쓸까요? GUI방식이 훨씬 더 에너지를 많이 씁니다. 일반인들이 사용하는 컴퓨터시스템은 마우스같이 편하게 쓰기 위해서 GUI를 씁니다. 그러나 개발자들은 CLI를 써서 CPU도 적게 쓰고 메모리도 덜 차지하게 할 수 있습니다. GUI는 배우기는 쉬우나 순차적으로 진행되는 일을 자동화하기 어렵습니다. 그러나 CLI는 자동화할 수 있습니다.
디렉토리를 생성하고 디렉토리에 들어가야하려면 어떻게 해야할까요?
mkdir why
cd why 를 해야겠죠? (rm -rf why 지우기)
mkdir why;cd why를 쓰면 동시에 가능합니다.
즉, CLI를 이용하면 프로그램을 실행했을 때 순차적으로 해야될 일을 적어서 컴퓨터에 보내주면 컴퓨터가 알아서 해주고 최종적인 결과물을 우리에게 보내줄 수 있습니다.
파이프라인(pipeline)
명령의 실행결과를 다른 명령의 입력으로 주는 것입니다. 정말 강력하죠.
많은 데이터정보를 linux.txt에 저장한 후, ( 참고로 cat linux.txt를 치면 linux.txt를 그 리눅스 화면상에서 보여줍니다)
grep linux linux.txt를 치면 linux.txt에서 linux라는 단어 들어가 있는 행을 출력해줍니다.
파이프를 이용하면 무궁무진하게 이용할 수 있습니다.
ls –help | grep sort -\> ls –help에서 나온 결과물을 파이프로 연결해서 grep sort의 입력으로 줍니다.. |
ls –help | grep sort | grep file -\> sort가 포함되어 있으면서 file도 포함되어 있는 걸 찾을 수 있습니다.. |
즉 | (pipe)는 앞에 있는 프로그램의 출력을 뒤에 있는 프로그램의 입력으로 줄 수 있는 것입니다. |
예를 들어, ps aux -\> 현재 실행되고 있는 프로그램의 목록이 나오고
ps aux | grep apache -\> apache가 포함된 행을 출력해줍니다. |
IO Redirection
IO는 Input과 Output입니다. 만약에 ls -l의 결과를 파일에 저장하고 싶을 때는 어떻게 할까요?
ls -l \> result.txt를 하면 result.txt에 결과가 저장됩니다. 이렇게 화면으로 출력되는 것이 기본인데 화면으로 출력되는 방향을 어떤 곳으로 바꾸는 것이 바로 IO Redirection입니다.
ls, mkdir 이런 것들이 Unix Process라고 보시면 됩니다. 얘네들은 기본적으로 Input과 Output을 가지고 있습니다. 여기서 가장 기본적인 Input은 Command-line Arguments라고 하는 것인데 ls -al에서 -al을 뜻하는 거라고 보면 됩니다. 즉, 프로그램의 입력 값이죠. 그리고 기본적인 Output은 Standard Output입니다. Standard Output은 모니터에 출력하는 것인데 이를 파일로 바꾸는 것이 Redirection인 겁니다. 그리고 Redirection을 위해서는 \> 기호가 필요합니다.
오른쪽에 보면 Standard Error도 있는데 이는 오류가 있을 때 별도의 Error 출력을 냅니다.
없는 파일 rename2.txt를 rm rename2.txt 하게 되면 당연히 '없는 파일을 삭제할 수 없다'고 뜹니다. 그렇다면 그 오류 메세지 자체를 파일로 저장하고 싶을 때는 re rename2.txt \> result.txt라고 쓰면 되겠죠? 하지만 안 됩니다. 그 이유는 꺽쇠(\>)안에 숫자가 생략되어 있는데 기본적으로 1입니다. 1\>은 Standard output(모니터에 출력하는 것)을 뜻하고 2\>는 Standard Error output을 뜻합니다. 즉, 아까 re rename2.txt \> result.txt은 Standard output을 Redirection한 것입니다. Standard error를 Redirection한 게 아니구요. 그래서 오류 메세지를 전할 때는 rm rename.txt 2\> error.log 이런 식으로 쓰면 됩니다.
rm rename2.txt 1\> result.txt 2\> error.log 이렇게 할 수도 있습니다.
하나의 Input과 두 개의 Output이 쓰입니다.
그냥 cat을 치면 입력을 대기하고 있습니다. 사용자가 입력하는 정보를 받습니다. cat은 Unix process인데 cat \< hello.txt와 cat hello.txt가 동일하게 작용합니다. 다른 점은 cat hello.txt는 cat이라는 프로그램의 인자(Command-line argument)로 입력한 값이고 cat \< hello.txt는 인자가 아니라 Standard Input으로 받은 것입니다. 즉, 파일 안에 포함되어 있는 내용을 cat의 입력 값으로 줄 수 있는 것이죠. 즉 두 가지 방식으로 입력 받은 것입니다.
head -n1 linux.txt를 하면 한 줄만 출력해줍니다. 이는 Command-line argument이죠. 만약 head -n1 \< linux.txt를 하게 되면 -n1이 Command-line argument이고 Standard Input이 \<가 됩니다.
이를 저장하고 싶다면 head -n1 \< linux.txt \> one.txt가 되는 겁니다. one.txt를 출력하면 그 한 문장이 나오는 것이죠. 즉 linux.txt가 head -n1의 표준 입력이 되고 그 처리 결과가 one.txt에다 출력을 한 것입니다.
즉, Unix계열의 프로그램에는 기본적으로 Standard Input(키보드로 입력하는 값)이 있고 Standard Output, Standard Error라는 Stream을 갖고 있습니다.
출처 : http://slideplayer.com/slide/5384816/
Append
ls -al \> result.txt를 하면 result.txt에 저장이 되겠죠? 다시 한 번 ls -al \> result.txt을 하면 result.txt가 추가되어서 나오겠죠? 그런데 이는 계속 덮어씌우는 방식으로 되는 겁니다. 우리는 그걸 추가하고 싶고. 그 방법은 꺽쇠를 두 번 쓰면 됩니다. ls -al \>\> result.txt를 하게 되면 Redirection한 걸 추가한다는 뜻입니다.
Unix에서 휴지통, 낭떠러지 같은 느낌의 장소가 있는데 ls -al \>/dev/null을 해주면 그냥 그 정보를 버린다는 뜻입니다.
Shell과 Kernel
kernel은 알맹이, 핵심이라는 뜻이 있고 shell은 껍데기, 주변이라는 뜻이 있습니다. 우리가 리눅스에서 명령어를 치는데 ls -al이라고 치면 Shell이 명령어를 해석해 kernel에게 전달합니다. kernel은 하드웨어에게 전달하고 다시 똑같이 사용자에게 전해주기 위해 올라옵니다. user \> shell \> kernel \> hardware 식으로 되어있는 것이죠. 여러분이 직접 kernel을 제어하는 것은 어렵기 때문에 shell이라는 프로그램이 해석해서 주는 것입니다.
터미널에서 echo "hello" 이것은 그냥 뒤 글자를 나타내 주는 것입니다.
echo $0를 해보세요. bash가 나오면 우리는 bash라는 shell 프로그램을 쓰고 있는 것입니다.
자 그러면 다른 shell을 써보죠. zsh가 안 깔려있으면 sudo spt-get install zsh를 이용해 설치해줍니다. 설치하고 zsh를 실행시킨 후 echo $0을 쓰면 zsh가 나오는 것을 확인할 수 있습니다. bash와 zsh은 부모가 같아 비슷하지만 zsh가 좀 더 많은 기능을 갖고 있어 편리합니다.
우분투같은 경우에는 cd /home/ubuntu로 들어가야 하지만 zsh같은 경우에는 h/u/앞글자만 따서 치고 tab을 누르면 쉽게 변환됩니다. 그리고 cd /home/ubuntu/why로 들어간 후, /home/ubuntu에 있는 dir1으로 갈 때 zsh에서는 cd why dir1을 해주면 쉽게 갈 수 있습니다. 이렇게 각각의 shell마다 편의성이 다릅니다.
즉, 각각의 사용자들이 다른 쉘을 통해서 같은 kernel을 제어하고 있는 것입니다.
Shell Script
Script는 대본, 각본이라는 뜻이 있습니다. 어떻게 움직여야 할지 흐름이 적혀 있는 것이 Script입니다. 즉, 우리가 여러 가지의 명령어를 알고 있다면 그 명령어를 이용해서 흐름을 작성할 수 있는 것이죠. 그 순차적인 명령들을 저장해 놨다가 필요할 때 꺼내 쓰면 됩니다. 즉, 작업을 자동화할 수 있습니다.
mkdir script
cd script/
touch a.log b.log c.log
ls -l 을 하면 세 개의 빈 로그 파일이 생성된 것을 알 수 있습니다.
mkdir bak
cp *.log bak
ls -l bak를 하면 bak에 파일이 복사되어 저장되어 있는 것을 알 수 있습니다.
이 때, mkdir bak을 하면 이미 파일이 있으니 만들 수 없다고 뜹니다. 없다면 만들고 있다면 만들지 않도록 하려면 어떻게 해야 할까요?
일단, 우리가 쓰고 있는 shell인 bash도 프로그램 입니다. ls /bin을 치면 기본적인 유닉스 계열의 프로그램이 나오는데 그 중에 bash라는 프로그램이 있고 이전 시간에 썼던 zsh라는 프로그램도 여기 있습니다. 여러분이 쓰던 mv, rm도 모두 프로그램인 것을 알 수 있습니다.
vi backup을 써서 백업 파일을 만듭니다. 여기다가 첫 줄은 항상 이렇게 씁니다. 여기부터 읽는다는 말이죠. 그 다음에는 bash라는 프로그램의 문법을 쓰면 됩니다.
#!/bin/bash
if ! [-d bak]; then //현재 디렉토리에 bak라는 디렉토리가 존재하는가? !는 존재하지 않는다면
mkdir bak
fi //조건문이 끝났다.
cp *.log bak
그리고 그냥 저장하면 됩니다. 그리고 backup이라는 파일을 실행시키기 위해서는
./backup을 하면 되는데 permission denied가 뜹니다. 이는 권한이 없기 때문에 일어나는 현상인데 이걸 실행시키려면 chmod +x backup 해주면 됩니다. 그리고 나서 ls -l 을 하면 색깔이 달라집니다. 그리고 -rw-rw-r–에서 -rw-rw-r-x로 바뀌어 뒤에 x가 붙는데 이는 executable이라는 소리로 현재 실행가능 하다는 뜻입니다.
rm -rf bak를 해주고 ls -l을 해주고 ./backup을 해보면 카피된 것을 알 수 있습니다. 현재디렉토리라면 ./을 붙여줘야합니다.
디렉토리의 구조(Directory structure)
명령어 시스템에서 디렉토리는 정리정돈의 수단으로써 매우 중요합니다. 그리고 유닉스 계열은 어느정도 디렉토리의 위치에 정해진 규칙이 있습니다. /를 가서 ls를 쳐봅시다.
/는 root입니다.
/bin은 User Binaries로 여러 프로그램들이 있는 곳입니다. 일반 사용자들이 쓰는 곳입니다.
/sbin은 System binaries로 시스템 프로그램들이 있습니다. 컴퓨터를 끄거나 재사용할 때 이런 프로그램들이 실행됩니다.
/etc는 Configuration Files(설정 파일)로 컴퓨터에 대한 어떤 행동을 할 때 그 행동을 바꿔 주기 위한 파일들입니다. 실제로 sudo로 실행시켜 설정을 바꿔줄 수 있습니다.
/dev와 /proc은 대체로 잘 쓰지 않아 넘어가겠습니다.
/var는 Variable Files로 내용이 바뀔 수 있는 파일들이 들어가 있습니다. 가령, bin, sbin에 있는 프로그램은 업데이트를 하기 전까지 바뀌지 않지만 잘 바뀌는 파일들은 여기에다 넣습니다.
/tmp는 Temporary Files는 임시 파일입니다. 여기는 컴퓨터를 껐다 켜면 사라졌다가 다시 나타나는 파일들입니다. 그래서 여기에는 영구적인 파일을 절대 넣으면 안 됩니다.
/usr은 User Programs인데 기본적으로 유닉스 계열에 설치가 되어서 번들 형식으로 사용자에게 제공되는 프로그램들은 이 곳의 bin이나 sbin에 저장됩니다. 이렇게 bin과 sbin이 usr에 나눠진 이유는 옛날에 플로피 디스크가 있었을 때, 그 때는 용량이 너무 작아서 따로 따로 나눴어야 했습니다. 그래서 컴퓨터가 꺼져 있을 때는 root에 있는 bin과 sbin 켜져 있을 때는 usr에 있는 bin과 sbin으로 나눴다네요. 그리고 usr은 또 이제 home이라는 디렉토리가 생기면서 usr에는 사용자의 데이터가 생기지 않는다고 합니다.
/home은 Home directories인데 사용자의 디렉토리입니다. 여러분이 저장하려고 하는 건 여기에 모두 저장이 됩니다. 이 디렉토리로 갈 때 cd /home/ubuntu로 할 수도 있지만 cd ~만 해도 자기 자신의 사용자로 갈 수 있습니다.
/boot은 운영체제와 아주 깊은 곳에 관련이 있기 때문에 넘어갑시다.
/lib은 System Libraries로 공통적으로 사용되는 라이브러리가 있는 곳입니다.
/opt는 Optional add-on Application으로 프로그램을 다운 받을 때 위치가 자동으로 지정되어 저장되나 가끔 수동으로 저장할 때가 있는데 그럴 때 여기다 저장하면 되겠습니다.
/mnt와 /media는 잘 쓰이지 않으므로 넘어가겠습니다.
프로세스
프로세스가 무엇인가를 제대로 알아봅시다. 보통 CPU -\> processor// RAM -\> Memory// SSD, HDD -\> Storage라 이야기 합니다. 컴퓨터 안에 이렇게 나눠져 있는 이유는 각각의 역할이 나눠져 있기 때문입니다. CPU는 처리 속도가 매우 빠른데 Storage는 속도가 느려서 CPU의 처리 속도를 못 따라갑니다. 프로그램들은 Storage에 저장되어 있는데 Memory에 적재되어 CPU가 그나마 빠르게 처리할 수 있도록 한 것이죠. 즉, 리눅스에 있는 mkdir, top, rm 등등도 프로그램인데 이들도 Storage에 있다가 마찬가지로 Memory에 적재되어 CPU가 실행하는 것입니다. 이렇게 실행되고 있는 상태의 프로그램을 프로세스(process)라고 합니다.
프로세스 모니터링이라고 실행중인 프로세스를 볼 수 있는 방법이 있는데 리눅스에서 ps라 치면 앞에서만 실행하고 있는 것들을 보여줍니다. 백그라운드에 있는 프로세스를 다 보려면 ps aux라 치면 됩니다. 만약에 apache라는 텍스트를 포함하고 있는 프로세스를 출력하고 싶다 하면 ps aux | grep apache라 치면 됩니다. 프로세스 ID를 알고 있으면 프로세스를 죽일 수 있습니다. sudo kill 22142라 치면 강제로 종료됩니다. |
sudo htop을 하면 프로세스를 자세히 볼 수 있습니다. 실제적인 물리 메모리량을 보려면 RES를 쓰시면 됩니다. load average를 보면 CPU 점유율을 알 수 있는데 첫 번째 자리는 1분간의 CPU점유율(현재 상태), 5분, 10분식 입니다. 코어가 몇 개냐에 따라 숫자가 의미하는 바가 달라집니다. 코어가 4개인데 4면 적절하게 잘 쓰고 있는 것이죠.
파일을 찾는 법
파일은 두 가지 용도로 사용됩니다. 데이터를 보관하기 위한 용도, 해야 될 일에 대한 명령어를 보관하기 위한 용도로 사용됩니다. 그 파일이 뭐가 됐건 간에 파일을 찾는 방법에 대해 알아보겠습니다.
locate *.log 라고 치면 확장자가 log인 파일을 모두 찾아줍니다. 제일 간편하게 할 수 있는 방법입니다. 디렉토리를 뒤지는 것이 아닌 데이터베이스(mlocate)를 뒤져서 찾습니다.
find라는 명령어도 있는데 루트 디렉토리부터 시작하려면 find /이고 현재 디렉토리부터 시작하려면 find .이다.
가령 find . -name *.log 라 치면 확장자가 log인 파일을 모두 찾아줍니다. 물론 현재 디렉토리부터!
find . -type f -name tecmint.php 이 뜻은 파일을 찾는데 현재 디렉토리부터 찾고 파일의 이름은 tecmint.php이다. 그리고 -type f는 확장자가 파일이라는 뜻! 즉, tecmint.php라는 디렉토리가 있더라도 찾는 목록에서 빠진다는 소리다.
find . -type f -name "tecmint.txt" -exec rm -f {} \; 이 뜻은 그 파일 찾아서 rm을 실행시키는데 -f니까 묻지도 따지지도 말고 삭제하라는 뜻. {}는 인수인데 명령을 통해서 검색한 파일의 이름이 {}에 위치한다는 뜻이다. 정확히는 무슨 뜻인지 모르겠다 ㅠㅠㅠ(??)
whereis는 실행파일이 어디에 있는지 말해주는 프로그램입니다. whereis ls라고 치면 ls라는 프로그램이 어디에 있는지 뜨고, 그 뒤에는 man ls를 썼을 때 나오는 메뉴얼이 어디에 있는지 나옵니다.
혹시 ls를 치는데 어디서든지 가능한 걸 보고 궁금한 점을 느끼지 않으셨나요? 정작 ls는 bin/ls에 있는데 말이죠. 그 답은 $PATH에 있습니다.
echo $PATH를 치면 :을 통해서 정보들이 구분되어 있고 그 구분되어 있는 정보는 경로를 나타내죠. 즉, ls를 치면 운영체제는 $PATH에 있는 경로들을 모두 갑니다. 그 경로에서 ls라는 걸 찾아 실행시키는 것이죠. 이런 변수를 환경 변수라고 합니다.
백그라운드 실행
여러 개의 일을 하나의 화면에서 할 수 있는 것을 멀티 태스킹이라고 합니다. GUI에서는 그냥 화면을 뒤로 보내면 되니 매우 편하죠. 즉, 두 개의 화면을 앞으로 뒤로 하면서 동작하게 할 수 있는데 그게 리눅스에서도 가능합니다.
vi를 실행시키고 있다가 Ctrl + z를 누르면 실행중인 프로그램을 백그라운드로 보내집니다. 이 기능을 실행하면 백그라운드에 가기 때문에 실행중인 프로그램에 있는 명령어가 일시 정지됩니다.
여기서 jobs라고 치면 백그라운드 작업들의 목록을 보여줍니다.
jobs에서 +기호는 fg를 했을 때 나타나는 프로그램을 뜻합니다.(foreground) -는 그 다음 순서고 아무 것도 없는 것은 그 다음 다음 순서를 나타냅니다.
(jobs에 있는 혹은 그냥)프로그램을 종료하고 싶다면 kill %4라고 하면 4번 목록에 있는 프로그램이 삭제가 되는데 이 명령은 좀 약한 명령어고 이 명령어를 쳐도 삭제가 안 된다면 kill -9 %4를 쳐서 삭제하면 됩니다.
그리고 ls -R을 치면 길게 나타나는데 -R 옵션은 현재 디렉토리가 아니라 그 밑에 있는 모든 파일과 디렉토리를 보여줍니다. ls -R / \> result.txt 2\> error.log 이 명령어를 치면 모든 항목을 result.txt에 저장하고 error가 있다면 error.log에 저장한다는 소리입니다. ls -R을 치면 그 항목이 매우 많기 때문에 시간이 오래 걸릴 수 있습니다. 그 시간 동안은 우리가 뭘 할 수 없는 것이죠.
그래서 이 실행 자체를 백그라운드로 보낼 수 있습니다. 그냥 맨 끝에 한 칸 띄고 &를 붙이면 됩니다. ls -R / \> result.txt 2\> error.log &라고 치면 이 명령어 실행이 백그라운드로 가서 jobs로 확인할 수 있고 그 작업이 끝났을 때 엔터를 치다보면 Exit이라고 뜨게 됩니다. 그러면 그 작업이 끝난 겁니다.
항상 실행(daemon, service)
daemon이라는 것은 반신반인이라는 뜻이 있는데 컴퓨터 쪽에서는 어떤 프로그램의 특성이라고 할 수 있습니다. 이 특성을 가진 프로그램은 항상 실행됩니다. 비유를 하자면 냉장고, 도어락, 인터넷 모뎀같은 존재라고 할 수 있겠습니다. TV같이 필요할 때 켜고 끌 수 있는 것인 ls, mkdir, rm등은 daemon이 아닌 프로그램입니다.
클라이언트와 서버의 관계를 보면 클라이언트가 정보가 필요할 때 서버에 접속해 정보를 가져옵니다. 어떻게 보면 서버는 클라이언트가 언제 정보를 가져갈지 모르니 서버의 고충이라고 할 수 있죠. 이렇게 서버에는 Server라는 프로그램이 있는데 이게 daemon, service에 해당됩니다. 그래서 항상 켜져있죠.
우선 저는 apache라는 웹 서버를 설치하겠습니다. sudo apt-get install apache2를 칩니다.cd
cd /etc/init.d/라고 치면 그곳에 apache가 있습니다. 이 곳은 daemon프로그램을 가지고 있는 장소입니다. daemon프로그램들을 켜고 끄는 방식은 조금 다릅니다.
sudo service apache2 start라고 하면 apache2가 켜집니다. 켜진 것을 확인하려면 ps aux | grep apache를 했을 때 켜진 것을 확인하실 수 있습니다. |
끌 때는 sudo service apache2 stop이라고 치시면 됩니다. 그리고 나서 ps aux | grep apache2를 하면 딱 하나 grep –color= 뭐 이런 식으로 하나가 뜨는데 그 것은 grep이라는 명령어를 실행했을 때의 프로세스를 말하는 것입니다. service를 통해서 켜고 끄는 daemon프로그램들 대부분은 start와 stop으로 켜고 끌 수 있습니다. |
daemon들은 컴퓨터를 킬 때 자동으로 실행돼야할 필요성이 있는데 그런 경우, cd ..를 통해 etc로 가면 rc0.d/부터 쭉 나오는데(OS마다 경로가 다를 수 있습니다) 여기서 rc3.d/가 shell을 쓰는 경우의 디렉토리이고 rc5.d/는 만약 GUI방식을 쓰는 경우의 디렉토리 입니다. 그리고 ls -l을 해보면 리스트가 쭉 나옵니다.
apache2 부분을 봐주세요. 처음 부분에 lrwx뭐시기 적혀있는데 맨 앞부분이 l이면 link라는 소리입니다. 오른쪽에 보면 원래 파일은 ../init.d/apache2에 있는데 S02apache2라는 이름으로 링크를 건 것입니다. (윈도우의 바로가기 느낌) link가 S로 시작된다면 이 링크로 해당되는 프로그램이 etc/rc3.d에 있을 때 자동으로 실행된다는 뜻입니다. K로 시작되면 Kill로 껐다는 소리죠. S뒤에 있는 01 02는 우선순위입니다.
이를 자동실행을 해주려면 etc/rc3.d에서 ./S02apache2 현재 디렉토리(./)를 쓰고 자동으로 하고싶은 프로그램의 링크를 쓰면 됩니다. 자연스럽게 이것은 아파치라는 프로그램이 init.d에 있고 여기에 없음에도 불구하고 마치 아파치가 있는 것처럼 동작합니다.
정기적으로 실행 (cron)
cron은 정기적으로 명령을 실행시켜 주는 도구(프로그램)입니다. 이는 누군가에게 정기적으로 데이터를 전송하든지, 정기적으로 백업을 하든지의 용도로 쓰입니다.
crontab -e라고 치면 에디터가 뜨는데(처음 실행하면 어떤 에디터를 쓸 것인지 물어봅니다)
맨 밑에 m h dom mon dow command라고 적혀 있습니다. 여기서 m(minutes)은 분당 몇 번을 실행할 것인지를 묻는 것입니다. */1이라고 적으면 1분당 한 번, */10이라고 적으면 10분당 한 번입니다. 그 다음에 h(hours)(0~23)인데 *으로 적으면 시간과는 상관없이 실행된다는 뜻입니다. 만약 m h에 10 1로 적었다면 1시 10분에 실행된다는 뜻이죠. dom(day of month)은 매달 며칠(1~31)에 실행할 것인가 입니다. 24로 적는다면 매달 24일이란 뜻입니다. mon(month)은 몇 월(1~12)인지를 묻는 것입니다. dow(day of week)는 요일입니다. 0~6인데 0이 sunday부터 시작입니다. dom, mon, dow는 모두 *로 적어주세요. */1 * * * * 이렇게
그리고 백그라운드로 빠져나와주세요(ctrl + z).
date를 하면 날짜가 나오는데 date \> date.log를 해서 저장해주고 cat date.log로 한 번 확인해 준 후, date \>\> date.log로 현재 시간을 추가해주세요.
그리고 fg로 에디터에 간 후, */1 * * * * date \>\> date.log를 씁니다. 그리고 저장, 나오기.
crontab -l로 우리가 처리한 내용을 출력하고 그 내용을 보려면 cd ~로 현재 디렉토리로 갑니다. 잘 업데이트 되고 있는지 확인하는 방법은 tail -f date.log치면 되는데 그냥 tail date.log를 치면 그 파일의 제일 끝에 있는 텍스트를 출력해줍니다. 옵션에 중간에 -f를 넣으면 자동으로 date.log를 감시하고 있다가 끝에 텍스트가 추가가 되면 출력해주는 명령어가 됩니다. 필수적인 명령어입니다! 나올 때는 ctrl + c를 눌러주면 됩니다.
crontab -e에서 */1 * * * * date \>\> date.log 2\>&1 이처럼 끝에 2\>&1 이 문장을 추가하면 더 좋습니다. 이는 표준 에러(2)를 표준 출력(1)으로 리다이렉션 한다는 말인데 이렇게 하게 되면 에러가 났을 때 그 에러를 출력하는 문장을 date.log에 추가해주게 됩니다. 만약 이게 없다면 에러가 있어도 그냥 넘어가기 때문에 큰 문제를 일으킬 수도 있습니다. 이 때는 &를 붙여줘야 합니다.
cron Example
웹 브라우저에서 사용자가 입력하는 양식이 있어 그 양식(메일)을 서버로 전송을 한다고 합니다. 그런데 전송하는데 0.1초가 걸린다면 그리고 전송하는 사람이 10만명이라면 꽤나 긴 시간이 걸리겠죠? 그래서 서버는 그 메일을 받고 saved한 후, "글을 잘 작성되었습니다"라고 브라우저에게 보내게 됩니다. 그리고 cron이 정기적으로 서버에 있는 saved를 체크해 다른 사람들에게 메일을 보내게 되는 것이죠. 브라우저는 바로 다른 일을 해도 되는 것이고 서버로 간 메일은 시간 차가 있으면서 다른 사람에게 보내게 됩니다.
쉘을 시작할 때 실행
쉘이 시작될 때 어떤 명령을 실행하는 방법을 알아봅시다. 이 방법을 shell startup script라고 부릅니다. 시작하기 앞서 새로운 명령어를 알아보겠습니다. alias l='ls -al' 이렇게 쳐주면 l을 쳤을 때 그냥 ls -al을 친 것과 동일하게 작동합니다. 즉, 별칭을 붙여준 것입니다.
예를 들어서 alias c='clear' 이런 식으로 설정을 해주면 c만 눌렀을 때 바로 clear가 되는 것이죠.
어쨌든, bash라는 shell은 처음 bash를 실행시켰을 때 어떤 파일을 실행시키도록 설정되어 있습니다.( echo $SHELL이라고 치면 내가 쓰는 쉘이 어디에 있는지 나옵니다.) 사실, 맥락에 따라서 실행하는 파일이 조금씩 다르지만 이 부분은 복잡하기 때문에 쉽게 생각하기 위해서 하나의 파일을 수정하면 된다고 생각하면 되겠습니다. 그 파일의 이름은 .bashrc 입니다.
홈 디렉토리로 가서 vim .bashrc 라고 쳐서 파일을 들어가 봅니다. 이 파일은 다 있을 텐데 그 shell의 문법에 따라서 이미 짜여진 것입니다.
진짜로 그런지 확인해보기 위해서 맨 밑에 echo 'hi,bash' 라고 쓰고 저장해 놓습니다. exit을 한 후, 다시 켜보면 확인할 수 있습니다.
.bashrc는 설정파일이라 bash를 켜면 초록색 부분으로 나오는 프롬프트 부분이라던가 여러가지 설정을 바꿀 수 있습니다.
다중 사용자
컴퓨터가 있다면 처음에 혼자만 쓸 것입니다. 그러다가 여러 명이 같이 컴퓨터를 사용하게 되고 각자의 비밀이 생기게 됩니다. 이렇게 권한이 생기고 다중 사용자 시스템이라고 하는 게 탄생했죠. 다중 사용자 시스템에는 단점이 하나 있는데 시스템의 복잡도는 매우 높아진다는 것입니다. 누군가가 해도 되는지 안 되는지를 판단하기 위해서는 그 누군가가 하는 행위를 모두 판단해야 된다는 것인데 이는 쉬운 일이 절대 아닙니다. 자, 그럼 여러 명이 운영체제를 같이 사용하는 방법, 다중 사용자 시스템을 알아보겠습니다.
id를 쳐보면 uid를 시작으로 여러 개가 나오는데 uid는 지금 사용자 자신을 뜻합니다. gid는 그룹 아디를 뜻하고요.
who라고 입력해 봅시다. 그러면 이 컴퓨터에 접속한 아이디가 나오게 됩니다. 접속한 계정이 하나니 하나밖에 나오지 않네요.
관리자와 일반 사용자
유닉스 계열의 사용자에는 크게 두 가지 사용자가 있습니다. super(root) user와 user입니다. super user는 말 그대로 전지전능한 유저입니다. 전에 항상 써왔던 sudo는 super do라고 해서 super user가 하는 일(do)입니다. 일반 사용자는 sudo를 쓸 수 없습니다. sudo를 쓸 수 있다는 건 super user가 될 수 있는 권한이 있다는 뜻입니다. (즉, 현재 쓰고있는 우분투 사용자는 그냥 일반 사용자가 아닌 sudo를 쓸 수 있는 사용자)
일반적으로 super user는 root라는 이름을 갖고 있습니다. 우분투를 쓰고있는 사람은 기본적으로 super user가 막혀 있습니다. su라는 명령어는 super user가 되거나 user id를 바꿀 때 사용됩니다.(man su)
일반 사용자를 root로 변경하는 su - root를 쓰면 인증 실패가 뜹니다. 왜 그럴까요? 몇몇 운영체제(우분투 등등..)는 Root사용자를 막아 놨습니다. 그래서 처음에 root 비밀번호가 설정되어 있지 않은데 이는 sudo passwd root 명령으로 Root 비밀번호를 설정할 수 있습니다. 그러면 이제 su - root로 root 사용자로 들어갈 수 있습니다. root로 바뀌고 id를 쳐보시면 root인 것을 확인할 수 있습니다. super user를 사용하면 모든 문장을 사용할 수 있고 정보를 다 지울 수 있는 위험이 있어 주의해서 사용해야합니다. 가급적이면 일반 사용자로 활동하다가 예외적으로 sudo를 써서 활동합시다. 여기서 빠져나가려면 exit을 치면 됩니다.
만약 root계정에 Lock을 걸고 싶다면 sudo passwd -l root라고 치시면 됩니다. 이러면 lock이 걸리게 됩니다. 그리고 su - root를 쓰면 실패가 뜨죠. 반대로 풀려면 어떻게 해야 할까요? lock을 풀어야 하는데 sudo passwd -u root라고 치면 풀려지게 됩니다. (-u는 unlock의 약자입니다.)
super user는 그냥 user와 다른 방을 사용합니다. super user에서 pwd를 치면 /root가 나옵니다.
그냥 user는 Home디렉토리 안에 있죠. 일반 사용자가 /root로 가려면 접근이 되지 않습니다. /root는 루트 디렉토리 밑에 있는 root디렉토리입니다. 헷갈리면 안 됩니다.
사용자 추가
사용자 추가같은 경우 그냥 인터넷에서 찾아보면 됩니다. 구글에 unix add user라고 쳐보세요.
sudo useradd -m duru를 치면 password를 치라고 나옵니다. 그리고 나서 home 디렉토리로 가면 duru라는 디렉토리가 생성되어 있습니다. su - duru라고 쳐서 duru로 실행하고 싶지만 password를 치면 실패가 뜹니다. 이유는 당연히 duru에 대한 패스워드가 없으니까요! password를 셋팅 해줘야 합니다. sudo passwd duru라고 칩시다. 암호를 설정해주고 su - duru라고 하면 들어갈 수 있습니다. 그러면 duru라는 사용자는 sudo를 쓸 수 있을까요? 없습니다. 그럴 권한이 처음에 주어지지 않기 때문이죠. 그래서 sudo pwd라고 치면 sudoers 파일이 없다고 나오게 됩니다. exit을 해서 빠져나와 주세요.
sudo usermod -a -G sudo duru라고 쳐주세요. a와 G를 같이 쓰면 어떤 그룹에 속하게 됩니다. 그런 다음에 su - duru쳐서 들어가서 sudo pwd를 쳐주세요. 그러면 패스워드를 입력하라는 것이 뜨고 /home/duru로 들어가지게 됩니다. 즉, 위 명령문을 쓰면(-a -G) sudo라는 그룹에 들어가게 되어 그 권한을 사용할 수 있는 것입니다.
권한(permission)
*기본
permission은 user에게 file & directory에 대해 Read & Wrtie & Excute 할 수 있냐 없냐를 알게 끔 해주는 것입니다.
touch perm.txt를 쳐서 빈 파일을 만들어 주고 ls -l perm.txt를 해보면 권한이 적혀 있습니다. 있다가 자세히 알아볼게요. echo 'hi' \> perm.txt를 통해서 perm.txt에 hi라는 글자를 넣어주세요. cat perm.txt로 확인 한 번 해주고 pwd로 경로를 확인해주세요. 그리고 그 경로에 다른 사용자로 들어가서 perm.txt를 열어야 합니다. 새로운 터미널을 켜서 저번에 만든 새로운 사용자로 들어와주세요. su - duru로 말이죠. cd '아까의 경로'로 이동해주세요. 그리고 ls -l perm.txt를 해보세요. 됩니다. echo 'hello' \> perm.txt를 해보세요. 허가 거부가 뜨게 됩니다. 그러나 그냥 보여주는 cat perm.txt를 하면 읽을 수 있습니다. 사용자에 대한 권한에 따라서 읽고, 쓰고, 실행하는 것이 달라진다는 뜻입니다.
ls -l '원하는 파일' 명령을 통해서 그 '원하는 파일'이 어떤 조건을 가지고 있는지 알 수 있습니다.
위 사진에는 -rw-rw-r– 1 egoing egoing 0 Dec 4 23:19 perm.txt 라고 적혀있습니다. 이 문장을 구분해야하는데 - | rw- | rw- | r– | 1 | egoing egoing | 0 | Dec 4 23:19 | perm.txt 이렇게 나눌 수 있습니다. 차례대로 설명을 하겠습니다. 첫 번째는 -이면 파일이고 d면 directory라는 뜻입니다. 그 뒤로 rw-라고 적혀있는 것(두 번째)은 access mode로 처음 egoing 즉, 파일의 소유자인 owner의 권한입니다. r은 read, w는 write, 마지막은 x로 excute를 의미합니다. -로 나타나 있으면 안된다는 뜻이구요. rw-이니까 읽을 수 있고, 쓸 수 있지만 x가 없으니 실행할 수 없는 것입니다. 두 번째 egoing은 gruop을 의미합니다. 세 번째는 other 즉, 이 둘이 아닌 다른 사용자들을 뜻합니다. 그 람들에게는 읽기의 권한 밖에 없는 것이죠. 1과 0은 나중에 설명하도록 하겠습니다. |
*권한을 변경하는 방법(chmod)
이제 rw- 부분을 변경해서 다른 사람들이 아예 읽지 못하도록 해줄 수 있습니다. 이 방법은 access mode를 바꾸는 방법으로 chmod(change mode)라고 합니다. 각자 사용자(파일의 소유자와 그냥 일반 사용자)로 각각 들어가서 확인을 해봅시다. 파일의 소유자로 들어가서 chmod o-r perm.txt를 해주고 cat perm.txt를 쳐보세요. 됩니다. 하지만 일반 소유자에서 cat perm.txt로 하면 허가 거부가 뜹니다. 다시 읽을 수 있도록 해주려면 파일의 소유자로 들어가서 chmod o+r perm.txt와 chmod o+w perm.txt를 쳐서 읽고 쓸 수 있게 해줄 수 있습니다. 신기한 점은 파일의 소유자가 소유자의 권한을 없앨 수도 있습니다. chmod u-r perm.txt로요. 물론 바로 다시 추가해서 볼 수 있긴 합니다만 자기 권한도 없앨 수 있습니다.
*실행의 개념과 권한 설정
실행할 파일을 만들어 봅시다. hi-machine.sh라고 이름을 짓고, 파일을 작성할 때는 #!/bin/bash echo 'hi hi hi hi'라고 적어줍시다. #!/bin/bash를 맨 앞에다 적는 이유는 그 경로의 프로그램을 실행시키겠다는 소리입니다.
./hi-machine.sh를 실행하면 허가 거부가 뜨지만 /bin/bash hi-machine.sh를 하게 되면 잘 실행됩니다. 이유는 /bin/bash처럼 어떤 언어(프로그램)를 사용해서 그 파일을 실행할 때는 아무런 제약이 없어도 되지만 현재 디렉토리에서 실행하고 싶다면 실행 권한을 줘야합니다. 그리고 운영체제가 권한을 먼저 보기도 합니다. 이 때의 실행권한이 execute입니다. chmod u+x hi-machine.sh로 권한을 줄 수 있습니다. 초록색으로 되면서 실행가능 파일이라고 말해줍니다.
*directory의 권한
directory는 읽기, 쓰기, 실행의 권한이 애매합니다. 일단 mkdir perm;cd perm;echo 'hi' \> perm.txt; 를 해줍시다. 그리고 cd..을 통해 부모로 빠져나갑니다. chmod o-r perm으로 권한을 없애줍시다. 디렉토리에 한해서 r이라고 하는 access mode는 그 파일들의 열람을 보냐 마냐의 권한(ls -l perm)입니다. 그렇다면 w는 뭘까요? perm이라는 디렉토리 안에 파일을 생성하고 삭제하고 이름을 바꾸고 등등을 할 수 있냐 없냐(rm hello.txt, mv hello.txt hi.txt등등)입니다. x는 그 디렉토리 안에 cd명령을 통해 들어갈 수 있냐 없냐(cd perm)를 말하는 것입니다. 그러면 만약에 perm이라는 디렉토리 안에 또 perm이 있고 perm이 또 있고 하다면 어떻게 해야될까요? 디렉토리 안의 모든 디렉토리를 바꾸고 싶다면? chmod -R o+w perm을 하면 재귀적(Recursive)으로 perm이라는 디렉토리 안의 권한을 바꾸는 것입니다.
*chmod 사용법 정리
chmod o+w perm.txt를 하게 되면 user group other하나 하나씩 쳐야하니 불편함이 있습니다. 그래서 octal modes라고 8진수로 표현할 수 있습니다. 가령 예를 들어서 모두 실행만 하고 싶다면 chmod 111 perm.txt를 해주면 됩니다. 이런 식으로 숫자를 정해주면 됩니다. 신기한 건 이도 8진수와 같다는 것입니다. w(1)+x(2)를 하려면 그냥 wx(3)같이요.
chmod a=rwx perm.txt를 해주면 모든 사용자에게 rmx를 준다는 뜻입니다. 딱히 공부할 필요는 없습니다.
그룹(잘 안됌… )
파일의 소유자인 user도 아니고 외부 사람인 other도 아닌 그룹에 따로 권한을 줄 수 있습니다. 그룹은 이름을 지정해줘서 여러 사람이 속하게 할 수 있습니다.
cd /var를 쳐서 var디렉토리에 들어가주세요. 그리고 mkdir developer를 이용해 디렉토리를 만들어주는데 접근 거부가 뜹니다. ls -al을 쳐보면 거의 다 root로 되어있고 .(현재 디렉토리)을 봐도 root입니다. 우리는 root가 아니기 때문에 other이고 other의 접근 권한을 보면 쓰기가 안 됩니다. 그래서 그냥 하면 안 되고 sudo mkdir developer를 해서 만들어줍니다. 그리고 cd developer/로 들어와주세요.
echo 'hello' \> hello.txt를 쳐보세요. 접근 거부가 뜹니다. ls -al을 보면 이 것도 root로 되어있습니다. 그래서 접근 거부가 뜬 것이죠. group은 잘 안 쓰기 때문에 외우지 말고 그냥 검색해서 찾아보기만 하면 됩니다. man groupadd를 쳐보세요. 그러면 알 수 있습니다. groupadd developer를 치면 접근 거부가 뜹니다. 이는 다시 sudo 를 쓰면 되죠. sudo !!을 쳐서 전에 했던 명령어에 sudo를 써줍니다. vim /etc/group을 치면 여러분이 추가한 group이 여기 맨 끝에 추가가 됩니다.
usermod -a -G developer egoing이라고 치면 접근 거부가 뜨니 sudo를 붙여주세요. 그리고 다른 계정도 이 그룹에 추가하고 싶다면 뒤에 이름을 써주면 됩니다. 이를 적용시키려면 터미널을 껐다 켜야 합니다.
현재 디렉토리의 오너와 그룹을 바꾸고 싶다면 sudo chown root:developer .을 하면 됩니다.
echo 'hello' \> hello.txt를 해봅니다. 그래도 거부가 뜹니다. 이유는 w가 없기 때문이죠. sudo chmod g+w .를 해줍니다. 그리도 다시 해보면 됩니다.
인터넷, 네트워크 그리고 서버
google.com으로 들어가기 위해서는 172.21.25.7(ip address)로 들어가거나 google.com(domain name)으로 들어가는 방법이 있습니다. 전화번호를 눌러서 연결하거나 이름으로 연결하는 전화와 비유할 수 있습니다.
클라이언트가 google.com을 치게 되면 DNS 서버에 들려서 google.com의 데이터베이스를 찾아 ip주소를 찾아내어 접속하게 됩니다.
자신의 ip를 알아내려면 ip addr을 치면 됩니다. inet이 있는 부분을 찾아보면 ~~~/24로 되어있는데 ~부분이 ip입니다. 그리고 http://ipinfo.io/ip 이 사이트에 들어가시면 그 사이트에 접속한 ip를 분석해서 나에게 알려줍니다. 리눅스에서는 curl ipinfo.io/ip를 쓰면 쉽게 알 수 있고요. 신기한 건 이 ip들이 알아내는 방법에 따라서 다를 수 있다는 것이죠. ip addr을 쳤을 때 나오는 ip는 그 컴퓨터의 실제 ip입니다. ipinfo.io/ip에 나오는 ip는 외부에 접속할 때 사용되는 ip를 말하는 것입니다. 그래서 만약 위에 쓴 ip가 서로 같다면 그 컴퓨터의 실제 ip와 외부로 접속할 때 사용되는 ip가 같다는 소리입니다.
하지만 많은 경우에 두 ip는 서로 다릅니다. 이유가 뭘까요? 보통 집에 컴퓨터를 설치하면 KT같은 통신사가 와서 인터넷을 깔아줍니다. 회선을 주는데 이게 바로 IP가 됩니다. (211.46.24.37같은…) 그러나 집에 컴퓨터 한 대만 있는 경우는 많지 않죠. 랩탑도 있고 IPTV도 이 경우에 속합니다. 그래서 각각 모두 다른 회선을 줘서 각각 서버로 하게 되면 좋지만 이렇게 되면 비쌉니다. 그래서 나온 것이 공유기(Router)입니다. 통신사가 준 하나의 회선으로 라우터를 통해 모든 기기를 연결할 수 있죠. 그 ip는 router가 갖습니다. 허나 각각의 기기들도 ip를 가져야 하는데 끝 자리만 다르게 가져집니다. 랩탑은 10.0.3.3 데스트탑은 10.0.3.2 이런 식으로 말이죠. 이렇게 router처럼 공개되는 ip를 public address라고 하고 안쪽에 랩탑이나 데스크탑 등이 따로 가지고 있는 ip는 private address라고 합니다. 즉, curl을 통해서 안 ip는 public address이고 ip addr은 이 컴퓨터에 어떤 ip가 있나를 말하는 것으로 private를 말하는 것입니다. 그래서 위에서 말한 curl의 ip와 ip addr을 통한 ip가 같다면 router가 없는 것이고 다르다면 router가 있는 것입니다. router가 있으면 서버 컴퓨터로 쓸 수가 없는데 다만 그 안에서는 각자끼리(데스크탑과 랩탑끼리는) 사용이 가능합니다.
웹 서버(아파치)
install
/var/www로 들어가 줍니다.
웹 서버도 설치해서 쉽게 만들 수 있다. sudo apt-get update;를 먼저 해주고, sudo apt-get install apache2;으로 설치를 해줍니다. apache를 킬 때는 sudo service apache2 start라고 ㅆ고 끌 때는 sudo service apache2 stop일라고 쓰면 됩니다. sudo htop을 해서 apache를 보면 프로그램이 엄청 많이 뜨는 것을 알 수 있는데 그 이유는 사람들이 이곳으로 접속할 때 사람들의 트래픽을 분산시키기 위해서 입니다. 아파치 프로세서가 자동으로 줄어들고 늘어나고 합니다.
sudo apt-get install elinks를 해서 elinks를 설치합니다. elinks는 쉘 환경에서 웹 브라우징을 도와주는 프로그램입니다. 실행해서 google.com에 한 번 가보세요. 깨지는 이유는 한글을 지원해주지 않아서 입니다. 탭과 방향키로 이동이 가능하고 엔터로 검색어를 입력할 수 있습니다. q를 하면 빠져나가고요.
ip addr을 이용해서 자기 ip를 알고 elinks http://'자신의 ip'/라고 쳐보세요. 들어갔는데 우분투 apache가 나왔다면 성공적으로 설치되었다는 소리입니다. 즉 웹 서버가 클라이언트의 요청에 대해서 응답을 해준 것입니다. 그리고 ip addr을 이용해서 ip로 들어가는 방법 외에 자기 자신이 웹 브라우저이고 웹 서버를 가졌을 경우, 주소 창에 http://localhost를 치는 것으로 들어갈 수 있습니다. ip addr을 쳤을 때 inet 뒤에 ip가 두 개가 나오는데 위에 있는 ip(127.0.0.1) 얘는 자신의 고유한 ip이고 아래에 있는 ip(10.0.2.15)는 네트워크 접속에 따라서 언제든지 달라질 수 있는 ip입니다. ip(127.0.0.1)는 localhost라는 ip 도메인 네임으로 똑같습니다. (흠… 정확히 뭐가 달라지는 것이고 어떤 게 고유한건지)
configuration
웹 서버는 어디에서 index.html 파일을 읽어오는 걸까요? 여러 프로그램에 대한 설정, 동작 방법들은 cd /etc에 가보면 확인할 수 있습니다. 여기에 apache2/에 대한 설정파일도 있죠. cd apache2/로 가봅시다. 가장 중요한 파일이 apache2.conf라는 파일인데 vim apache2.conf로 확인해보죠. 밑에 보면 site-enabled라는 디렉토리 안에 .conf라는 확장자 파일을 읽는다라고 적혀있습니다. 나가서 cd sites-enabled를 통해 들어가봅시다. ls -al로 확인해봅시다. 파일이 하나 있습니다. vim으로 그 파일을 들어가보면 documentroot /var/www/html이라고 적혀있습니다. 그대로 들어가봅니다. cd /var/www/html을 가보면 index.html 파일 하나가 그대로 있습니다. 이름을 바꿔봅시다. sudo mv index.html index.html.bak 이렇게요. 그리고 elinks http://127.0.0.1/index.html이라고 쳐봅니다. 아마 not found가 뜰 것입니다. sudo vim index.html을 가서 \<html\>\<body\> hello \</body\>\</html\>을 쓰고 저장합니다. 그리고 나서 다시 실행을 시켜보면 hello가 뜨게 됩니다. 즉, 웹 서버는 /etc/apache2에 있는 어떤 설정 파일(.conf)을 읽어 거기에 적혀 있는 document root의 Index.html을 가져오는 것입니다. 그리고 웹 브라우저가 사용자가 요청한 파일을 찾는 최상위 디렉토리를 document root라고 부릅니다. (/var/www/html)
log
위에서 말한 /etc/apache2에 있는 어떤 설정 파일(.conf)을 보면 document root밑에 에러나 사용자가 관심있는 log가 저장되는 것이 있는데 access.log와 error.log입니다. 얘들의 장소는 cd /var/log/apache2/에 가보면 있습니다. tail -f /var/log/apache2/access.log 얘는 실시간으로 추가되는대로 마지막에 추가되는 내용을 보여주는 명령어 입니다. 그래서 다른 창을 띄워서 elinks http://127.0.0.1/index.html을 가보면 자동적으로 추가되는 것을 알 수 있습니다. 에러가 있다면 위 처럼 tail -f /var/log/apache2/error.log으로 가서 알아볼 수 있습니다.
원격 제어(SSH) (아예 다른 걸로 들어가야 하나?)
SSH는 Secure Shell의 축약어입니다. 뜻 그대로 보안 쉘입니다. 기존의 유닉스 시스템 쉘에 원격 접속하기 위해 사용하던 telnet은 암호화가 이루어지지 않아 계정 정보가 탈취될 위험이 높으므로, 여기에 암호화 기능을 추가하여 나온 프로토콜입니다. 기본 포트는 22번을 사용합니다.
iot로 활용되는 컴퓨터들의 OS는 대부분 ssh리눅스입니다. 쉘을 통해 움직이는 컴퓨터는 SSH를 쓰면 됩니다. 여러분은 SSH Client를 조작해서 SSH Server가 설치되어 있는 컴퓨터를 제어하는 것입니다. 명령이 전달되면, SSH Server는 ssh client에 정보를 뿌려주게 됩니다. ssh server는 기본적으로 설치가 되어있습니다.
이미 ssh가 설치되어 있을텐데 더 자세하게 알기 위해 삭제하고 다시 설치를 하겠습니다. sudo apt-get purge openssh-server openssh-client라고 치면 삭제가 됩니다. remove가 아닌 purge이기 때문에 더 강력해서 환경설정 파일들도 모두 삭제가 됩니다.
다시 설치를 해보겠습니다. sudo apt-get install openssh-server openssh-client라고 칩니다. 여기openssh는 ssh라고 하는 방식을 통해 원격 제어를 하기위해 여러 프로그램을 묶어둔 프로젝트라고 보시면 됩니다. 마치 apache와 같이 말이죠. install이 됩니다. 그리고 실행을 시킵니다. sudo service ssh start로 실행시키고 sudo ps aux | grep ssh로 확인합니다. |
ssh server는 계속 기다리고 있다가 ssh client의 접속을 기다립니다. 클라이언트 컴퓨터가 ssh egoing(아이디)@192.168.0.65(ip addr을 쳤을 때 두 번째 ip)를 치면 그 컴퓨터(server)를 대상으로 접속이 됩니다. 프롬프트도 생긴 게 똑같이 되고
\<포트(port)\>
www.naver.com의 맨 뒤에 www.naver.com:80을 붙여도 접속이 됩니다. :80을 붙여도 똑같이 간주가 되는 것이죠. 이 숫자는 뭘까요? 바로 포트입니다. 위에서 했던 원격 조종을 할 때 ssh -p 22 bean@192.168.0.65를 했을 때도 접속이 됩니다. 그러면 그 -p뒤의 숫자를 2222라고하면 어떻게 될까요? 접속이 되지 않습니다. 즉, web은 80, ssh방식은 22번 포트를 이용한다는 것을 알 수 있습니다. ssh는 22번 포트에 접속하기로 약속이 되어있고 web은 80번 포트에 접속하기로 약속이 되어있습니다. 클라이언트의 웹 브라우저도 80번 포트로 가기로 되어있습니다. 마찬가지로 ssh client도 22번 포트로 가기로 되어있는 것입니다. 네트워크의 세계에서 1024개의 구멍까지는 자주 쓰는 거라 여러가지 프로그램들을 따로 자동으로 연결되도록 해 놓은 통신 시스템들이고 유명하지 않은 1024개부터 6만5천쯤 까지는 우리가 써도 되는 것입니다.
sudo vim /etc/ssh/sshd_config를 쳐보면 port 22라고 나오게 되는데 이 포트를 2222로 바꾸고 sudo service ssh restart를 쳐서 재접속하고 ssh egoing(아이디)@192.168.0.65를 쳐보면 접속이 되지 않습니다. 아까처럼 -p 2222라고 쳐야 접속이 됩니다.
ISP(Internet Service Provider)는 통신회사들을 의미합니다.
외부의 사람이 접속할 때는 공유기에 있는 ip로 밖에 접속을 할 수 없습니다. 노트북의 Ip는 private ip라서 알 수가 없고 똑같은 ip를 가지고 있는 사람들이 매우 많기때문에 접근하는 건 불가능하다고 할 수 있습니다.
그러면 데스크탑 컴퓨터에 server를 설치하고 외부 사람이 들어오도록 하는 방법은 없을까요? 있습니다. port forwarding을 사용하면 됩니다. 즉, port forwarding은 외부 사람이 특정한 포트로 들어오면 그 특정한 포트를 데스크탑 컴퓨터에 연결해서 접속할 수 있도록 해준다는 이야기입니다. 즉, 사용자가 211.46.24.37:9000을 치면 데스크탑 컴퓨터에 들어갈 수 있도록 만듭니다. 회사마다 공유기 설정이 다르기 때문에 잘 알아보고 하셔야 합니다. 그리고 공유기에는 기본적으로 웹 서버가 깔려 있습니다. 내부적으로 통용되는 ip(default gateway)를 가지고 있는 것이죠.
일단 내 ip를 알기 위해서는 ip addr을 쳐보면 됩니다. 두 번째 inet에 나와있습니다. default gateway를 알아보기 위해서는 ip route를 쳐보면 됩니다.
거기에 나와있는 ip를 웹 브라우저 URL에 치면 나오게 됩니다. 포트포워드 설정에서 내가 원하는 내부 IP 주소를 적고 프로토콜은 내버려 두고 외부 포트는 위의 9000에 해당합니다.(사용자가 접근할 포트) 내부 포트는 80이라고 정합니다. 그러면 누군가가 9000번 포트로 들어왔을 때 80번 포트로 신호를 보낸다는 뜻입니다. 그래서 사람들에게 알려줄 때 211.46.24.37:9000을 알려주면 됩니다. 리눅스에서 curl http://ipinfo.io/ip를 쓰면 ip가 나오게 됩니다.
\<도메인(domain)\>
우리가 google.com을 치면 자동으로 도메인이 ip address로 바뀌어서 접속할 수 있는데 이러한 역할은 DNS라는 서버가 해주게 됩니다. 그렇다면 DNS서버는 어떻게 ip로 바꾸는 것일까요?
-hosts 파일
DNS(Domain Name System) 서버가 있기 전에 hosts라는 파일을 각 컴퓨터마다 갖고 있었습니다. 이 hosts라는 파일은 DNS가 하는 일, 영어로 된 주소의 IP를 적어 놓은 파일이었죠. 그래서 옛날에는 이 hosts 파일을 통해서 웹에 접속했습니다.
elinks google.com을 해보세요. google 홈페이지가 잘 나오죠? 자 그러면 sudo vim /etc/hosts라는 파일을 열어보세요. 그러면 127.0.0.1이 적혀 있는데 밑에다 127.0.0.1 google.com치고 저장해보세요. 그리고나서 똑같이 elinks google.com을 해보면 내가 가진 localhost와 똑같은 웹사이트가 나오게 됩니다. (신기한 건 elinks www.google.com을 치면 그대로 구글 홈페이지가 나온다. 딱 hosts파일에 적혀 있는 대로만 파악하나 보다. )
이렇게 google.com을 쳤는데 localhost의 페이지가 나오는 이유는 웹 브라우저에서 google.com을 쳤을 때 바로 /etc/hosts 파일에 google.com이 있는지 확인합니다. 그리고 그에 따른 127.0.0.1에 들어가죠. 그리고 DNS 서버에는 들어가지 않습니다. 이미 있으니까요. 접속할 게 없다면 DNS 서버를 찾습니다. 우리가 배웠다시피, 요청하는 쪽이 클라이언트, 응답하는 쪽이 서버인데 이는 각각 host로 불려집니다. 이 host의 관계를 network라고 하고 이런 network가 모여 있는 집단을 internet이라고 합니다.
이렇게 ip를 외우기 힘들어서 hosts라는 파일에 적어 놨는데 여기에 적는데도 한계가 있겠죠? 컴퓨터마다 하나하나 다 갖고있어야 하기도 하고요. 그래서 생겨난 것이 DNS 서버입니다.
자, 그러면 DNS서버가 생겼는데 hosts 파일은 어디다 쓰냐? 제가 만약에 서버의 어떤 부분을 바꿨어요. 즉, 도메인에 어떤 결함이 생겨서 들어가지 못 하는데 Hosts 파일에서 ip나 도메인을 바꿔주면 정상적으로 들어갈 수 있다는 것이죠. 하지만 hosts을 이용해서 악용할 수도 있습니다. 크래커들이 구글과 똑같은 웹 페이지 ip를 다른 사람의 ip에 집어넣는 거예요 google.com이런 게 자기네들 웹 페이지로 가도록. 다른 사람들은 나도 모르게 아이디와 비밀번호를 치면 그대로 넘어가는 것이죠.
-도메인 구입
cat /etc/resolv.conf 라고 치면 nameserver가 나오게 됩니다. 네임 서버는 DNS를 운영하는 서버를 Name server라고 합니다. 내건 127.0.1.1이 나오는데 이건 내부 네트워크의 DNS를 가르키는 주소입니다. 두 개가 있는 이유는 만약에 하나가 이상이 있을 때 2번째로 가기위함입니다(백업이나 서버 부하를 줄이기 위해서라고 생각하면 편합니다. ). 여기있는 ip를 google에 치면 어떤 회사가 나오는데 자신이 연결한 통신사가 나오게 됩니다. 가령 KT를 쓰고있다면 KT가 나오게 되는 것이죠. 와이파이나 케이블에 연결하게 되면 여기 있는 /etc/resolv.conf가 KT가 제공해주는 ip로 바뀌게 됩니다. //127.0.0.1 = localhost = 루프백 IP(자기 자신의 서버 IP) 우분투 리눅스에서는 DNS IP가 127.0.1.1로 되어있다. 이는 최근에 우분투가 dnsamsq라는 걸 쓰기 때문이라고 한다. 성능이 더 좋아져서… 루프백용 ip는 IPv4의 경우 127.0.0.0부터 127.255.255.255 까지 있으며, 보통 _127.0.0.1_을 사용한다. 루프백용으로 넓은 대역을 할당하기엔 아까웠는지 IPv6은 ::1/128, 딱 한 개의 주소만 사용한다.
//즉, Hosts먼저 들리고 그 다음에 /etc/resolv.conf를 들린다.
도메인에 따라서 관리하는 주체들이 달라집니다. jp로 끝난다면 일본이 관리하고 kr로 끝난다면 한국이 관리하는 겁니다. 도메인은 구입해야 자신의 도메인이 되는데 구글에 free domain이라고 검색해보면 무료로 쓸 수 있는 도메인이 있습니다. 여기서는 freenom이라는 사이트를 썼습니다. 다 만든 다음에 DNS MANAGEMENT for 로 가보면 name, type, ttl 여러가지가 있는데 다 가만히 두고 target에 자신이 쓸 ip만 쓰면 됩니다. 리눅스에서 ip addr을 쳐서 inet2를 쓰거나 curl ipinfo.io/ip를 써도 되는데 전자는 private ip이고 후자는 public ip이기 때문에 public ip를 써야 한다는 것을 알 수 있습니다.
리눅스에서 host egoing.ga라고 치면 egoing.ga의 ip를 알아낼 수 있습니다.
-sub domain
우리가 배운 것으로는 하나의 도메인에 하나의 서버를 가지고 있습니다. 다른 서버에 연결하기 위해서는 도메인을 계속 사야되는 현상이 일어나는 것이죠. 하지만 방법이 있습니다. 도메인 앞에다가 sub domain을 붙이면 여러 개의 서버를 운용할 수 있습니다. 하나의 도메인으로 여러 개의 웹 사이트를 운영할 수 있죠. 위에 freenom에 있는 관리 창에 밑에 add가 있습니다. target에 ip를 다르게 주면 쉽게 하나의 도메인에 여러 웹 사이트를 운영할 수 있습니다.
-DNS principle(조금 어려움. 정확한 이해가 필요)
리눅스에서 dig +trace egoing.ga라고 치면 어떤 결과가 나오는지 한 번 확인해보세요 뭐가 되게 길게 나옵니다. 뭐가 쫙 나오는데 맨 마지막에는 그 주소의 ip가 나옵니다. 도메인들은 사실, egoing.ga. 이렇게 맨 뒤에 .이 생략되어 있습니다. 그 .을 root domain이라고 합니다. 한 번 쳐보세요 google.com.해도 됩니다. 한 컴퓨터에 모든 도메인이 있다는 건 매우 힘든 일입니다. 그래서 도메인을 여러 컴퓨터에 분산해서 저장해 놓았습니다. 클라이언트 컴퓨터에 연결되어있는 DNS는 root dns server의 주소를 알고있어요. ROOT DNS 서버는 똑같은 DNS 서버인데 한 대가 아니라 10대가 넘는 DNS 서버가 있습니다. 그리고 전 세계에 퍼져있어요. 이유는 한 대가 망가져도 다 복구할 수 있기 위함입니다. dig +trace 뭐시기를 쳤을 때 root dns list가 있습니다. 우리 클라이언트의 DNS는 언제나 ROOT DNS LIST를 알고있습니다. (프로그램에 내장되어 있습니다.) 우리가 egoing.ga를 썼을 때 클라이언트는 DNS서버에 그 egoig.ga의 Ip를 물어볼 것입니다. 그러면 DNS서버는 ga(ga를 담당하는) DNS SERVER에게 .ga 또는 .com을 담당하는 dns 서버를 물어봅니다. 그리고 ga dns server는 그 결과를 보여줍니다. 그게 그 밑에 있는 .ga의 name server들의 목록입니다. 이 것도 분산되어 있는 이유는 아까 말한대로 백업의 용도입니다. 그리고 나서 우리 클라이언트 dns 서버는 ga dns server에게 또 물어봅니다. egoing.ga. 에 대해서요. 그러면 또 응답을 해준 것이 맨 마지막입니다. 그 부분이 egoing.ga.에 대한 목록입니다. 주소 옆에 NS라고 적혀있는 건 DNS를 의미하는 거고 A는 address를 의미합니다. 즉, .(ROOT)에서 ga.에서 egoing.ga.으로 갑니다.
우리가 ga쪽의 도메인을 사잖아요? 그러면 우리는 ga를 담당하는 관리 기구에 돈을 내는 겁니다.실제 도메인의 ip는 맨 밑에 A에 들어가는 것이죠.
홈페이지에서 Managing tools의 name servers에 들어가봅시다. 이 홈페이지는 친절하게도 우리에게 name server까지 제공을 하고 있는 것입니다. 그리고 이 도메인 네임서버에 여러분의 ip가 저장되어 있는 것입니다. 도메인의 관리를 다른 곳에서 하고 싶다면 이 주소를 바꾸면 됩니다. 직접 DNS서버를 구축해서 하는 경우는 없습니다.
\<인터넷을 통한 서버간 동기화(rsync)\>
rsync(remote synchronize)는 원격으로 변경사항을 양쪽으로 반영해서 같은 상태를 유지하는 것입니다. 즉, 컴퓨터와 컴퓨터 사이에 동기화를 하는 것입니다. 백업을 할 때도 사용할 수 있습니다.
mkdir rsync를 하고 cd rsync/로 이동합니다. 그리고 mkdir src을 만들고 mkdir dest를 만듭니다. 총두 개의 디렉토리를 만듭니다. 그리고 src에 파일을 만들고 dest에 복사를 할 것입니다. cd src로 이동하고 touch test{1..10}을 합니다. 이렇게 하면 자동으로 test1부터 test10까지 자동으로 생성이 됩니다. cd ..로 빠져나와서 rsync 디렉토리에서 rsync -a src/ dest라고 칩니다. 여기서 /를 치셔야 하는데 안 치시면 아예 디렉토리가 생성될 것입니다. src는 디렉토리를 의미하고 src/는 src 밑에 있는 디렉토리를 의미합니다. rsync의 장점은 전송할 대상에 대해서 rsync가 작동하기때문에 효율성이 뛰어납니다. dest에서 rm test5를 해보고 rsync -av src/ dest를 해보세요 -av는 더 자세하게 알려주는 것입니다. src에서 지우면 src에서 있는 게 그대로 가는 것이기 때문에 dest는 그대로 있겠죠. 그리고 src에 추가하면 dest에 추가가 됩니다. -a는 세세한 것 모두 복사하는 옵션(아카이브 모드)입니다.
-Remote sync
다른 컴퓨터로 sync를 하기 위해서는 그 컴퓨터의 ip가 필요합니다. ip addr을 쳐서 알아내고 원본 파일이 있는 곳의 디렉토리에서 rsync -azP ~/rsync/src/ k8805@192.168.0.65:~/rsync/dest 라고 치면 됩니다. -azP에서 z는 압축이고 P로 하면 프로그레스 바로 나타내주는 옵션입니다.
\<로그인 없이 로그인 하기 (ssh key)\>
편하기도 하고 훨씬 더 안전하게 로그인할 수 있습니다. 일단 ssh의 공개키 비공개키를 만들어야 하는데요. 그 때 사용하는 명령이 ssh-keygen(generation)입니다. 치면 숨김 파일을 통해 생성하겠다라는 소리입니다. 그러면 파일의 형태로 아주 어려운 비밀번호가 생성됩니다. 그리고나서 힌트?는 그냥 엔터를 치시고 cd~와 cd .ssh로 가줍니다. 그리고 나서 ls -al을 치면 몇 개가 나오는데 그 중에서 id_rsa와 id_rsa.pub(public)을 보시면 됩니다. 전자가 private key이고 후자는 public key입니다. public key는 누구나 볼 수 있는데 private key는 절대 노출되어선 안 됩니다. 왼쪽에 권한을 보면 아시겠죠? 아무튼 id_rsa.pub을 저장시키면 로그인 없이도 로그인 할 수 있게 됩니다. 다른 계정에서 .ssh에 들어가서 ls -al을 해주면 authorized_keys라고 되어있는 파일이 있는데 이는 인증된 키라는 뜻입니다. id_rsa.pub의 코드를 authorized_keys의 맨 끝에 붙여넣어주면 되는데 실수가 일어날 수 있기 때문에 유틸리티가 따로 있습니다. 로그인하고자하는 컴퓨터에 ssh-copy-id egoing@192.168.0.67을 입력해줍니다. (복사할 곳의 ip) 패스워드를 입력하면 됩니다. cat authoried_keys를 쳐보면 밑에 append된 것을 알 수 있습니다. 그리고 나서 이제 ssh egoing@192.168.0.67을 해보면 로그인 없이 로그인이 되는 것을 알 수 있습니다. 그러면 이제 private key를 가지고 있는 사람이 그 컴퓨터에 들어갈 수 있습니다.
로그인 없이 rsync를 하게 되면 매우 편리하게 동기화를 할 수 있습니다. mkdir rsync3; cd rsync3; touch test{1..100};을 해주게 되면 rsync3에 100개의 파일이 생성됩니다. 그리고나서 다른 ip 컴퓨터에서는 mkdir rsync_welcome이라는 디렉토리를 만듭니다. 그리고 나서 원래 컴퓨터에서 rsync -avz . egoing@192.168.0.67:~/rsync_welcome을 해줍니다. (v는 진행상태를 보여줘라 라는 뜻입니다.) 이 명령을 실행시키면 휙 하고 바로 동기화가 됩니다. rsync는 기본적으로 ssh라는 통신 방법을 이용해서 통신을 하기 때문에 rsync는 먼저 ~./ssh에 들어가서 private key와 public key를 확인하고 전송하게 됩니다. 자동로그인이 없이 할 수 있다면 Cron을 이용해서 백업과 같은 일을 자동화 시킬 수 있게 됩니다.
ls ~/.ssh/를 각자 다른 컴퓨터에 가보면 id_rsa.pub과 authorized_keys가 있습니다.
encrypt는 정보를 암호화하고 decrypt는 암호화된 걸 정보로 바꿔주는 것으로 복호화라고 합니다.그리고 이 작업들은 key를 통해서 할 수 있죠. 똑같은 키(key) 방식을 쓴다고 해서 대칭적 방식이라고 합니다.
암호화할 때는 Private key를 이용하고 복호화할 때는 public key를 이용하는 것을 비 대칭적 방식이라고 합니다. 그리고 이 대표주자(기술)의 이름을 RSA라고 합니다.
SSH Client가 SSH Server에 접속하면 SSH Server는 SSH Client에게 랜덤 키를 하나 줍니다. 그러면 SSH Client 프로그램은 id_rsa 파일이 있는지 없는지 찾아봅니다. 그런 이름의 파일이 있으면 (private key가 있다면) 받아온 랜덤 키를 암호화하죠. 그리고 암호화된 결과를 SSH Server에게 보냅니다. SSH Server는 암호화된 정보를 받고 그 정보를 authorized_keys에 추가된 public key를 보고 복호화를 합니다. 그 결과가 처음 값 즉, 랜덤 키와 같다면 로그인을 시켜주는 원리입니다. 패스워드를 입력하는 것보다는 그 패스워드를 파일로 만들어서 하는 게 더 안전합니다.
\<연속적으로 명령 실행시키기(;과 &와 &&의 차이\>
CLI의 가치
명령을 통해서 컴퓨터를 제어하는 중요한 이유 중의 하나는 해야 할 일을 순서대로 배치해서 자동화된 처리를 할 수 있다는 점입니다. 정확한 작업을 위해서는 명령어와 명령어를 연결하는 구분자를 잘 이해하셔야 합니다. 언어로 치면 접속사와 같은 역할을 하는 것입니다. 여기서는 이 접속사들을 정리해봅니다.
; - 성공여부와 상관없이 다음 명령어 실행
한 줄에 여러 명령어를 순서대로 배열할 때는 ;를 구분자로 사용합니다. 아래 명령어는 test를 만든 후에 test 디렉토리로 이동합니다.
mkdir test;cd test
&& - 성공한 경우에 다음 명령어 실행
&&는 앞의 명령어가 실행되었을 때 성공한 경우에 다음 명령어를 실행합니다. ;와는 다릅니다.
아래의 경우는 cd test와 touch abc가 실행되지 않습니다.
mkdir test(실패) && cd test && touch abc
성공&실패와 무관하게 연속적으로 실행해야 할 명령이 있을 때 ;를 씁니다. 이전 명령이 성공했을 때 다음 명령을 실행하려면 &&를 씁니다. 대체로 &&를 쓰는게 좋을 때가 많습니다. 좀 더 정확하게는 &&는 이전 명령어의 실행결과가 참(true)일 때만 다음 명령을 실행합니다.
리눅스(유닉스)의 모든 명령어는 종료할 때 성공 여부를 알려줍니다. 예를 들어보죠.
test 디렉토리가 없는 곳에서 아래 명령을 실행해보세요. 성공했을 때 어떻게 되는지 보시죠.
mkdir test 그리고 아래 명령을 실행해보세요.
echo$?
이 명령어는 이전 명령어가 반환한 값을 알아내는 것입니다. 결과는 아래와 같습니다.
0
반대로 test 디렉토리가 이미 있는데 mkdir test를 실행한 후에 echo $?를 실행하면 아래 값이 출력됩니다.
1
또는 존재하지 않는 명령어를 실행하면 127이 출력될꺼예요. 즉 리눅스에서는 0이 아닌 값은 실패(false)를 의미합니다.
&와 &&는 다릅니다.
&는 명령어를 백그라운드로 동작시킬 때 사용합니다. mkdir test & cd test를 실행하면 아래와 같은 결과가 나옵니다.
[1] 19989
cd: no such file or directory: test
[1] + 19989 done mkdir test
test 디렉토리를 백그라운드로 생성함과 동시에 test 디렉토리로 이동하려고 했기 때문에 cd test는 존재하지 않는 디렉토리로 진입하려고 시도하기 때문입니다. 한편, test 디렉토리는 생성됩니다.
명령의 그룹핑 {}, ()
mkdirtest3 && { cdtest3; touchabc; echo'success!!'} | echo'There is no dir'; |
mkdir test가
성공했을 때 cd test2; touch abc를 실행하고 success!!를 출력합니다.
실패했을 때 echo 'There is no dir'를 실행합니다.
이때 실행되는 명령들은 현재 쉘의 컨텍스트에서 실행됩니다. 만약 서브 컨텍스트에서 실행하고 싶다면 '('와 ')'를 사용하시면 됩니다. (참고) - 현재 쉘과 서브 컨텍스트 무슨 소리인지 모르겠다. 현재 쉘은 말 그대로 처음부터 CLI환경을 뜻하는 것 같고 서브는 그 뒤로 사용되는 GUI에서 킨 bash같은 걸 말하는 것 같다. {}는 서브쉘이 없었을 때 만들어지지 않았을 때 사용한다고 한다.