Linux
- 서버에서 자주 사용하는 OS
- 안정성, 신뢰성 높음
- 쉘 커맨드, 쉘 스크립트 -> 자주 쓰는 것 위주로 학습, 필요한 코드는 구글링
Shell Command
쉘이란?
쉘
- 사용자가 문자를 입력해 컴퓨터에 명령(e.g. ls, mkdir)할 수 있도록 하는 프로그램
터미널/콘솔
- 쉘을 실행하기 위해 문자를 입력 받아 컴퓨터에 전달
- 프로그램의 출력을 화면에 작성
sh
- 최초의 쉘
bash
- Linux 표준 쉘
zsh
- Mac OS 카탈리나 이후 기본 쉘
쉘 UX
- username@hostname:current_folder
- hostname = 컴퓨터 네트워크에 접속된 장치에 할당된 이름. IP 대신 기억하기 쉬운 글자로 저장
- host = 우리 컴퓨터
기본 쉘 커맨드
man
- 쉘 커맨드의 매뉴얼 문서를 보고 싶은 경우
- e.g. mbeaan python3
mkdir
- Make Directory; 새 폴더 생성
- e.g. mkdir beaver
ls
- List Segments; 현재 접근한 폴더의 파일 확인
- -a: all; 전체 파일 출력
- -l: long; 퍼미션, 소유자, 만든 날짜, 용량 등 길게 출력
- -h: human-readable; 사람이 읽기 쉽도록 용량을 GB, MB 등 표현
- e.g. ls~ / ls / ls -al / ls -lh
pwd
- Print Working Directory; 현재 폴더 경로를 절대 경로로 보여줌
cd
- Change Directory; 폴더 이동하기
- e.g. cd beaver
echo
- 터미널에 텍스트 출력 (Python의 print와 유사)
- e.g. echo "hi"
- echo `쉘 커맨드` 입력 시 쉘 커맨드의 결과를 출력
- e.g. echo `pwd`
cp
- Copy; 파일 또는 폴더 복사
- -r: recursive; 폴더 복사 시 폴더 안에 파일이 있다면 재귀적으로 모두 복사
- -f: force; 강제로 복사
- e.g. cp beaver1.zip beaver2.zip
vi
- vim 편집기로 파일 생성
- e.g. vi beaver.sh
- 모드
- i = INSERT 모드; 파일 수정 가능
- ESC = Command 모드
- ESC: = Last Line 모드
- w: 현재 파일명으로 저장
- q: 종료(저장 X)
- q!: 강제 종료(! = 강제)
- wq: 저장 후 종료
- /문자: 문자 탐색 (n = 계속 탐색)
- set nu: vi 라인 번호 출력
- 삭제
- dd: 현재 줄 삭제
- x: 커서 위치의 글자 1개 삭제 (5x: 글자 5개 삭제)
- 복사
- yy: 현재 줄 복사
- p: 현재 줄 바로 아래에 붙여넣기
- 이동
- k: 위 / j: 아래 / h: 왼쪽 / l: 오른쪽 (혹은 방향키로 이동)
bash
- 쉘 스크립트 실행
- e.g. bash beaver.sh
sudo
- superuser do; 커맨드를 슈퍼 유저(최고 권한, 관리자 권한)으로 실행
- e.g. sudo rm -rf // 실행하지 말 것; 젠부샤쓰
mv
- Move; 파일 또는 폴더 이동 or 이름 변경
- e.g. mv beaver1.sh beaver2.sh
cat
- concatenate; 특정 파일 내용 출력
- 여러 파일을 인자로 주면 합쳐서(concat) 출력
- e.g. cat beaver1.sh beaver2.sh
- 파일에 저장(OVERWRITE)하고 싶은 경우
- e.g. cat beaver1.sh beaver2.sh > beaver3.sh
- 파일에 추가(APPEND)하고 싶은 경우
- e.g. cat beaver1.sh beaver2.sh >> beaver3.sh
clear
history
- 최근에 입력한 쉘 커맨드 history 출력
- !숫자: 해당 커맨드 재이용 가능
- e.g. history ![[Pasted image 20240910174952.png]]
- e.g. !1004![[Pasted image 20240910175031.png]]
find
- 파일 및 디렉토리를 검색할 때 사용
- find -name "file": 현재 폴더에서, file이라는 이름을 가지는 파일 및 폴더 검색
export
-
환경 변수 설정할 때 사용
-
e.g. export water="물" // 띄어쓰면 안됨. 쉘에선 붙여서 써야 함.
-
echo $water // "물" 출력
-
export로 환경 변수 설정한 경우, 터미널이 꺼지면 사라지게 됨.
-
환경변수를 영구적으로 저장하고 싶다면 .bashrc, .zshrc(쉘에 따라 다름; MAC은 .zshrc)에 저장
-
e.g. vi ~/.zshrc 실행 -> 맨 마지막 줄에 export water="물" 입력-> :wq로 저장
-
이후 재로그인 하거나 source ~/zshrc 사용시 적용 완료
alias
- 기본 명령어의 별칭 설정 가능
- 터미널에 alias 입력 시 현재 설정된 별칭 확인 가능
- e.g. alias ll2='ls -l'
tree
- 설치: apt-get install tree
- 폴더의 하위 구조를 계층적으로 표현
- 프로젝트 소개 시, 구조 설명에 유용
- tree -L 레벨
- e.g. tree -L 2: 2단계까지 보여줌
head, tail
- 파일의 앞/뒤 n행 출력
- pandas.DataFrame의 head, tail과 유사
- e.g. head -n 3 beaver.sh
sort
- 행 단위 정렬
- -r: 내림차순 정렬(default: 오름차순)
- -n: Numeric Sort(숫자 정렬)
- e.g.
![[Pasted image 20240910180610.png]]
cat fruits.txt | sort -r
( fruits.txt의 결과를 토대로 내림차순 정렬)
uniq
-
중복된 행이 연속으로 있는 경우 중복 제거
-
sort와 함께 사용 가능
-
e.g. cat fruits.txt | uniq
-
e.g. cat fruits.txt | sort | uniq | wc -l // 중복 제거한 결과가 몇 줄인지 출력
grep
-
파일에 주어진 패턴 목록과 매칭되는 라인 검색
-
grep 옵션 패턴 파일명
- -i: 대소문자 구분 없이 찾기
- -w: 정확히 그 단어만 찾기
- -v: 특정 패턴 제외한 결과 출력
- -E: 정규 표현식 사용
cut
- 파일에서 특정 필드 추출
- -f: 잘라낼 필드 지정
- -d: 필드 구분자 (default: \t)
awk
- 텍스트 처리 도구
- awk 'pattern { action }' input_file
- pattern: 특정 패턴을 지정
- action: 선택된 줄에 대해 수행할 동작
- $1, $2: 첫번째 필드, 두번째 피드
- -F: 구분자
- e.g. awk -F: '{print $1}' cut_file
Redirection & Pipe
표준 스트림(Stream)
![[Pasted image 20240911040753.png]]
- Unix에서 동작하는 프로그램은 커맨드 실행 시 3개의 stream 생성
- stdin: 0으로 표현, 입력
- stdout: 1로 표현, 출력
- stderr: 2로 표현, 디버깅 정보 or 에러
Redirection
- 프로그램의 출력(stdout)을 다른 파일이나 스트림에 전달
: 덮어쓰기(Overwite); 파일이 없으면 생성 및 저장
: 맨 아래에 추가(Append)
- e.g.
echo "hi" > test.sh // test.sh 생성해 "hi" 저장(Overwrite)
echo "bye" > test.sh // test.sh의 맨 아래에 "bye" 추가(Append)
python train.py > log_file 2>&1 & // 에러 메시지가 log_file에 저장됨
// 2>&!: 표준 에러(stderr, 2)를 표준 출력(stdout, 1)으로 redirect
// &:백그라운드에서 실행
Pipe
- 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용하고 싶은 경우
- A의 Output을 B의 Input으로 사용
- e.g. ls | grep "vi" > output.txt // 현재 폴더에서, 파일명에 vi가 들어간 파일 찾아 output.txt에 저장
- e.g. history | grep "echo" // 최근 입력한 커맨드 중 echo가 들어간 명령어 찾기
서버에서 자주 쓰는 쉘 커맨드
ps
- Process Status; 현재 실행되고 있는 프로세스 출력
- 실행 중인 PID(Process ID)를 찾기 위해 사용
- -e: 모든 프로세스
- -f: full format으로 자세히 보여줌
curl
-
Client URL; Command Line 기반의 Data Transfer 커맨드
-
Request를 테스트할 수 있는 명령어
-
e.g. curl -X localhost:5000/ {data}
-
웹 서버 작성 후 요청이 제대로 실행되는지 확인 가능
-
더 가독성있게 출력하는 httpie도 있음
-
회사에선 Postman도 활용
df
- Disk Free; 현재 사용 중인 디스크 용량 확인
- -h: 사람이 읽기 쉬운 형태로 출력
- 실제 현업에서 Disk 용량이 100% 차서 서비스가 멈추는 경우가 있음.
ssh
- 안전하게(데이터가 모두 암호화) 원격으로 컴퓨터에 접속하고 명령을 실행할 수 있는 프로토콜
- ssh port: 22
- ssh 사용 이유
1. 보안
- 클라이언트/서버의 통신을 암호화해서 데이터를 안전하게 전송
- 도청과 같은 보안 위협으로부터 데이터 보호
2. 원격 접속
- 물리적으로 떨어진 서버(예: 서버실, 클라우드 서버)에 접속 가능
3. 터널링(포트 포워딩) 기능
- e.g.
usage: ssh -i /path/to/private-key.pem username@hostname(ip) -p 포트번호
ssh -i beaver.pem root@okcomputer -p 30952
// beaver.pem Key를 사용해 okcomputer의 30952 포트에 root로 접속
- ssh의 터널링
- 터널링 = 방화벽 등으로 인해 직접 접근이 제한될 경우, 안전한 터널을 통해
- ![[Pasted image 20240911045523.png]]
- e.g. ssh -L 8080:localhost:30952 사용자명@ssh_서버
scp
- Secure Copy; SSH를 이용해 네트워크로 연결된 호스트 간 파일 전송
- -r: 재귀적으로 복사
- -P: ssh 포트 지정
- -i: ssh 설정을 활용해 실행
- (local => remote) scp local_path user@ip:remote_directory
- (remote => local) scp user@ip:remote_directory local_path
- (remote=>remote) scp user@ip:remote_directory user2@ip2:target_remote_directory
nohup
- 터미널 종료 후에도 계속 작업이 유지되도록 실행 (백그라운드 실행)
- e.g. nohup python3 app.py &
- nohup으로 실행된 파일은 permission이 755여야 함
- 종료: ps ef | grep app .py -> pid 찾은 후 kill -9 pid
- 로그는 nohup.out에 저장됨
- nohup 외에 screen이란 도구도 있음
chmod
- Change Mode; 파일의 권한 변경
- Unix에서 파일이나 폴더의 시스템 모드를 변경
- ls -al(혹은 ll)로 권한 확인 가능
- 소유자 / 그룹 / 기타 사용자
- r: read(읽기), 4
- w: write(쓰기), 2
- x: excute(실행), 1
- -: denied
- e.g. chmod 755 beaver.sh // 파일의 permision을 755로 변경
- 755 = rwx r-x r-x // 소유자 7, 그룹 5, 기타 사용자 5
python
쉘 스크립트
- 쉘 커맨드의 조합
- .sh 파일을 생성하고 그 안에 쉘 커맨드를 추가
- #!/bin/bash: Shebag; 이 스크립트를 Bash shell로 해석
- python처럼 if, while, case문이 존재하며, 작성 시 bash [filename].sh 로 실행
- 인자
- $1, $2, $3: 1, 2, 3번째 인수를 참조
- $#: 변수를 사용해 전달된 인수의 개수 확인
- $@: 모든 변수에 접근
- 함수
- python처럼 함수 정의 및 사용 가능
- 사용: 함수명+인자
- 변수 할당: 변수=$(함수+인자)
function add_numbers {
local result=$(( $1 + $2 ))
echo $result
}
sum=$(add_numbers 10 20)
echo "두 수의 합: $sum"
- 조건문
- python처럼 \==, !=, &&, || 연산자 사용 가능
- 파일 관련 조건문
- -e: exist; 파일 존재 여부 확인
- -f: file; 파일 여부 확인
- -d: directory; 디렉토리 여부 확인
- -r: readable; 읽기 여부 확인
쉘 스크립트 활용하기
-
Python이 설치되어 있지 않은 경우 유용함.
-
script성으로 실행할 수 있는 것들
-
e.g. 모델 학습 시, 여러 파라미터를 정의해 순차적으로 학습하는 script
-
e.g. 로그 파일 분석, 데이터 전처리
-
서버를 잘 다루기 위해선 쉘 커맨드, 쉘 스크립트에 대해 알아야 함.
-
여러 명령어가 존재함을 알고, 필요할 때 검색해서 쓰기
-
grep, awk, cut 등을 사용해 Python 없이 데이터 처리가 가능
-
쉘 스크립트로 모델 학습, 백그라운드 실행, 로그 파일 구성하는 task는 현업에서 많이 진행