[부트캠프 - 18일차] 1/15.목 - Linux

developowl·2026년 1월 15일

부트캠프

목록 보기
9/24
post-thumbnail

11. Programming

C Programming

GCC

  • GNU Compiler Collection
  • 오픈소스 개발자들이 개발한 리눅스용 컴파일러
  • 컴파일
    • ex) gcc -o helloworld helloworld.c
  • 실행
    • ./helloworld

make

  • 실제 애플리케이션은 많은 파일로 복잡하게 구성되어 있기 때문에 gcc로 일일이 컴파일해서 하나의 실행 파일로 만드는 것은 매우 번거로운 작업.

  • → 이를 해결하기 위한 make 명령

  • makefile 이라고 하는 설정된 정보를 읽어서 여러 소스 파일을 컴파일하고 링크해서 최종 실행 파일을 생성

  • 소스 코드로 배포되는 많은 오픈소스 소프트웨어는 소스 코드와 makefile을 같이 배포

  • one.c

#include <stdio.h>
extern int two();

int main() {
	printf("Go to Module Two---\n");
	two();
	printf("End of Module One\n");
	return 0;
}
  • two.c
#include <stdio.h>

int two() {
	printf("End of Module One\n");
	return 0;
}
  • makefile
TARGET=one
OBJECTS=one.o two.o

# 최종 실행 파일 생성
${TARGET} : ${OBJECTS}
	gcc -o ${TARGET} ${OBJECTS}

# one.o 생성 (one.c를 컴파일만 함)
one.o : one.c
	gcc -o one.c
	
# two.o 생성 (two.c를 컴파일만 함)
two.o : two.c
	gcc -o two.c
  • 실행
./one

Python Programming

  • 설치
python3 --version
sudo apt-get upgrade python3

# venv 모듈 설치
sudo apt install python3-venv
  • 코드 작성 및 실행
mkdir pythontest

cd pythontest

# 가상환경 생성
python3 -m venv myvenv

# 가상환경 활성화
source myvenv/bin/activate
# main.py

# 학생 성적 리스트
scores = [85, 92, 78, 90, 88]
# 80점 이상인 성적만 필터링 (List Comprehension)
high_scores = [s for s in scores if s >= 80]
# 평균 계산
average = sum(scores) / len(scores)
print(f"고득점 리스트: {high_scores}")
print(f"전체 평균: {average:.2f}")
  • 실행
python3 main.py
  • 패키지 정보 내보내기
pip freeze > requirements.txt
  • 이유
    • 파이썬은 외부 패키지를 파이썬 환경에 설치해서 사용
    • 다른 곳에서 실행을 하려면 사용한 모든 패키지가 설치되어 있어야 함
    • 수동으로 직접 설치하는 것은 번거롭고 개발자의 실수를 유발
    • 패키지 정보를 텍스트 파일로 내보내서 텍스트 파일의 내용을 읽어서 설치하는 것을 권장
    • 이미지를 만들 때나 소스코드를 업로드할 때 requirement.txt 파일을 반드시 같이 업로드 해야 함

📌 파이썬에서 venv 를 항상 사용하는 이유

1. 파이썬은 글로벌 저장소를 사용

  • 파이썬은 기본적으로 패키지를 시스템 전체(Global)가 공유하는 하나의 폴더에 설치함
  • → Dependency Hell 에 빠질 위험

2. 컴파일 언어와의 차이

  • C / Go / Rust : 필요한 라이브러리를 가져와서 컴파일하면, 결과물로 모든 기능이 포함된 하나의 실행파일(바이너리)이 나옴.
  • Java: 프로젝트마다 pom.xml, build.gradle 을 통해 필요한 라이브러리를 프로젝트 단위로 관리하는 구조(Maven, Gradle)가 매우 강력하게 정착되어 있음
  • Python: 인터프리터 언어라서 실행하는 순간에 시스템에 깔린 라이브러리를 찾음. 이때 가상환경이 없으면 무조건 시스템 폴더만 탐색하기 때문에 충돌이 발생

3. venv가 해결해주는 것

  • 독립된 폴더 생성: 프로젝트 폴더 안에 작은 파이썬 복사본을 만듦
  • 경로(PATH) 조작: 가상환경을 activate 하는 순간, 컴퓨터에게 시스템 폴더 말고, 해당 프로젝트 폴더 안에 있는 site-packages를 먼저보라고 명령
  • 환경 격리: venv 덕분에 프로젝트 A와 B는 서로 어떤 버전의 라이브러리를 사용하는지 전혀 모름

