15 min to read
Linux #2 / TIL
리눅스 알아보기 2nd Chapter !!
1. 표준 스트림 / 파이프라인 / 리다이렉션
2. 출력 관련 명령어
3. 관리자로서의 리눅스 / 권한
표준 스트림 / 파이프라인 / 리다이렉션
표준 스트림
- 일반적으로 작동하는 프로그램은 실행 시, 세 개의 *스트림이 자동으로 열리고, 이를 표준 스트림이라고 한다.
- 리눅스의 /dev 디렉토리에서 아래의 형태로 세 개의 표준 스트림을 담고 있다.
- 입력을 위한 스트림 (표준 입력) : Standard Input, STDIN, 0
- 입력값의 데이터(보통은 문자열) 스트림. 표준 입력 설정이 키보드로 되어 있는데, 모든 프로그램이 입력을 요구하지 않으며, 대표적인 예로는 비밀번호를 입력할 때 표준 입력 스트림을 사용한다. - 출력을 위한 스트림 (표준 출력) : Standard Output, STDOUT, 1
- 출력 데이터를 기록하는 스트림. 표준 출력은 텍스트 터미널에서 이루어진다. 모든 프로그램이 출력을 요구하는 것은 아니다. - 오류 메세지를 출력하기 위한 스트림 (표준 오류) : Standard Error, STDERR, 2
- 오류 메세지나 진단을 출력하기 위해 일반적으로 쓰이는 또 다른 출력 스트림.
*스트림 : 프로그램을 드나드는(입, 출력) 데이터의 흐름
파이프라인과 리다이렉션
- 리다이렉션 : 표준 스트림의 흐름을 바꿔 파일로 입/출력 할 수 있도록 한다. 기호는 ‘>’ , ‘<’ 를 사용한다.
- 기호 종류
리다이렉션 기호 | 방향 | 의미 |
> | 표준 출력 | 명령의 결과를 파일로 저장 (기존 파일 덮어씀) |
>> | 표준 출력 (append) | 명령의 결과를 기존 파일에 추가 |
< | 표준 입력 | 파일의 데이터를 명령에 입력 |
$ ps aux > ps.txt : ps aux
# 명령어 > 파일
≫ 실행 결과
명령의 출력 스트림을 ps.txt 파일로 전환하여 저장한다.
$ head < ps.txt
# 명령어 < 파일
≫ 실행 결과
ps.txt의 처음 10줄을 *head의 입력 스트림으로 전환하여 보낸다.
$ head < ps.txt > sample.txt
# 명령어 < 들어오는 파일 > 나가는 파일
≫ 실행 결과
1. ps.txt의 내용을 head 명령의 입력 스트림으로 전환하여 전송
2. head 명령은 입력 받은 ps.txt 의 내용에서 처음 10줄을 출력
3. head 명령은 출력 스트림을 sample.txt 파일에 연결
4. head 명령의 출력 스트림은 결과를 sample.txt 파일에 저장
*head 명령어 : 파일의 처음 부분을 설명한 라인(line)만큼 출력한다.
파이프 (Pipe)
- 파이프는 어떤 명령의 결과를 다시 어떤 명령의 입력으로 받아야 할 때 사용되며, 프로세스1의 출력 스트림을 프로세스2의 입력 스트림으로 사용할 때 다음과 같이 파이프 기호를 사용하여 작성한다.
$ process1 | process2
# ex >>
$ ls -l | grep ssh
- ls -l 명령을 표준 출력으로 하고, 출력된 내용을 ssh 라는 인자를 전달 받는 grep 명령에 표준 입력으로 전달시키는 파이프
출력 관련 명령어
- 파일 읽기
man | 매뉴얼 (도움말 보기) 명령어 * Space Bar 또는 PgDn : 다음 페이지로 넘어감 * q : 종료 |
cat <옵션> <파일이름> | 파일 내용 출력 * 옵션 : -n / line 번호를 함께 출력 |
more <옵션> <파일이름> | 파일을 화면 단위로 끊어서 출력 * 옵션 : +<number> / 입력한 line을 포함한 페이지를 출력 +/<string> / 입력한 문자열이 포함된 페이지를 출력 * Enter : 다음 줄 출력 * Space : 다음 페이지 출력 * b : 이전 페이지 출력 * q : 종료 |
less <옵션> <파일이름> | 파일 내용 출력 * 옵션 : -N / line 번호를 함께 출력 |
head <옵션> <파일이름></span> | 파일 앞 부분 출력 * 옵션 : -n / 지정한 라인까지 출력 |
tail <옵션> <파일이름></span> | 파일 뒷 부분 출력 * 옵션 : -n / 지정한 라인까지 출력 -f / 즉시 종료되지 않고, 파일의 내용이 추가되는 상태를 지켜보며 계속 이어서 출력 |
- 파일 및 디렉토리 찾기
find <위치> <옵션> 검색할 내용 | 파일 검색 * 옵션 : -name / 지정한 내용의 이름을 가진 파일을 찾음 -type <옵션> / 옵션에 따른 형태를 가진 파일을 찾음 |
locate <옵션> <파일이름> | 특정 파일 위치 찾기 |
which <위치> | 실행파일 위치 식별 |
- find 예시
# find 예시
$ find . -name “이름*”
# 찾을 파일 이름을 지정해서 찾기
$ find . -name “이름*” -type d
# 이 중에 디렉토리만 찾기
$ sudo find / -size+10M
# 파일 크기 지정해서 찾기 → 디렉토리 권한 때문에 sudo 사용
$ find . -empty
# 빈파일 찾기
$ find . -newer practice.txt
# practice 파일 보다 최근에 변경된 파일 찾기
- locate 예시
$ locate gatsby.txt
# 파일 이름으로 검색하기
$ locate -n 10 *.txt
# 검색할 파일 수 지정하여 찾기
- which 예시
$ which ls
usr/bin/ls
$ which python3
/usr/bin/python3
-
패턴으로 찾기 (grep)
- grep (global, regular expression, print)
- 파일이나 표준 입력을 검색하여 주어진 정규 표현식에 맞는 줄을 찾아 프로그램의 표준 출력으로 출력
- 대량의 텍스트 파일에서 패턴을 검색할 때 사용할 수 있는 가장 강력한 정규식 터미널 명령 - 정규 표현식 (regular expression)
- 특정 규칙을 가진 문자열 집합을 표현하기 위한 형식 언어
- 문자열 패턴 매칭을 검사하거나 문자열을 치환하기 위해 사용
$ grep "Gatsby" [filename]
# filename 파일에서 "Gatsby" 문자열 찾기
$ grep "Gatsby" *
# 현재 디렉토리에서 Gatsby 문자열 검색
$ grep "문자열" *.txt
# txt 확장자를 가진 파일에서 "문자열" 검색
$ grep -i "문자열" [filename]
# filename 파일에서 "문자열"을 대소문자 구분없이 찾기
$ grep -v "문자열" [filename]
# filename 파일에서 "문자열"이 없는 라인 나타내기
시스템 관리자
- 접근 제어 : 관리자 권한을 이용해 사용자를 관리하고, 시스템에 속한 사용자가 암호를 잊거나 키 쌍을 분실하였을 때를 대비한다. 사용자 및 그룹 별로 적절한 권한은 제공한다.
- 업무 자동화 : 반복적인 작업은 반드시 자동화, 실수 최소화
- 재난 대비 : 데이터 백업, 필요에 따라 복구
- 애플리케이션 배포 및 관리 : 애플리케이션이 지속적으로 새 버전이 배포되는지 문제 확인 및 환경 구축, 런타임 버전 관리, 운영체제의 보안 패치
- 모니터링 : 모니터링을 통해 서버 자원의 여유 감시, 로그 파일을 수집 / 분석, 보안 취약점을 발견하고 감사하는 작업
- 내부 문서 관리 / 접근 정책 설정 / 클라우드 서비스 요금 관리 / 하드웨어 추가 등
사용자와 관리자
평소 우리의 컴퓨터는 사용자 계정으로 돌아가고, 어떠한 프로그램에 우 클릭을 할 시 관리자 권한으로 프로그램을 실행할 수 있다. 관리자 권한으로 실행되는 PC에서는, 악성코드가 삽입된 프로그램일지라도 어떠한 안전 장치 없이 설치된다. 때문에 악성코드가 심어져 있는지 파악할 수 없다.
리눅스 기반 운영체제인 우분투에서는, 사용자가 절대 관리자 권한에 접근할 수 없도록 구분해 두었는데, 특정 명령어를 입력하는 것으로 잠시 관리자 권한을 빌려올 수 있다. 리눅스는 처음부터 다중 사용자가 컴퓨터를 사용하는 환경으로 디자인 되었다.
리눅스 표준 접근 제어 모델 : 접근 제어에 대한 분명한 원칙이 존재함
-
규칙
- 파일 및 디렉토리는 소유자(owner)가 있다. (소유했다고 모든 권한을 갖는 것은 아니다.)
- 파일은 생성한 사람만이 소유한다.
- 관리자(root)만 할 수 있는 일이 있다. - whoami : 사용자 확인
- 현재 로그인 된 사용자를 확인하는 명령어 : 처음 생성한 사용자 ID가 출력된다. - **홈 디렉토리 (/home/
)** \- 홈 디렉토리의 이름은 처음 설치할 때 입력했던 사용자 아이디(username) \- username에 맞게 디렉토리를 생성하여 해당 디렉토리 내에 권한을 사용하도록 제한 \- 루트 디렉토리 : ( **/** ) 로 표현, 최상위 디렉토리 \- 사용자 디렉토리의 경로 : ( **~** ) 로 표현, 루트 디렉토리로부터 홈 디렉토리까지의 경로를 축약한 형태 - 파일 및 디렉토리의 소유자(사용자) 및 그룹
- ‘sudo’ 명령어는 사용자 환경에서 루트 권한을 일시적으로 획득하는 명령어이다. 비밀번호를 입력해야 실행 가능하다.
- ‘id ‘ 명령어는 uid 및 해당 사용자가 속해있는 그룹을 포함하여 출력한다.
$ sudo cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
kimcoding:x:1001:1001::/home/kimcoding:/bin/sh
parkhacker:x:1002:1002::/home/parkhacker:/bin/sh
choigosu:x:1003:1003::/home/choigosu:/bin/sh
# 처음 등장하는 필드 : 사용자 이름
# 세 번째 등장하는 숫자 : uid (user id)
# 루트 계정의 uid는 항상 0이다.
# /etc/passwd 파일은 비밀번호를 포함하지 않는다.
# 비밀번호가 저장되어 있는 파일은 /etc/shadow 파일이며
# 비밀번호 문자열은 암호화 되어있다.
$ id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),118(netdev),119(lxd)
$ id -u ubuntu
1000
$ sudo cat /etc/group
- gid (group id)를 볼 수 있는 명령어
루트(root) 권한 : 관리자 권한
루트 디렉토리는 사용자 권한만으로는 디렉토리나 파일을 생성, 변경 또는 삭제 할 수 없다. (읽기 전용 / Read-only)
루트 권한과 사용자 권한의 차이점 (mkdir)
$ mkdir justMkdir # 일반 사용자 권한으로 생성
$ sudo mkdir sudoMkdir # 루트 권한으로 생성
password:
$ ls -l
total 8
drwxr-xr-x 4 ocean1220 staff 128 3 28 09:00 hello
-rw-r--r-- 1 ocean1220 staff 0 3 20 23:03 helloWorld.txt
-rw-r--r--@1 ocean1220 staff 26 3 20 20:02 hi. txt
drwxr-xr-x 2 ocean1220 staff 64 3 29 19:47 justMkdir # 사용자 소유 디렉토리
drwxr-xr-x 2 root staff 64 3 29 19:47 sudoMkdir # root 소유 디렉토리
# 첫 번째 열의 시작인 '-'와 'd'는 디렉토리인지 아닌지를 구별한다.
# 이어지는 r, w, x는 각각 read(읽기) / write(쓰기) / execute(실행) permission 권한을 나타낸다.
- 폴더나 파일의 권한 정보
- user : 파일의 소유자(owner)이다. 기본적으로 파일을 만든 사람이 소유자이다.
- group : 여러 user가 포함될 수 있다. 그룹에 속한 user는 파일에 대한 동일한 group 엑세스 권한을 갖는다.
- other : 파일에 대한 엑세스 권한이 있는 다른 user. 파일을 만들지 않은 다른 모든 user를 의미한다. other 권한을 설정하면, 해당 권한을 global 권한 설정이라고 볼 수 있다. - 루트 권한을 가져야만 할 수 있는 작업
- 하드웨어 장치 추가 생성 (장치 파일 생성)
- 시스템 시간 설정
- hostname(네트워크 이름) 설정
- 네트워크 인터페이스 설정
- 1024번 이하의 포트 오픈
- 시스템 종료 - 루트 계정 로그인
- su (substitute user identity) : 사용자 대리자
$ su - 사용자명
$ su
Password:
su: Authentication failure
# 우분투에서 'su'는 비활성화 되어있음
# 대체적으로 루트 권한을 일시적으로 사용하기 위해선 'sudo'를 권장함
- sudo의 장점
- 명령 로그 기록
- 사용자들은 무제한의 루트 권한 없이 특정 작업 수행 가능
- 루트 비밀번호를 몰라도 사용 가능 (사용자 비밀번호 이용)
- 루트 암호를 변경하지 않고도, 부여된 특권을 취소할 수 있다.
- 루트 권한을 갖는 모든 사용자의 목록을 관리할 수 있다. (sudoers 파일) - sudo의 단점
- sudo 사용자 개인 계정의 보안이 뚫리면, 루트 계정 자체가 뚫린 것과 마찬가지이다.
- sudo 명령 기록은 sudo를 이용해 지울 수 있다. (단, 명령어 로그를 통해 알 수 있음)
환경 변수
- 리눅스 CLI로 환경 변수를 설정하고 확인할 수 있다.
- 서비스를 운영하는 상황이 달라질 때 사용한다. 서비스가 개발 환경일 때, 테스트 환경일 때, 실제 운영 될 때를 환경 변수로 분리할 수 있다. 이를 환경 변수로 처리하지 않으면, 개발 환경과 실제 운영 환경에서 소스 코드가 달라야만 하고, 소스 코드가 다르면 완벽하게 동일한 프로그램이라고 할 수 없다.
-
서비스가 어떤 인증정보(id, passwd 등)를 포함하고 있을 때, 이를 분리하려는 용도로 환경 변수를 사용한다. 그렇지 않으면, 소스 코드에 id와 passwd를 직접 입력해야 하는데, 이는 유지 보수도 어렵고 인증 정보 노출의 우려가 있다.
- SHELL : 어떤 종류의 대화형 인터페이스를 사용할 지 선택하는 환경 변수
- HOME : 홈 디렉토리가 무엇인지 알려주는 환경 변수
- PATH : 어디서든 해당 디렉토리에 있는 실행 파일을 실행할 수 있게 만들어주는 환경 변수
$ env
# 환경 변수 확인 명령어
$ export urclass="is good"
# 새로운 환경 변수 추가
# 등호 표시 앞 뒤에는 공백이 없어야함
$ echo $urclass
is good
# echo 명령어와 $를 입력하여, 변수라는 뜻을 터미널에 전달함
환경 변수 설정은 지금 열려있는 터미널(세션)에 한정된다. 따라서 새로운 터미널 창을 열면, export 명령으로 설정해 놓은 환경 변수는 초기화 된다.
chmod : 권한을 변경하는 명령어
- OS에 로그인한 사용자와, 폴더나 파일의 소유자가 같을 경우 폴더나 파일의 권한을 변경할 수 있다.
- 만약 OS에 로그인한 사용자와, 폴더나 파일의 소유자가 다를 경우 sudo 명령어를 이용해 권한을 변경할 수 있다.
- Symbolic method : ( + ), ( - ), ( = ), 액세서 유형을 표기해서 권한을 변경
액세스 클래스 (Access class)</span> | 연산자 (Operator)</span> | 액세스 타입 (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 g+r filename # 그룹에 읽기 권한을 추가
chmod g-w filename # 그룹에서 쓰기 권한 제거
chmod g+w filename # 그룹에 쓰기 권한 추가
chmod g-x filename # 그룹에서 실행 권한 제거
chmod g+x filename # 그룹에 실행 권한 추가
chmod o-r filename # 그룹에 실행 권한 추가
chmod o+r filename # 다른 사용자에게 읽기 권한 추가
chmod o-w filename # 다른 사용자로부터 쓰기 권한 제거
chmod o+w filename # 다른 사용자에게 쓰기 권한 추가
chmod o-x filename # 다른 사용자로부터 실행 권한 제거
chmod o+x filename # 다른 사용자에게 실행 권한 추가
chmod u+x filename # 사용자에게 실행 권한 추가
- Absolute form : rwx를 3 bit로 해석하여, 숫자 3자리로 권한을 표기해서 변경
- 숫자 7까지 나타내는 3 bits의 합으로 표기하며, 사용자, 그룹, 또는 다른 사용자나 그룹마다 rwx 가 나타나고, 각 영역의 boolean 값으로 표기할 수 있다.
chmod a=rw helloworld.js
# -rw-rw-rw- 모든 사용자에게 파일에 대한 읽기 쓰기 권한 부여
chmod u= helloworld.js
# ----rw-rw- 파일의 소유자로부터 모든 권한 제거, 그룹 및 기타 사용자에 대한 읽기 및 쓰기 권한만 남김
chmod a+rx helloworld.js
# -r-xrwxrwx 파일에서 모든 사용자에게 읽기 및 실행 권한 추가, 소유자와 그룹만 쓰기 권한
chmod go-wx helloworld.js
# -r-xr--r-- 그웁 및 기타 사용자의 쓰기 및 실행 권한 제거
chmod a= helloworld.js
# ---------- 파일에서 모든 사용자의 모든 권한 제거
chmod u+rwx helloworld.js
# -rwx------ 파일의 소유자에게 읽기, 쓰기 및 실행 권한 추가
- 다음은 Absolute form 구분 표이다.
- 아래 표 숫자의 합은 user, group, other 순으로 입력하여 사용한다.
Permission | Number |
Read (r) | 4 |
Write (w) | 2 |
Execute (x) | 1 |
chmod 744 helloworld.js # -rwxr--r--
# u=rwx (4 + 2 + 1 = 7) >> 사용자에게 전체 권한 부여
# go=r (4 + 0 + 0 = 4) >> 그룹에게 읽기 권한 부여
# o=r (4 + 0 + 0 = 4) >> 다른 사용자에게 읽기 권한 부여