- 학습 내용
내가 진행하고 있는 부트캠프의 섹션 3은 백엔드에 관련된 전반적인 애용으로 데이터베이스, 인증/보안 그리고 베포에 대한 내용을 학습하게 된다. 그러니 당연히 CLI의 환경에 대한 기초적인 이해는 필수이다. 그래서 이번 시간에는 CLI의 사용 권한이 무엇인지 그리고 그것을 조작하는 방법과 환경변수에 대한 개념을 학습한다. 그리고 간단히 CLI를 통해 필요한 내용을 불러와서 확인하는 데에 사용되는 몇 가지 명령어를 알아보고자 한다.
- 사용 권한
CLI에서 파일을 보거나, 수정하거나, 실행할 때는 권한이 필요하다. 왜냐하면 Linux에서 사용하는 폴더와 파일에는 모두 권한이 있기 때문이다. 그 권한은 읽기(Read), 쓰기(Write), 실행(Execute)으로 나뉜다. 이것을 확인하기 위해 CLI에서 폴더를 하나 만들고 CLI 에디터인 nano를 사용한다. 먼저 mkdir 명령어로 linux라는 폴더를 만들고 nano를 이용해 helloworld.js라는 파일을 생성하여 아래처럼 작성한다.
저장하고 에디터를 빠져나와 ls -l을 입력하면 다음과 같은 출력을 만나게 된다.
파일 helloworld.js는 -rw-r--r--이라고 출력했고 폴더 linux는 drwxr-xr-x라고 출력했다. 이 표현의 첫 시작인 -와 d는 각 not directory와 directory를 나타낸다. 폴더이면 d로 파일이면 -로 나타내는 것이다. 저기서 r, w, x는 각 read permission, write permission, execute permission으로 읽기 권한, 쓰기 권한, 실행 권한을 나타낸다. 3번에 걸쳐 나타나는 이유는 사용자와 그룹, 나머지에 대한 권한을 표시하기 때문이다. 즉, helloworld.js의 권한은 소유자는 읽기와 쓰기가 가능하고 다른 사용자 그룹과 나머지는 읽기만 가능하다는 뜻이다.
user | user는 파일의 소유자이다. 기본적으로 파일을 만든 사람이 소유자가 된다. 그래서 user를 소유자라고 하기도 한다. |
group | group에는 여러 user가 포함될 수 있다. 그룹에 속한 모든 user는 파일에 대한 도일한 group 액세스 권한을 갖는다. 많은 사람이 파일에 액세스해야 하는 프로젝트가 있다면, 각 user에게 일일이 권한을 할당하는 것이 아니라 group에 추가하고 파일에 group 권한을 할당할 수 있다. |
other | 파일에 대한 액세스 권한이 있는다른 user이다. 파일을 만들지 않은 다른 모든 user를 의미한다. 따라서 other 권한을 설정하면, 해당 권한을 global 권한 설정이라고 볼 수도 있다. |
명령어 chmod로 폴더나 파일의 읽기, 쓰기, 실행 권한을 변경할 수 있다. OS에 로그인한 사용자와 폴더나 파일을 소유자가 같은 결우에 명령어 chmod로 폴더나 파일의 권한을 변경할 수 있다. 만약 OS에 로그인한 사용자와 폴더나 파일의 소유자가 다를 경우에는 관리자 권한을 획득하는 명령어 sudo를 이용해 폴더나 파일의 권한을 변경할 수 있다. 명령어로 chmod로 권한을 변경하는 방식은 더하기(+), 빼기(-), 할당(=)과 액세서 유형을 표기해서 변경하는 방식인 Symbolic method와 rwx를 3bit로 해석해서 숫자 3자리로 권한을 표기해서 변경하는 방식인 Absolute form이 있다.
1) Symbolic method
Access class | Operator | Access Type |
u(user) | + (add access) | r (read) |
g(group) | - (remove access) | w (write) |
o (other) | = (set exact access) | x (execute) |
a (all: u, g, and o) |
예를 들어 아래와 같이 사용할 수 있다.
chmod g-r [filename]
chmod o+x [filename]
chmod u+x [filename]
chmod a=rw [filename] # -rw-rw-rw-
chmod u= [filename] # ----rw-rw-
2) Absolute form
Permission | Number |
Read(r) | 4 |
Write(w) | 2 |
Execute(x) | 1 |
chmod 744 [filename] # -rwxr--r--
chmod 001 [filename] # ---------x
# | Sum | rwx | Permission |
7 | 4(r) + 2(w) + 0(-) | rw- | read, write and excute |
6 | 4(r) + 2(w) + 0(-) | r-w | read and white |
5 | 4(r) + 0(-) + 1(x) | r-x | read and execute |
4 | 4(r) + 0(-) + 0(x) | r-- | read only |
3 | 0(-) + 2(w) + 1(x) | -wx | write and execute |
2 | 0(-) + 2(w) + 0(-) | -w- | write only |
1 | 0(-) + 0(-) + 1(x) | --x | execute only |
0 | 0(-) + 0(-) + 0(-) | --- | none |
- 환경 변수
Linux 기반의 운영체제의 PC에서 시스템 자체에 전역 변수를 설정할 수 있다. 그리고 시스템에 설정한 전역 변수를 환경변수라고 한다. export를 이용해 환경변수를 설정할 수 있다. CLI창에 export를 입력하면 기록된 환경변수를 확인할 수 있다. 새로운 환경변수를 추가할 수도 있는데 다음과 가이 입력하면 새로운 환경변수가 추가된다.
export anything="hello"
echo와 함께 환경변수를 입력하면 환경변수의 값을 확인할 수 있다. 이때 환경변수의 앞에는 달러사인($)을 입력하여 변수라는 뜻을 전달한다.
또 npm 모듈 dotenv를 이용하면 자바스크립트에서 환경변수를 사용할 수도 있다. npm 모듈을 설치하고 사용하기 위해서 새로운 폴더를 만들고 npm init을 입력한다. 그리고 dotenv를 설치한다. 이때 생성된 폴더는 설치할 모듈과 이름이 같으면 안 된다.
mkdir environment_variable
cd enbironment_variable
npm init
npm i dotenv
설치한 dotenv를 이용해 환경변수에 접근할 수 있다. index.js 파일을 생성하고 그 안에 process.env를 출력한다. Node.js의 내장 객체 process.env를 이용하면 명령어 export로 확인한 내용과 동일한 내용을 객체로 출력한다. 명령어 export로 적용한 환경변수는 현재 사용 중인 터미널에서만 임시로 사용이 가능하며, 환경변수를 Linux 운영체제에 저장하는 방법은 여러 가지가 있지만 Node.js에선 파일 .env를 만들어 저장하는 방법을 사용한다. 먼저 .env 파일을 생성하고 사용하고자 하는 환경변수를 입력한 뒤 저장한다.
nano .env
cat .env
myname=seonghyeon
그리고 index.js에 다음과 같이 입력한다.
const dotenv = require("dotenv");
dotenv.config();
console.log(process.env.myname);
실행하면 다음과 같은 결과가 출력된다.
node index.js # seonghyeon
이런 식으로 환경변수를 이용해 API key, DB password와 같은 민감한 정보를 저장하고 관리할 수 있다. 또 서로 다른 PC 또는 여러 .env파일에서 같은 변수 이름에 다른 값을 할당할 수 있다. 실제 제품(서비스)을 개발하는 과정에는 개발 환경(local 또는 development 등)과 테스트 서버의 환경(test), 그리고 실제 제품을 제공하는 환경(production)이 있다. 데이터베이스 역시 마찬가지로 개발, 테스트, 제품 환경으로 구분할 수 있다. 이런 식으로 개발 환경과 제품을 제공하는 환경에서 환경변수를 이용해 환경을 구분하여 코드를 작성할 수 있는 것이다.
- uniq
uniq 명령어는 중복된 내용의 행이 연속으로 있으면 하나만 남기고 삭제한다. 전체적으로 분산된 중복은 찾아내지 못하기 때문에 주로 정렬하여 순차적으로 만든 뒤 적용한다.
-c | 같은 라인이 몇번 나오는지를 표시 |
-d | 중복되어 나오는 라인 중 한 라인만 표시 |
-D | 중복되는 모든 라인을 보여줌 |
-N | 필터링은 무시할 라인을 정함. 시작 라인부터 N번째 라인까지는 검사하지 않음 |
-i | 중복 라인을 한라인으로 생각하고 출력 |
-u | 중복 라인이 없는 것만 보여줌 |
-w | N번째 문자까지만 비교대상으로 하여 uniq 명령을 수행 |
-s | N번째 문자까지만 비교대상에서 제외하고 uniq 명령을 수행 |
-f | N번째 필드를 비교대상에서 제외하고 uniq명령을 수행 |
- awk
awk는 파일로부터 레코드(record)를 선택하고, 선택된 레코드에 포함된 값을 조작하거나 데이터화하는 것을 목적으로 사용하는 프로그램이다. 즉, awk 명령의 입력으로 지정된 파일로부터 데이터를 분류한 다음, 분류된 텍스트 데이터를 바탕으로 패턴 매칭 여부를 검사하거나 데이터 조작 및 연산 등의 액션을 수행하고 그 결과를 출력하는 기능을 수행함.
awk [OPTION] [awk program] [ARGUMENT]
1) OPTION
-F | 필드 구분 문자 지정 |
-f | awk program 파일 경로 지정 |
-v | awk program에서 사용될 특정 variable값 지정 |
2) awk program
-f 옵션이 사용되지 않은 경우, awk가 실행할 awk program코드를 지정한다. 구조의 경우 pattern { action }이다. 예를 들면 아래와 같다.
awk '{ print }' ./file.text # file.txt의 모든 레코드 출력
awk 'length($0) > 10 { print $3, $4, $5 }' .file.txt # 레코드의 길이가 10 이상인 경우, 세 번째, 네 번째, 다섯 번째 필드를 출력함
3) ARGUMENT
입력 파일 지정 또는 variable 값을 지정한다.
4) awk 사용 예
awk 사용 예 | 명령어 옵션 |
파일의 전체 내용 출력 | awk '{ print }' [FILE] |
필드 값 출력 | awk '{ print $1 }' [FILE] |
필드 값에 임의 문자열을 같이 출력 | awk '{ print "STR"$1, "STR"$2 }' [FILE] |
지정된 문자열을 포함하는 레코드만 출력 | awk '/STR/' [FILE] |
특정 필드 값 비교를 통해 선택된 레코드만 출력 | awk '$1 == 10 { print $2 }' [FILE] |
특정 필드들의 합 구하기 | awk '{ sum += $3 } END { print sum }' [FILE] |
여러 필드들의 합 구하기 | awk '{ for (i=2; i<=NF; i++) total+= $i }; END { print "TOTAL : "total }' [FILE] |
레코드 단위로 필드 합 및 평균 값 구하기 | awk '{ sum = 0 } { sum += ($3+$4+$5) } { print $0, sum,sum/3 }' [FILE] |
필드에 연산을 수행한 결과 출력하기 | awk '{ print $1, $2, $3+2, $4, $5 }' [FILE] |
레코드 또는 필드의 문자열 길이 검사 | awk ' length($0) > 20' [FILE] |
파일에 저장된 awk program 실행 | awk -f [AWK FILE] [FILE] |
필드 구분 문자 변경하기 | awk -F ':' '{ print $1 }' [FILE] |
awk 실행 결과 레코드 정렬하기 | awk '{ print $0 }' [FILE] |
특정 레코드만 출력하기 | awk 'NR == 2 { print $0; exit }' [FILE] |
출력 필드 너비 지정하기 | awk '{ printf "%-3s %-8s %-4s %-4s %-4s\n", $1, $2, $3, $4, $5 }' [FILE] |
필드 중 최대 값 출력 | awk '{ max = 0; for (i=3; i<NF; i++) max = ($i > max) ? $i : max ; print max }' [FILE] |
- grep
grep은 입력으로 전달된 파일의 내용에서 특정 문자열을 찾고자 할 때 사용하는 명령어이다. 그러나 grep이 문자열을 찾는 기능을 한다고 해서 단순히 문자열이 일치하는지 여부만 검사하는 것이 아니다. grep이 파일의 문자열을 검색할 때 단순 문자열 매칭이 아니라 정규 표현식에 의한 패턴 매칭 방식을 사용하기 때문이다. 정규 표현식이란 특정 규칙을 가진 문자열 집합을 표현하기 위한 형식 언어로써 주로 문자열 패턴 매칭을 검사하거나 문자열을 치환하기 위해 사용한다. 문자열 검색에 정규 표현식을 적용하면 지정된 문자열의 문자가 단순히 같은지 여부가 검사되는 것이 아니라 정규 표현식의 규칙에 매칭 되는지 여부가 검사된다.
grep [OPTIONS...] PATTERN [FILE...]
-E | PATTERN을 확장 정규 표현식으로 해석 | -F | PATTERN을 정규 표현식이 아닌 일반 문자열로 해석 |
-G | PATTERN을 기본 정규 표현식으로 해석 | -P | PATTERN을 Perl 정규 표현식으로 해석 |
-e | 매칭을 위한 PATTERN 전달 | -f | 파일에 기록된 내용을 PATTERN으로 사용 |
-i | 대/소문자 무시 | -v | 매칭되는 PATTERN이 존재하지 않는 라인 선택 |
-w | 단어(word) 단위로 매칭 | -x | 라인(line) 단위로 매칭 |
-z | 라인을 newline(\n)이 아닌 NULL(\0)로 구분 | -m | 최대 검색 결과 갯수 제한 |
-b | 패턴이 매치된 각 라인 (-o 사용 시 문자열)의 바이트 옵셋 출력 | -n | 검색 결과 출력 라인 앞에 라인 번호 출력 |
-H | 검색 결과 출력 라인 앞에 파일 이름 표시 | -h | 검색 결과 출력 시, 파일 이름 무시 |
-o | 매치되는 문자열만 표시 | -q | 검색 결과 출력하지 않음 |
-a | 바이너리 파일을 텍스트 파일처럼 처리 | -I | 바이너리 파일은 검사하지 않음 |
-d | 디렉토리 처리 방식 지정 (read, recuse, skip) | -D | 장치 파일 처리 방식 지정 (read, skip) |
-r | 하위 디렉토리 탐색 | -R | 심볼릭 링크를 따라가며 모든 하위 디렉토리 탐색 |
-L | PATTERN이 존재하지 않는 파일 이름만 표시 | -l | 패턴이 존재하는 파일 이름만 표시 |
-c | 파일 당 패턴이 일치하는 라인의 갯수 출력 |
grep 사용 예 | 명령어 옵션 |
대상 파일에서 문자열 탐색 | grep "STR" [FILE] |
현재 디렉토리 모든 파일에서 문자열 탐색 | grep "STR" * |
특정 확장자를 가진 모든 파일에서 문자열 검색 | grep "STR" *.ext |
대소문자 구분하지 않고 문자열 검색 | grep -i "STR" [FILE] |
매칭되는 PATTERN이 존재하지 않는 라인 선택 | grep -v "STR" [FILE] |
단어(word) 단위로 문자열 검색 | grep -w "STR" [FILE] |
검색된 문자열이 포함된 라인 번호 출력 | grep -n "STR" [FILE] |
하위 디렉토리를 포함한 모든 파일에서 문자열 검색 | grep -r "STR" * |
최대 검색 결과 갯수 제한 | grep -n 100 "STR" [FILE] |
검색 결과 앞에 파일 이름 표시 | grep -H "STR" * |
문자열 A로 시작하여 문자열 B로 끝나는 패턴 찾기 | grep "A.*B" * |
0-9 사이 숫자만 변경되는 패턴 찾기 | grep "STR[0-9]" * |
문자열 패턴 전체를 정규 표현식 메타 문자가 아닌 일반 문자로 검색하기 | grep -F "*[]?..." [FILE] |
정규 표현식 메타 문자를 일반 문자로 검색하기 | grep "\*" [FILE] |
문자열 라인 처음 시작 패턴 검색하기 | grep "^STR" [FILE] |
문자열 라인 마지막 종료 패턴 검색하기 | grep "$STR" [FILE] |
- pipe
파이프라인이란 하나의 프로그램의 결과를 다른 프로그램의 입력으로 주는 작업을 말한다.
ls --help | grep sort # ls의 해설 중 sort가 첨부된 행만 출력함.
'인증,보안' 카테고리의 다른 글
[인증/보안] 기초2 (0) | 2022.06.24 |
---|---|
[인증/보안] 기초1 (0) | 2022.06.23 |
Git 기초1 (0) | 2021.07.06 |
Linux 기초2 패키지(package)와 런타임(runtime) (0) | 2021.07.05 |
Linux 기초1 터미널(Terminal) (0) | 2021.06.30 |