정리

  • 파이썬은 패키지 보관함이 기본적으로 하나뿐이라서, 프로젝트마다 전용 보관함을 만들어주는 venv 작업이 필수이다.

Go Programming

  • Docker, Kubernetes 개발 언어

  • 설치

// 기존에 설치된 go가 있다면 삭제
sudo rm -rf /usr/local/go

// Go 다운로드 (버전 숫자는 변경될 수 있음) - arm64
curl -OL https://golang.org/dl/go1.22.0.linux-arm64.tar.gz

// 압축 해제
sudo tar -C /usr/local -xzf go1.22.0.linux-arm64.tar.gz

// 어느 디렉토리에서나 go 명령어를 사용할 수 있도록 환경 변수를 설정
// go 관련 명령어의 위치 (/usr/local/go/bin)
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.profile

// 환경 설정 파일(~/.profile)을 수정한 후 바로 적용하기
source ~/.profile

// 확인
go version
  • 프로젝트 생성 및 실행
// 작업 디렉토리 생성
mkdir hello-go
cd hello-go

// hello-go 라는 이름으로 모듈을 시작
go mod init hello-go

// 소스 코드 작성(main.go)
package main

import "fmt"
func main() {
	fmt.Println("Hello. Go world!")
	
	// simple example
	a := 10
	b := 20
	sum := a + b
	fmt.Printf("%d + %d = %d\n", a, b, sum)
}

// 실행
go run main.go

12. RemoteAccess

Telnet

  • 개요

    • Telecommunication Network
    • 인터넷이나 로컬 영역 네트워크(LAN) 연결에 사용되는 네트워크 프로토콜
  • 특징

    • 원격 접속: 텍스트 기반의 CLI 를 통해 원격 호스트를 제어
    • TCP 기반: 기본적으로 TCP 23번 포트를 사용하여 통신
    • 플랫폼 독립성: 윈도우, 리눅스, 맥 등 서로 다른 OS 간에도 표준화된 방식으로 통신이 가능
    • NVT(Network Virtual Terminal): 서로 다른 시스템 환경에서도 명령어를 인식할 수 있도록 가상의 단말기 개념을 사용하여 데이터를 주고 받음
    • 보안 문제 때문에 실제 원격 제어용으로는 SSH(Sercure Shell)가 텔넷을 완전히 대체했지만, 오늘날에도 엔지니어들은 다음과 같은 용도로 텔렛을 자주 사용
      • 포트 개방 확인(네트워크 진단) : 특정 서버의 특정 포트가 열려 있는지 확인할 때 유용
        • telnet 1.2.3.4 80 (해당 IP의 80번 포트가 열려 있는지 테스트)
      • 애플리케이션 테스트 : HTTP, SMTP 등 텍스트 기반 프로토콜의 응답을 직접 확인하기 위해 수동으로 명령을 보낼 때 사용
  • 장점

    • 간단한 설치, 쉬운 사용법
    • 시스템 리소스를 적게 차지하며, 오래된 장비(레거시 시스템)와도 호스트 호환성이 뛰어남
  • 단점

    • 데이터가 암호화되지 않는 평문(Plaintext)으로 전송되어 패킷 스니핑 등을 통해 정보가 유출될 위험이 큼

