네트워크
네트워크 관리 프로토콜 및 서버
원격 접속
- telnet
- SSH: 최근에는 SSH를 주로 이용
파일 송수신
외부에서 telnet 프로토콜로 원격 접속을 하는 것
data는 평문으로 보낸다.
→ 보안을 위해 SSH를 사용해서 데이터를 암호화해서 전송하기로 했다. But, 이것도 해독 가능. 해독하는데 시간만 좀 걸릴 뿐.
백그라운드와 데몬은 다른 개념이다.
백그라운드는 사용자의 요청과 상관 없다.
데몬은 대기하고 있다가 사용자의 요청이 오면 그때 일을 하는 것. 동작만 백그라운드에서 하는 것
파일을 송수신 하기 위해선 파일 서버가 있어야 한다.
(웹 서버로도 할 수 있지만 파일이 많아지면 오버헤드 때문에 속도가 느려진다.)
- FTP (File Transfer Protocol) : 파일 송수신 프로토콜
- 서버 설치하기
- 패키지 이름: vsftpd
- 설정 파일: /etc/vsftpd.conf
- 데몬 이름: vsftpd
- 항상 데몬을 확인하는 명령어는 systemctl status 데몬이름
- 서버 동작 확인: telnet 0 21 (trying ~ 이라고 나오면 접속이 된 것!)
- FTP 클라이언트 사용
- 접속: ftp 주소
ftp 10.0.2.15
- 명령어
- cd: 디렉토리 변경
- lcd: 로컬의 디렉토리로 이동
- pwd: 원격 호스트의 디렉토리 출력
- !pwd: 로컬의 디렉토리를 호출
- ls: 파일 목록을 출력
- !ls: 로컬의 파일 목록을 출력
- mkdir
- get 원격 파일명: 원격 호스트의 파일 1개를 다운로드
- mget 원격 파일명: 여러 개의 파일을 다운로드
- put: 업로드
- mput: 여러 개의 파일 업로드
- prompt: 파일 전송 여부를 확인
- bin: 바이너리 파일을 송수신 한다는 것을 지정
- bye: 종료
- open: 호스트를 다시 입력
- user: 사용자를 다시 입력
- ? 또는 help: 명령에 대한 도움말을 출력
메일 송수신
- 패키지: mailutils
- 설치: sudo apt install mailutils
- 기본 포트가 25 (ftp는 기본 포트가 21이었음)
- 서버 구동 중인지 확인: telnet 0 25
- 메일 클라이언트 설정: /usr/bin/mail
mailx [옵션] [이메일 주소]
메일 보내기 및 읽기 명령
- 옵션
- -s: 메일 제목 지정
- 메일 보내기
- ex. user1에게 전송
mailx 사용자이메일주소 mailx user1
DB Server
MariaDB 패키지: mariadb-server
sudo apt install mariadb-server
MariaDB 서비스 이름: mariadb.server
systemctl status mariadb.service
→ 서비스가 실행 중인지 확인하는 게 정말 중요!
로컬에서 접속: mysql이나 maridb
sudo mysql
→ 로컬에서는 아이디 물어보지 않는다.
mysqladmin [옵션]
데이터베이스 관리 명령
- 옵션
- version
- status
- password 암호 (루트의 패스워드를 정할 수 있다.)
- 일반 유저 접속
mysql -u 유저명 -p
sudo mysql -u root -p
- mariadb 외부 접속 허용
- ls /etc/mysql/mariadb.conf.d/ 이 mariadb 설정 파일
- mariadb이지만 mysql 폴더에 들어가있다. (이름만 mysql로 되어 있는 것)
- /etc/mysql/mariadb.conf.d/50-server.cnf 에 들어가서
bind-address = 127.0.0.1 (→ 로컬에서만 접속할 수 있다.) 이렇게 되어 있는 걸
0.0.0.0 으로 해야지 모두 다 접속할 수 있다.
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
- sudo systemctl restart mysqld
- 설정 파일을 수정하면 항상 재시작을 해줘야 한다.
- virtualbox에 가상 머신으로 설치했을 때는 포트 포워딩을 해야만 외부에서 접속 가능하다.
- 계정에서도 외부에서 사용할 수 있도록 설정을 추가해줘야 한다.
Web Server
apache web server
- 설치
sudo apt install apache2
- 서비스 이름: apache2
systemctl status apache2 #로 active 상태인지 확인
- 방화벽 해제
sudo ufw disable # 해제
sudo ufw enable # 활성화
sudo utw status # 상태 확인
들어오는 것을 막는 것: firewall - Out bound
나가는 것을 막는 것: firewall -In bound
: proxy server: 외부로 나갈 때 이 서버를 거쳐서 나가도록 한다.
ajax: java script 비동기 요청
→ SOP 적용 (Same Origin in Policy)
→ 서버 쪽에 CORS 정책 설정을 해주면 가능하다.
- welcome 파일 위치: /var/www/html 디렉토리의 index.html
이 파일을 바꿔주면 welcome 파일이 바뀐다.
셸 프로그래밍
- 셸 스크립트는 Unix나 Linux 또는 POSIX(Portable Operating System Interface)를 지원하는 운영체제인 Mac OS 등에서 일반적으로 사용하는 명령어들과 if, for 와 같은 프로그래밍적인 요소로 이루어진 인터프리터 기반의 스크립트 언어
- 셸 스크립트는 물리 서버나 가상 서버 또는 컨테이너에서도 사용 가능
- 셸 스크립트는 시스템 엔지니어와 리눅스나 유닉스를 다루거나 인프라와 개발을 담당하는 데브옵스 엔지니어들이 주로 사용한다.
기본 문법
- 기본 작성 및 실행
- 작성할 때 확장자는 대부분 sh를 사용한다.
#!/bin/bash
echo "hello world"
→ #!/bin/bash 는 주석이 아니고 셔뱅이라고 해서 이 파일의 설정을 알려주는 것
→ 지금은 bash 셸 스크립트라고 알려줌
→ 파이썬에서는 인코딩 방식을 적어주는 경우가 있음
- 기본 작성 및 실행
1. sh 또는 bash 파일 경로
sh myshell.sh
bash myshell.sh # sh는 함수 인지를 못한다.
2. 실행 권한을 부여하고 파일 경로를 직접 적어서 실행
ls -l myshell.sh # -rw-rw-r-- 1 kyla kyla 32 May 27 03:20 myshell.sh
chmod +x myshell.sh # 없던 실행 권한 주기
→ 단독 실행 하려면 path에 있어야 하는데 지금은 없으니까 myshell.sh 라고만 쓰면 안되고 ./myshell.sh로 써줘야 한다.
- 변수 생성
리눅스는 공백이 의미를 갖는다. 함수 또는 명령어의 인자를 구분할 때 공백을 사용한다.
변수명 = 값
- 변수 사용
- $변수명
- 변수 사용해서 디렉토리 만들기
#!/bin/bash
dirname="Korean"
mkdir $dirname
→ Korean이라는 디렉토리 생성됨
- 변수의 종류
- 함수: 특정한 동작이나 목적을 위해 만든 코드의 집합
- 함수를 이용하면 스크립트의 줄 수를 줄여주고 좀 더 효율적으로 스크립트를 만들 수 있다.
- 함수를 작성해서 실행 (→ bash 파일 이름.sh 로 실행하거나 2번째 방법인 실행 권한을 부여하고 파일 경로를 직접 적어서 실행 해야 한다.)
#!/bin/bash function print(){ echo $1 } print "I am Function."
- 전역 변수: 함수 외부에서 만들어져서 함수 내부나 외부 모든 곳에서 사용할 수 있는 변수
- 지역 변수: 함수 내부에서 local이라는 예약어와 함께 선언해서 함수 내부에서만 사용 가능한 변수
→ 스크립트 언어는 줄 단위로 번역하면서 실행하기 때문에 쪼개서 작성하면 디버깅 하기 쉽다.(어디서 문제가 발생했는지 알기 쉽다.)#!/bin/bash globalvar="Korea" function lean() { echo $globalvar local localvar="English" echo $localvar } function print() { echo $1 } print "I am Function." lean echo $globalvar echo $localvar ### 결과 I am Function. Korea English Korea
- 예약 변수 및 환경 변수
- HOME: 사용자의 홈 디렉토리 경로
- PATH: 실행 파일을 찾는 경로
- Windows, 프로그래밍 언어: 명령어를 현재 디렉토리에서 찾고 PATH에서 찾는다.
- Linux, Unix: PATH에서만 찾는다.
- → PATH에다 .을 넣어서 현재 디렉토리를 넣어놓으면 윈도우와 같게 된다.
- FUNCNAME: 현재 실행 중인 함수 이름
- LANG: 프로그램 사용 시 지원되는 언어
- PWD: 현재 작업 디렉토리
- TERM: 로그인 터미널 타입
- SHELL: 현재 셸
- USER: 사용자
- USERNAME: 사용자 이름
- GROUP: 사용자 그룹
- DISPLAY: X 디스플레이 이름
- COLUMNS: 현재 터미널이나 윈도우 터미널의 컬럼 수
- LINES: 터미널의 라인 수
- PS1, PS2, PS3, PS4: 기본 프롬프트 변수
- BASH: Bash 실행 경로
- BASH_VERSION: Bash 버전
- HISTFILE: History 파일 경로
- HISTSIZE: History 크기
- HOSTNAME: 호스트 이름
- HOSTTYPE: 호스트 종류(하드웨어 종류)
- MACHTYPE: 하드웨어 종류인데 조금 더 자세히
- MAIL: 메일 보관 경로
- LOGNAME: 로그인 이름
- TMOUT: 0이면 제한이 없고 TIME 시간 지정하면 지정한 시간 이후 로그아웃
- SECONDS: 스크립트가 실행된 시간
- UID: 사용자 UID
- OSTYPE: 운영체제 종류
- 함수: 특정한 동작이나 목적을 위해 만든 코드의 집합
- 위치 매개변수
- $0: 실행된 스크립트 파일
- $1~: 함수를 호출할 때 입력한 파라미터로 10번부터는 { }로 감싸줘야 한다. (${10})
- $*: 파라미터 전체
- $@: 파라미터 전체를 나타내는데 “”로 감싸면 $*과 달라진다.
- $#: 파라미터 개수
- 위치 매개변수 사용
#!/bin/bash
echo "This shell script name : $0"
echo "I can speak $1 and $2"
echo "This shell script parameters are $*"
echo "This shell script parameters are $@"
echo "This parameter count is $#"
- 특수 매개변수
- $$: 현재 스크립트 또는 명령어의 PID
- $?: 최근에 실행된 명령어, 함수, 스크립트의 종료 상태
- $!: 최근에 실행한 백그라운드 명령의 PID
- $-: 현재 옵션 플래그
- 변수의 문자열 자르기
- ${변수:숫자1:숫자2}: 숫자1은 앞에서부터 위치이고 숫자2를 설정하면 글자 수
- 음수도 가능: 음수는 뒤에서부터
- 파일명과 디렉토리 추출
- FILE_PATH=”/etc/nova/nova.conf”
echo ${FILE_PATH%/*} # 파일의 디렉토리만 출력
echo ${FILE_PATH##*/} # 파일명 출력
- 조건문
- if: 조건에 따라 다른 명령을 수행할 수 있도록 해주는 제어문. [ ] 사이 조건식 넣을 때 한칸씩 띄어줘야 한다.
if [ 조건식 ] then 수행문 elif [ 조건식 ] 수행문 else 수행문 fi #########---------- #!/bin/bash value1=10 value2=10 if [ $value1 = $value2 ] then echo TRUE else echo FALSE fi # 답: TRUE
- 연산자가 문자열
- -gt
- -lt
- -gte
- -lte
- &&
#!/bin/bash value=5 if [ $value -gt 0 ] && [ $value -lt 10 ] then echo TRUE else echo FALSE fi # 답: TRUE
- switch ~ case
case $변수 in
조건값1)
수행할 내용 ;;
조건값2)
수행할 내용 ;;
*)
수행할 내용 ;;
esac
#!/bin/bash
case $1 in
start)
echo "START" ;;
stop)
echo "STOP" ;;
restart)
echo "RESTART" ;;
help)
echo "HELP" ;;
*)
echo "Please input sub command" ;;
esac
- 반복문
- for
for 변수 in [범위(리스트, 배열, 묶음 등)] do 수행할반복문 done
→ 디렉토리도 iterator이다.#!/bin/bash for num in 1 2 3 do echo $num; done numbers="1 2 3" for num in $numbers do echo $num; done for file in $HOME/* do echo $file; done for num in {1..5} do echo $num; done #### 결과 1 2 3 1 2 3 /home/kyla/Desktop /home/kyla/Documents /home/kyla/Downloads /home/kyla/Music /home/kyla/Pictures /home/kyla/Public /home/kyla/Templates /home/kyla/Videos /home/kyla/index.html.1 /home/kyla/index.html.2 /home/kyla/index.html.3 /home/kyla/linux_ex /home/kyla/snap /home/kyla/temp /home/kyla/test /home/kyla/xterm {1..5}
-
#!/bin/bash for num in {1..10..2} do echo $num; done ar="apple banana pineapple" for fruit in $ar do echo $fruit; done for ((num1=0; num1<3; num1++)) do echo $num; done
- while
→ dash 셸에서 에러나면 sh로 실행하지 말고 bash나 파일에 실행 권한을 주어서 실행해야 한다.#!/bin/bash num=0 while [ $num -le 3 ] do echo "numbers: $num" ((num++)) done for ((a=0; a<10; a++)) do echo "$a" done
- 연산자
- -z: 문자열의 길이가 0이면 참
- -n: 문자열의 길이가 0이 아니면 참
- -eq:
- -ne:
- -gt
- -ge
- -lt
- -le
- =
- <
- <=
- =
- ==
- !=
- -a: && (and)
- -o: || (or)