Earn this, Earn it.
TIL - Linux 본문
2021년 7월 20일 글
🎈 리눅스에 대해 알아보자
다양한 쉘 종류
- bash ( Bourne-Again Shell )
프롬프트 : #
실행파일은 /bin/bash
Bourne again shell은 최초로 개발된 쉘인 Bourne shell의 변종이라 할 수 있다.
리눅스에서 가장 많이 사용되는 IEEE POSIX 호환이며 Borune shell과 호환되는 쉘로서
GNU 프로젝트에 의해 만들어지고 배포되고 있다. 명령행 편집 기능을 제공한다.
- sh ( Bourne Shell )
프롬프트 : $
본 쉘 보다는 개발된 C쉘이나 콘 쉘과 기능적인 면을 비교해 보면 본 쉘에 미흡한 점이 있다. 그 중 가장 큰 단점은 상호 대화형(Interactive)
방식을 취하고 있지 않다는 점이다. 이러한 상호 대화형 방식을 사용하고자 한다면 다른 쉘로 작업하는 것이 좋을 것이다.
- csh ( C 프로그램 스타일의 Shell )
프롬프트 : %
버클리 캘리포니아 대학에서 개발된 프로그래머들에게 적합한 shell이다. ( csh는 C쉘이며 sh는 본 쉘이다 )
대화형 사용법에서는 Bourne shell과 대부분 호환되지만 전혀 다른 프로그래밍 인터페이스를 가지고 있고, 히스토리 대체라는 복잡한 기능으로 대신하고 있지만 명령행 편집 기능은 제공하지 않는다.
- ksh ( Korn Shell )
프롬프트 : $
일반적으로 유닉스에서 가장 많이 사용되고 있는 shell이며 Bourne shell에 처음으로 현대적 인 shell 기능(C shell로부터 차용한 것이다.)을 도입한 shell 이다. Bourne shell과 호환되고, 명령행 편집 기능을 제공한다.
- zsh
프롬프트 : %
Korn Shell과 매우 유사한 셸이지만 Korn Shell보다 더 많고 유용한 기능 등을 추가하여 개선시킨 것이다.
- tc Shell
프롬프트 : >
코넬 대학에서 C Shell 수정본에 Korn Shell의 기능을 포함하여 개발된 셸이다. 95%의 C Shell과 5%의 새로운 기능이 추가되어 만들어졌다.
출처: https://unabated.tistory.com/entry/LinuxUnix쉘-Shell-의-정의와-종류 [랄라라]
리눅스 터미널 명령어들
- cd : 작업 디렉토리 변경 (ex. cd .. : 상위 디렉토리로 이동)
- mv : 파일 이동 (ex. mv filename1 dir/filename2 : dir에 filename2이름을 갖는 파일로 이동)
- mkdir : 디렉토리 생성
- rm : 파일 삭제
- rmdir : 디렉토리 삭제
- cp : 파일 복사 (ex. cp filename dir : filename을 갖는 file을 dir로 복사)
Ubuntu란?
리눅스 배경지식
리눅스는 유닉스(Unix)를 기반으로 개발된 운영체제이다. 1990년대 초 GNU 프로젝트는 운영체제에 필요한 라이브러리, 컴파일러, 텍스트 편집기, 유닉스 쉘 등을 만들어냈다. 그러나 장치 드라이버, 커널 등이 완성되지 않았는데 1991년 핀란드의 리누스 토발즈(Linus Torvalds)가 리눅스 커널을 발표하게 됨으로써 통합되어 GNU/Linux라는 완전한 운영체제가 탄생하게 되었다.
리눅스의 특징
- 유닉스 기반
기존의 유닉스는 높은 하드웨어 스펙을 기반으로 복잡하고 큰 네트워크 시스템을 위해 만들어졌다. 여기에 리눅스는 커널과 명령어 체계를 바꾸어 일반인들이 사용하기 쉽게 만들었다. - 다중 사용자와 멀티 태스킹을 지원
리눅스는 다중 사용자와 멀티 태스킹을 지원한다. 이 때문에 보안성에 따라 파일을 관리하기 용이하므로 서버에서 많이 쓰인다. - 자유 소프트웨어
리눅스는 오픈소스 기반이다. 이것이 다른 운영체제와 가장 큰 차이점이며 이러한 리눅스 커널과 소프트웨어 등을 모아서 패키지 관리 프로그램으로 구성한 것을 리눅스 배포판이라 한다.
우분투(Ubuntu)란?
우분투는 고유한 데스크탑 환경을 사용하는 리눅스 배포판 중에 하나이다.
우분투의 특징
- 개인용, 데스크탑 환경에 최적화
대부분의 리눅스 배포판들이 서버용으로 사용되고 있는 반면, 우분투는 개인 사용자와 데스크탑 환경에 최적화 되도록 사용자 편의적인 특징이 있다. - 자유 소프트웨어에 기반
이 역시 오픈소스를 기반으로 하며 누구나 무료로 다운 및 사용이 가능하다.
🧀 VirtualBox란?
가상머신이란?
하드웨어를 소프트웨어적으로 구현해서 그 위에서 운영체제가 작동하도록하는 기술
가상머신을 사용하는 이유
- 다른 운영체제를 사용해야 하는 경우(맥OS에서 윈도우, 윈도우에서 리눅스)
- 독립된 작업공간이 필요한 경우 (바이러스 회피, 백업)
- 하나의 머신에서 여러명에게 운영체제 환경을 제공하는 경우
VirtualBox란?
오라클에서 만든 오픈소스 가상머신 솔루션이다.
WSL이랑 차이는?
- WSL 1
Windows10 운영체제에서 리눅스 운영체제의 쉘,시스템을 사용할 수 있도록 지원해주는 기능이다. 개발,코딩,테스트등 가상화를 통해 리눅스를 만들어서 테스트하는 불편함을 줄여주는 좋은기능이다. - WSL 2
WSL2는 1과 다르게 Hyper-V를 사용해서 경량 VM(가상머신)기술을 사용한다. 따라서 기존 가상머신처럼 100 % 리눅스 커널과 호환되며 커널은 마이크로소프트에서 직접 리눅스 4.19 버전의 커널을 제공한다. 그리고 가상머신처럼 메모리가 할당되고 WSL2부터는 가상 IP도 부여된다. 말 그대로 Windows 에서 Hyper-V 기능을 WSL에 적용했다고 보면 된다.
🍱 SSH란?
SSH란 Secure Shell Protocol, 즉 네트워크 프로토콜 중 하나로 컴퓨터와 컴퓨터가 인터넷과 같은 Public Network를 통해 서로 통신을 할 때 보안적으로 안전하게 통신을 하기 위해 사용하는 프로토콜이다.
대표적인 사용 예
- 데이터 전송
원격 저장소인 깃헙이 있을 수 있다. 소스 코드를 원격 저장소인 깃헙에 푸쉬할 때 SSH를 활용해 파일을 전송하게 된다. - 원격 제어
우리는 AWS와 같은 클라우드 서비스의 인스턴스 서버에 접속하여 해당 머신에 명령을 내리기 위해서도 SSH를 통한 접속을 해야 한다.
사용하는 이유
물론 "보안"때문이다. 만일 예로 언급한 두 프로토콜을 통해 민감한 정보(예를 들어 로그인 정보)를 주고받는다면 정보를 직접 네트워크를 통해 넘기기 때문에 누구나 해당 정보를 열어볼 수 있어 보안에 상당히 취약하다. 반면 SSH는 먼저 보안적으로 훨씬 안전한 채널을 구성한 뒤 정보를 교환하기 때문에 보다 보안적인 면에서 훨씬 뛰어나다.
그렇다면 SSH는 어떤 방식으로 서로 다른 컴퓨터가 안전하게 통신하게끔 할까?
보안 방법
Private Key and Public Key를 이용한다. 기본적으로 SSH는 한 쌍의 Key를 통해 접속하려는 컴퓨터와 인증 과정을 거치게 되며 이 한 쌍의 Key는 다음과 같다.
- Public Key
Public Key는 단어 뜻 그대로 공개되어도 비교적 안전한 Key이다. 이 Public Key를 통해 메시지를 전송하기 전 암호화를 하게 되며. Public Key로는 암호화는 가능하지만 복호화는 불가능하다. - Private Key
이와 쌍을 이루는 Private Key는 절대로 외부에 노출이 되어서는 안되는 Key로 본인의 컴퓨터 내부에 저장하게 되어있다. 이 Private Key를 통해 암호화된 메시지를 복호화 할 수 있다.
🍙 리눅스를 설치해보자 !
VirtualBox 설치하기
https://www.virtualbox.org/ 에서 설치를 완료한 후 실행한다.
Ubuntu 20.04 설치하기
- 우분투 20.04를 설치한다.
우분투다운로드
- VirtualBox에서 새로 만들기 클릭 후 다음과 같이 생성해준다.
- 생성이 완료되면 설정으로 들어가 준다.
- 저장소 탭에 들어가 아래 보이는 버튼 클릭 후, 아까 다운로드 받았던 Ubuntu.iso를 선택한다.
- 광학 드라이브가 추가된 것이 보인다.
- 이후 시작 버튼을 누르면 Ubuntu 설치가 시작된다.
- 우분투 설치가 끝나면 이름과 암호를 설정해준다.
- VirtualBox에 Ubuntu가 설치되었다!
SSH 설정하기
- 로컬 컴퓨터 터미널을 켜서 ipconfig후 VirtualBox Host-Only를 확인한다. 이 중에서 IPv4 주소를 기억한다.
- VirtualBox으로 돌아와, 설정-> 네트워크 탭에서 어댑터2를 다음과 같이 설정한다. (Ubuntu가 꺼져있어야 한다.)
- Ubuntu를 실행 후 터미널을 열어서 ifconfig를 입력해준다. net-tools가 설치되어 있지 않으므로 설 치하고 오류를 해결해준다.
- ifconfig 입력시 enp0s8에 아까 보았던 IPv4 주소가 들어와 있는 것을 알 수 있다.
- 우분투 오른쪽 상단의 화살표모양 클릭 후 이더넷 설정에 들어가서 이더넷 enp0s8의 설정에 들어가준다.
- 주소와 네트마스크 게이트웨이에 다음과 같이 입력해준다.
- 방화벽 설정을 위해 터미널로 가서 다음 명령어를 실행해준다. 상태가 비활성인 경우
sudo ufw enable
을 입력하여 활성화 시켜준다.
- 패키지를 업데이트 및 업그레이드 해준 뒤
sudo apt-get install openssh-server
를 입력해 ssh를 설치해주면 끝.
- 추가로 새로운 계정을 생성하기 위해 우분투 터미널에서
sudo useradd 계정이름
sudo passwd 계정이름
입력 후 계정을 생성하였다.
PuTTY로 원격 접속하기
- PuTTY를 다운받아 준다.
- PuTTY 실행 후 IP를 설정하고 Port를 22번으로 설정하고 열어준다.
- 생성했던 계정인 testastro 계정으로 로그인하였다.
- 우분투 터미널에서 backup디렉토리를 생성 후 764 권한을 부여하였으며 디렉토리 소유자를 testastro로 만듬으로써 testastro가 디렉토리를 생성한 것과 같게 만들어 주었다.
- testastro로 backup 디렉토리에 접근할 수 있는 모습이다.
가상환경 시간 설정
가상 환경 우분투에서 date 입력시 로컬상의 날짜 시간과 같게 출력되는 모습이다.
Node.js 14.x버전 설치
- 그냥 설치하면 위와 같이 버전이 낮으므로 높은 버전을 설치해야 한다. 그렇기 위해서 우선 클라이언트에서 커맨드 라인이나 소스코드로 손 쉽게 웹 브라우저 처럼 활동할 수 있도록 해주는 기술인 curl을 설치해준다.
- curl을 이용해 개인저장소인 PPA를 설치해준다.
- 그 후
sudo apt-get install nodejs
입력시 14.17.2 버전으로 잘 설치된 것을 볼 수 있다.
- Git도 버전업을 위해 개인 저장소를 이용했다. 자세한 건 지난 게시글에 있다.
어제 작성한 Javascript 파일 실행하기
- git clone을 통해 저장소를 backup 디렉토리에 복사해준다.
- git switch를 이용해 내 브랜치로 이동한다. index.js가 생긴 것을 볼 수 있다.
node index.js
입력하여 실행 결과가 출력됨을 알 수 있다.
🥠 쉘 스크립트 자동화하기!
쉘 스크립트를 이용한 다양한 사례들?
- 디스크 상태 및 파일 시스템 점검
- 사용자별 디스크 사용량 분석
- 프로세스 개수 점검
- 주요 설정 파일 권한 점검bash 쉘 스크립트 작성하기
파일 압축하기
- /backup으로 이동 후,
nano backup.sh
입력하여 쉘 스크립트 편집기로 이동. - /var/log/dmesg와 /var/log/syslog 압축하기!
- /var/log/dmesg : 시스템이 부팅할 때 생성한 로그를 기록
- /var/log/syslog : syslog가 생성하는 공통 로그를 기록
backup.sh
#!/bin/bash
curdate=`date +%Y%m%d` #20210720
curtime=`date +%H%M` #시분 EX.1920
path="/var/log"
if ! [ -d $curdate ]; then # 디렉토리 없는 경우에만 생성
mkdir $curdate
fi
# 파일 압축
zip /backup/$curdate/log_$curdate-$curtime.zip $path/syslog $path/dmesg
파일 복사하기
backupCopy.sh
#!/bin/bash
if [ -f /var/log/syslog_1 ]; then # syslog_1이 있는 경우 제거
rm /var/log/syslog_1
fi
cp /var/log/syslog /var/log/syslog_1 # 복사
Crontap을 이용한 자동화
크론탭 등록
$ sudo crontab -e
입력 후
<크론탭 수정>
*/5 * * * * bash /backup/backup.sh # 5분마다 실행
29,59 * * * * bash /backup/backupCopy.sh # 매 29, 59분에 실행
크론탭 실행 및 상태 확인
- service cron start # 가동
- service cron restart # 재가동
- service cron status # 실행상태
5분마다 형성된 zip파일
syslog_1 파일 생성
30분 지켜본 결과 크론탭 정상 작동 확인
로컬로 복사하기
nano zipToLocal.sh
- 쉘 스크립트 작성
#!/bin/bash
curdate=date +%Y%m%d
scp -r narastro@192.168.56.2:/backup/$curdate /home/narastro
```
- 실행 결과, 모든 zip 파일들이 정상적으로 로컬에 복사됨.
🍧 ssh-keygen으로 자동로그인
ssh-keygen
후 엔터엔터엔터..- .ssh/에 공개키(자물쇠), 비밀키(열쇠)가 생김
- id_rsa.pub를 서버에 집어넣어줄 것임.
- ~/.ssh/로 이동 후,
scp -P 포트번호 id_rsa.pub narastro@localhost:/home/narastro
(우분투에 파일 복사) - home 디렉토리에서,
mkdir .ssh
cat id_rsa.pub >> .ssh/authorized_keys
(파일을 추가해주는 것)
이후 ssh narastro@localhost -p 22
로 접속하면 패스워도 없이도 접속 가능!
😂 느낀점
WSL2를 쓰면서 리눅스를 쓸 줄 안다고 착각했던게 큰 화를 불렀다.. 백엔드를 위해서 리눅스도 숙달될 필요가 있다고 느꼈다.
추가로, 운영체제, 리눅스와 유닉스, 파일시스템, 컴퓨터 구조를 더 공부해야 겠다는 생각을 했다ㅠㅠ
출처
'[개발 공부]' 카테고리의 다른 글
TIL - Process Management (0) | 2021.09.21 |
---|---|
TIL - Cache & Crawling (0) | 2021.09.21 |
TIL - Git과 JavaScript의 Array와 Set (0) | 2021.09.21 |
JavaScript - 기초 복습 (0) | 2021.09.21 |
React - 기초 공부 (0) | 2021.09.21 |