⭐️📌 SSH

  • 개요

    • Secure Shell
    • 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행할 수 있게 해주는 보안 네트워크 프로토콜
    • 과거에 사용했던 Telnet이나 FTP 등은 데이터를 평문(Plaintext)으로 전송하여 해킹에 매우 취약했지만, SSH는 모든 통신 내용을 암호화하여 보안성을 획기적으로 높임
  • 특징

    • 강력한 암호화 : 패스워드뿐만 아니라 전송되는 데이터 전체를 암호화
    • 인증(Authentication) : 접속하려는 사용자가 올바른 사용자인지 확인(비밀번호 방식, 공개키 방식 등)
    • 무결성(Integrity) : 전송된 데이터가 중간에 위변조되지 않았음을 보장
    • 압축 : 데이터를 압축하여 전송하므로 네트워크 효율이 좋음
  • 동작 원리

    • SSH는 기본적으로 클라이언트-서버 모델로 동작하며 표준 포트는 22번
    • 가장 권장되는 인증 방식은 비밀번호가 아닌 SSH Key(공개키/개인키)를 사용하는 방식
      • 공개키(Public Key) : 서버에 저장되는데 누구나 봐도 상관 없으며 데이터를 암호화하는 데 사용
      • 개인키(Private Key) : 클라이언트(사용자 PC)에 보관되는데 절대로 유출되면 안 되며, 암호화된 데이터를 푸는(복호화) 데 사용
  • 주요 활용 사례

    • 원격 터미널 접속
    • SFTP / SCPSSH : 보안 채널을 이용한 안전한 파일 전송
    • SSH 터널링 : 보안이 취약한 다른 프로토콜을 SSH 안에 넣어 안전하게 전달
    • Git 원격 저장소 : GitHub, GitLab 등에서 코드를 푸시할 때 인증 수단
  • 설치, 동작 및 접속

# 설치
apt -y install openssh-server

# 서비스 시작
sudo systemctl start ssh

# 부팅과 동시에 서비스 시작
sudo systemctl enable ssh

# 서비스 가동 여부 확인
sudo systemctl status ssh

# 방화벽에서 22번 포트 해제
sudo ufw allow 22/tcp

SSH 키 방식 접속 설정

  • 비밀번호보다 훨씬 안전하며 매번 비밀번호를 입력할 필요가 없어 매우 편리
  • SSH 키 쌍(Key Pair) 생성
    • 접속하고자 하는 클라이언트 컴퓨터의 터미널(Mac/Linux) 또는 PowerShell(Windows)에서 수행
    • ssh-keygen -t rsa -b 4096 -C “your_email@example.com”
    • Enter를 세 번(저장 위치와 비밀번호 설정을 기본값으로 두는 과정)
    • 완료되면 ~/.ssh/ 폴더에 id_rsa(개인키)와 id_rsa.pub(공개키) 파일이 생성됨
  • 서버에 공개키 등록
    • ssh-copy-id 명령어 사용
      • ssh-copy-id -p 포트번호 [사용자명]@[서버 주소]
    • 수동으로 등록
      • 본인 PC에서 공개키 내용을 복사
        • Mac/Linux: cat ~/.ssh/id_rsa.pub
        • Windows: type $HOME.ssh\id_rsa.pub
      • 서버에 접속한 뒤 서버의 ~/.ssh/authorized_keys 파일 끝에 복사한 내용을 붙여넣고 저장

  • .ssh 디렉토리 (생성됨)

    • id_rsa (개인키)
    • id_rsa.pub (공개키)
  • 공개키를 서버에 전송하기

    • ssh-copy-id -p 포트번호 [사용자명]@[IP주소]
  • 접속 방식 설정 시 파일 전송을 하지 않고 설정 가능

    • 클라이언트의 id_rsa.pub 파일의 내용을 서버의 ~/.ssh/authorized_keys 파일의 뒤에 붙여넣기를 하면 됨.

SCP(Secure Copy)

  • SSH가 설정된 경우 SSH 프로토콜을 기반으로 네트워크를 통해 파일을 안전하게 전송하는 명령어
scp [옵션] [원본 경로] [대상 경로]
  • 상황 1) 클라이언트의 파일을 서버로 전송

    • scp [파일 경로] [유저 이름]@[IP 주소: 서버의 경로]
    • (포트 번호가 다르다면)
      • scp -P [파일 경로] [유저 이름]@[IP 주소: 서버의 경로]
  • 상황 2) 클라이언트의 디렉토리 전송

    • scp -P 포트번호 -r 디렉토리 유저이름@IP주소:서버의경로
  • 상황 3) 서버의 파일을 다운로드

    • scp -P 포트번호 유저이름@IP주소:서버의경로 로컬경로

13. Database Server

MariaDB

MariaDB 설치 및 활성화

  • MariaDB Server: 패키지 이름은 mariadb-server
  • 처음 설치할 때는 apt-get 을 update 해야할 수 있음
# 설치
sudo apt-get install mariadb-server

# mariadb.service 를 활성화
systemctl start mariadb
systemctl enable mariadb

# 서비스 확인
systemctl status mariadb

MariaDB 내부 접속

sudo mysql
  • MariaDB의 기본 프롬프트는 MariaDB [(none)]>
  • MariaDB에서 종료하려면 exit을 입력

