Linux #2 / TIL

리눅스 알아보기 2nd Chapter !!

Featured image

1. 표준 스트림 / 파이프라인 / 리다이렉션
2. 출력 관련 명령어
3. 관리자로서의 리눅스 / 권한


표준 스트림 / 파이프라인 / 리다이렉션

표준 스트림

*스트림 : 프로그램을 드나드는(입, 출력) 데이터의 흐름

파이프라인과 리다이렉션

리다이렉션 기호 방향 의미
> 표준 출력 명령의 결과를 파일로 저장 (기존 파일 덮어씀)
>> 표준 출력 (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)


$ process1 | process2

# ex >>
$ ls -l | grep ssh

출력 관련 명령어

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 . -name “이름*# 찾을 파일 이름을 지정해서 찾기

$ find . -name “이름*-type d 
# 이 중에 디렉토리만 찾기

$ sudo find / -size+10M 
# 파일 크기 지정해서 찾기 → 디렉토리 권한 때문에 sudo 사용

$ find . -empty 
# 빈파일 찾기

$ find . -newer practice.txt 
# practice 파일 보다 최근에 변경된 파일 찾기

$ locate gatsby.txt 
# 파일 이름으로 검색하기

$ locate -n 10 *.txt 
# 검색할 파일 수 지정하여 찾기

$ which ls
usr/bin/ls

$ which python3
/usr/bin/python3

$ grep "Gatsby" [filename]
# filename 파일에서 "Gatsby" 문자열 찾기

$ grep "Gatsby" * 
# 현재 디렉토리에서 Gatsby 문자열 검색

$ grep "문자열" *.txt 
# txt 확장자를 가진 파일에서 "문자열" 검색

$ grep -i "문자열" [filename] 
# filename 파일에서 "문자열"을 대소문자 구분없이 찾기

$ grep -v "문자열" [filename]
# filename 파일에서 "문자열"이 없는 라인 나타내기

시스템 관리자


사용자와 관리자 

 평소 우리의 컴퓨터는 사용자 계정으로 돌아가고, 어떠한 프로그램에 우 클릭을 할 시 관리자 권한으로 프로그램을 실행할 수 있다. 관리자 권한으로 실행되는 PC에서는, 악성코드가 삽입된 프로그램일지라도 어떠한 안전 장치 없이 설치된다. 때문에 악성코드가 심어져 있는지 파악할 수 없다. 

 리눅스 기반 운영체제인 우분투에서는, 사용자가 절대 관리자 권한에 접근할 수 없도록 구분해 두었는데, 특정 명령어를 입력하는 것으로 잠시 관리자 권한을 빌려올 수 있다. 리눅스는 처음부터 다중 사용자가 컴퓨터를 사용하는 환경으로 디자인 되었다. 

리눅스 표준 접근 제어 모델 : 접근 제어에 대한 분명한 원칙이 존재함

$ 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 권한을 나타낸다.
$ su - 사용자명

$ su
Password: 
su: Authentication failure

# 우분투에서 'su'는 비활성화 되어있음
# 대체적으로 루트 권한을 일시적으로 사용하기 위해선 'sudo'를 권장함

환경 변수

$ env
# 환경 변수 확인 명령어

$ export urclass="is good"
# 새로운 환경 변수 추가
# 등호 표시 앞 뒤에는 공백이 없어야함

$ echo $urclass
is good
# echo 명령어와 $를 입력하여, 변수라는 뜻을 터미널에 전달함

환경 변수 설정은 지금 열려있는 터미널(세션)에 한정된다. 따라서 새로운 터미널 창을 열면, export 명령으로 설정해 놓은 환경 변수는 초기화 된다.


chmod : 권한을 변경하는 명령어

액세스 클래스 (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 # 사용자에게 실행 권한 추가

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------ 파일의 소유자에게 읽기, 쓰기 및 실행 권한 추가
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) >> 다른 사용자에게 읽기 권한 부여