MariaDB 관리

# MariaDB 서버를 관리한다.
mysqladmin [명령]
  • 명령
    • version : MariaDB 서버의 버전 정보를 출력
    • status : MariaDB 서버의 현재 상태 정보를 출력
    • password 암호 : 계정의 암호를 지정

관리자 비밀번호 변경

sudo mysqladmin -u root password 암호

# 변경된 비밀번호로 접속
sudo mysql -u root -p

사용자 생성 및 권한 설정

# 유정 생성
CREATE USER 'itstudy'@'%' IDENTIFIED BY 암호';
# %는 모든 외부 IP로부터의 접속을 허용한다는 의미. 
#특정 IP에서만 접속하게 하려면 % 대신 IP를 적으면 됨

# 접속 권한 설정
GRANT ALL PRIVILEGES ON *.* TO 'itstudy'@'%';
# *.*은 모든 데이터베이스와 모든 테이블에 대한 권한을 의미

# 변경 사항 적용
FLUSH PRIVILEGES;

# 변경된 비밀번호로 접속
sudo mysql -u itstudy -p

외부 접속 허용

  • 설정 파일에서 바인딩 부분 수정
    • sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
    • bind-address = 0.0.0.0
  • 서비스 재시작
    • sudo systemctl restart mariadb
  • 방화벽에 3306번 포트를 외부에서 허용하도록 설정
    • ufw allow 3306/tcp

백업과 복원

  • mysqldump -u [사용자 계정] -p [패스워드] [원본 데이터베이스명] > [생성할 백업DB명].sql
  • mysql -u [사용자 계정] -p [패스워드] [복원할 DB] < [백업된 DB].sql

Mongo DB

공개 키 및 저장소 등록

# 패키지 업데이트
sudo apt update && sudo apt install gnupg curl

# MongoDB 공개 GPG 키 등록
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg \
--dearmor

# 저장소 리스트 추가
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ]
https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee
/etc/apt/sources.list.d/mongodb-org-7.0.list

설치 및 서비스 시작

# 설치
sudo apt update
sudo apt install -y mongodb-org

# 서비스 시작 및 자동 실행 설정
sudo systemctl start mongod
sudo systemctl enable mongod

외부 접속 허용

sudo nano /etc/mongod.conf
net:
	port: 27017
	bindIp: 0.0.0.0 # 127.0.0.1에서 0.0.0.0으로 변경 (모든 IP 허용)

# 서비스 재시작
sudo systemctl restart mongod

# 방화벽에서 포트 연결 허용
sudo ufw allow 27017/tcp

# 외부에서 접속
mongodb://IP주소:포트번호

사용자 설정

# 몽고 쉘 접속
mongosh

# 계정 생성
use admin
db.createUser({
	user: "adminUser",
	pwd: "password123",
	roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
})

# /etc/mongod.conf 파일을 열어서 인증 모드 사용 설정 코드 추가
security:
	authorization: enabled

# 서비스 재시작
sudo systemctl restart mongod

# 외부 접속 URL
mongodb://adminUser:password123@서버IP주소:27017/

Redis

Redis 설치

# 설치
sudo apt update
sudo apt install redis-server -y

# 상태 확인
sudo systemctl status redis-server

# 로컬에서 접속
redis-cli

외부 접속 허용

# 설정 파일 수정
sudo nano /etc/redis/redis.conf
	# bind 127.0.0.1 ::1 <- 주석 처리하거나
	bind 0.0.0.0 # <- 모든 IPv4 접속 허용

	requirepass 비밀번호

# 서비스 재시작
sudo systemctl restart redis-server

# 방화벽 설정
sudo ufw allow 6379/tcp

# 로컬에서 확인
redis-cli
> AUTH 비밀번호
> PING
	# 결과로 PONG이 나오면 성공
	
# 외부에서 접속
redis-cli -h IP주소 -p 포트번호 -a 비밀번호
  • Production 환경
    • 특정 IP만 허용: 가능하면 bind 0.0.0.0 보다는 접속할 클라이언트의 특정 IP만 허용하는 것이 안전
    • 포트 변경: 기본 포트인 6379 대신 다른 포트를 사용하는 것도 자동화된 공격을 피하는 좋은 방법

profile
Don’t get mad at the computer.

0개의 댓글