Linux-2 (22/11/22)

nazzzo·2022년 11월 22일
0

1. 사용자 계정

  • 사용자 계정
    • 권한
    • 그룹

앞서 알아본 대로 리눅스의 가장 대표적인 특징은 멀티 유저입니다
이는 여러 사용자가 동시에 하나의 시스템에 접근할 수 있음을 뜻합니다

리눅스에서 작동하는 모든 프로세스는 사용자(계정)로부터 시작됩니다
(이 파일을 누가 만들었고, 수정했고, 사용했는지 등의 행위가 기록됩니다)
*프로세스의 UID


A와 B라는 사용자 계정이 있다고 합시다

A라는 계정이 로그인된 상태에서
vi 명령어를 통해 hello.txt라는 파일을 생성했습니다

이 경우 이 파일의 소유자는 A가 됩니다

A는 만약 B라는 계정이 hello.txt에 접근하려고 했을 때
접근 가능한 수준(열람금지, 수정불가 등)을 제한할 수 있습니다

B가 이 파일에 접근하려면 소유자의 허가, 즉 권한이 필요합니다
B는 A에게 부여받은 권한대로 파일을 열거나 수정 및 저장할 수 있게 됩니다.

또한 권한을 부여해야 할 사용자가 많아질 경우,
개개인 별로 권한을 부여하는 것이 번거로워지기 때문에
그룹이라는 개념도 존재합니다



2. 사용자 타입


리눅스에는 3가지 타입의 사용자가 존재합니다

  • 사용자 타입
    • 루트 사용자 - UID 0 (최고 관리자를 의미합니다)
    • 시스템 사용자 - UIDs 1-999
      (대략 1000번 미만의 숫자가 할당됩니다)
    • 일반 사용자 Uids 1000~

리눅스는 설치할 때부터 자동적으로 root 계정을 생성합니다.
그리고 우리가 사용할 일반 사용자 계정도 생성합니다
(0번과 1000번, 맥OS의 경우 사용자 계정은 501번~)


3-1. 사용자 관련 명령어

먼저 사용자를 확인하는 명령어들입니다.

id : 현재 사용자의 아이디(uid)와 사용자가 속한 그룹의 아이디(gid)를
포함한 모든 아이디 관련 정보를 출력하는 명령어

uid=501(kim--) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh),400(com.apple.access_remote_ae),701(com.apple.sharepoint.group.1)

id mysql

uid=74(_mysql) gid=74(_mysql) groups=74(_mysql),12(everyone),61(localaccounts),100(_lpoperator),701(com.apple.sharepoint.group.1)

id -u : 현재 사용자의 아이디만 출력합니다

id -u
501

id -un : 현재 사용자의 이름을 출력합니다

id -un
kim--

이 옵션은 추가로 인자값을 받을 수 있습니다
(스페이스 + 인자값은 리눅스의 명령어 입력 패턴...)
id -u mysql
id -un root

whoami : 현재 사용자의 이름을 조회하는 명령어
(id는 숫자입니다. 사용자명과 혼동X)


who : 현재 로그인 되어 있는 전체 사용자의 정보를 조회합니다.


users : 현재 시스템에 로그인되어 있는 사용자들을 조회합니다.

(users가 어떤 계정들이 접속죽인지만 출력해주는 반면,
who는 로그인한 계정과 터미널, 그리고 로그인 시간 등과 같은 정보도 같이 출력해줍니다.)



3-2. 사용자 관련 명령어 2

다음은 사용자 생성, 수정 조회를 위한 명령어입니다

사용자 생성 및 수정과 관련된 명령어들은 대부분 root 계정의 권한이 필요합니다

root 계정에 접속해서 만드는 방법도 있기는 하지만,
무척 위험하기 때문에 보통은 금기시합니다.

cd /etc > ls -al > ls -al |grep passwd > vi passwd
(이 경우 에디터로 패스워드 파일을 열었을 때 열람은 가능하지만
수정 및 저장이 불가능한 것은 사용자에게 권한이 없기 때문입니다)

하지만 일반 사용자에게 root계정의 권한이 필요한 경우들이 있습니다

이럴 때에는 root 계정의 권한을 잠시 빌려쓸 수 있어야 합니다.

sudo (substitute user do) : 다른 사용자의 권한으로 실행할 수 있다

sudo vi passwd
(방금 전과 달리 관리자 권한을 위임받아서 에디터를 열었기 때문에
에러 없이 수정 및 저장이 가능합니다. 위험!)


다음은 sudo가 필요한 명령어들입니다

  • sudo 명령어를 쓴다는 것은 root 사용자의 권한이 필요하다는 것을 뜻합니다
    (권한을 빌려오지 않으면 Permission denied 에러 메세지가 출력)

adduser : 새로운 사용자를 생성합니다

sudo adduser user1

위 명령어로 계정을 생성하면 리눅스가 다음과 같은 요구를 합니다.

  • [sudo] password for user : 이 때 요구하는 패스워드는 현 사용자의 계정입니다
  • New password : 새롭게 생성될 사용자 계정의 패스워드를 적어야 합니다

useradd : 새로운 사용자를 생성합니다

sudo useradd user1

*useraddadduser와 달리 순수하게 계정 자체만 생성합니다.
(홈 디렉토리 등은 사용자가 수동으로 생성해야 합니다)


다음은 sudo를 필요로 하는 다른 케이스들입니다

/etc/passwd > 출력내용 해석하기

userB:x:1002:1004:,,,:/home/userB:/bin/bash
  • userB : 사용자의 이름
  • 1002 : 사용자의 id(uid)
  • 1004 : 사용자가 속해있는 그룹 id(gid)
  • ,,, : 코멘트 & 풀네임 등의 텍스트
  • /home/userB: : 사용자의 디렉토리(홈 디렉토리)
  • /bin/bash : 로그인이 되었을 때의 shell 경로

이 명령어들은 sudo + 명령어 + 사용자명의 형태로 적습니다

passwd : 사용자의 패스워드를 설정할 때 사용하는 명령어

usermod : 사용자 계정의 여러 정보나 값을 변경할 때 사용하는 명령어

userB:x:1002:1004:,,,:/home/userB:/bin/bash

-s : shell 경로를 바꿀 경우에 사용하는 옵션

sudo usermod -s /bin/zsh userB
                (바꿀 내용 사용자명)

-G : 그룹 아이디를 변경할 경우에 사용하는 옵션

sudo usermod -G blockchain userB
                (바꿀 내용 사용자명)

userdel : 사용자 계정을 삭제하는 명령어
-r : 홈 디렉토리 안에 있는 폴더까지 모두 삭제하는 옵션

sudo userdel -r userB 

위 명령어를 직접 써보고 변경된 사용자 정보를 확인합시다
(cd ~ > ls -al)



4. 사용자 그룹


리눅스에서는 그룹을 통해서 파일에 관한 접근 권한을 허가 및 제한할 수 있습니다.
한 명의 사용자가 다수의 그룹에 속하는 것 또한 가능합니다.

*직접 그룹 생성을 하지 않았을 때에도 현재 사용자의 사용자명이
기본 그룹으로 설정되어 있습니다. (맥 OS는 기본 그룹명이 staff)

4-1. 그룹 관련 명령어

groups : 현재 로그인 된 사용자가 속한 그룹 리스트를 확인합니다.

아래 명령어들은 sudo + 명령어 + 그룹명의 형태로 적습니다

  • groupadd : 새로운 그룹을 생성하는 명령어
  • groupmod : 그룹에 관한 내용을 수정할 때 사용하는 명령어
    • sudo groupmod -aG
  • groupdel : 그룹을 삭제하는 명령어

/etc/group : 출력 내용 해석하기

blockchain:x:1003:userA,userB,userC
  • blockchain : 그룹명
  • 1003 : 그룹id (그룹id도 1000번부터 시작합니다)
  • userA,userB,userC : 그룹에 속한 유저명



4-2. 파일 접근 권한 설정

먼저 파일이 들어있는 디렉토리에서 ls -al을 띄웠을 때 나타나는
권한설정에 대한 문자열을 해석하는 방법에 대해 알아보겠습니다.

-rw-r--r--

>
-/rw-r--r-- 
>
-
// A 
rw- r-- r--
// B : 두 번째 글자부터는 세 글자씩 묶고 띄어서 읽습니다
  • A의 의미
    조회된 내용이 파일인지 폴더인지를 구분
    - - : normal file
    - d : directory
    - l : linked file (window의 바로가기)
    - p : named pipe
    - s : socket
    - c : character device
    - b : block device
  • B의 의미
    • r : 읽기(4)
    • w : 쓰기(2)
    • x : 실행(1)


    • 첫번째(rw-)은 소유자에 대한 설명입니다
    • 두번째(r--)은 그룹에 대한 설명입니다
    • 세번째(r--)은 기타 사용자(게스트 등)에 대한 설명입니다

+) 아래 출력 내용으로 재확인해보겠습니다.

drwxr-xr-x   4 kimxx  staff    128 11  9 18:43 .vscode
  • d : 디렉토리
  • rwx : 사용자는 읽기-쓰기-실행이 모두 가능
  • r-x : 그룹은 읽기와 실행만 가능
  • r-x : 게스트 및 기타 사용자는 읽기와 실행만 가능
  • 4 : 실행중인 파일 갯수
  • kimxx : 계정명
  • staff : 그룹명 (맥 OS의 기본 그룹)

chmod : 해당 파일에 대한 접근 권한을 바꾸는 명령어

  • rwx = 7
  • rw- = 6
  • r-x = 5
  • r-- = 4

    (*r은 4, w는 2, x는 1입니다)

chmod명렁어를 통해 현재 권한이 [rw- r-- r-- ]인 파일을
[rwx r-x r-x]로 수정하려면 어떻게 할까요?


ls al | grep hello.txt
// rw- r-- r--
// 6   4   4

chmod 755 ./hello.txt
ls al | grep hello.txt
// -rwxr-xr-x
//  7  5  5

chmod 644 ./hello.txt
ls al | grep hello.txt
// rw- r-- r--
// 6   4   4



chown : 해당 파일의 소유권을 바꾸는 명령어

-rw-r--r--
// 권한 설정입니다
root root
// 소유자명과 그룸명입니다
sudo chown root:root ~/hello.txt
ls -al | grep hello.txt
vi hello.txt
// 루트 관리자만 수정할 수 있는 파일이 된 것을 확인할 수 있습니다

*맥OS에서 확인하려면...

sudo chown 0:0 ~/hello.txt
vi hello.txt

> ls -al
-rw-r--r--@  root  wheel   hello.txt

*(Mac OS에서 최종관리자의 그룹명은 Wheel입니다.)



+) sudo 권한 부여하기

sudo 권한 부여가 제대로 되지 않을 경우에는
아래 명령어를 사용합니다.

etc/sudoers

vi /etc/sudoers

root    ALL=(ALL:ALL) ALL
kim--   ALL=(ALL:ALL) ALL

:wqs!



5. Shell

Shell은 사용자의 명령어를 커널에 전달하는 인터페이스 역할을 합니다.

쉘이 해석한 명령어를 kernel(커널)에 전달하면,
커널은 이를 컴퓨터가 이해할 수 있는 언어로 변환하여 하드웨어에 전달합니다.

쉘은 커널에서 분리된 별도의 프로그램이어서 지금도 다양한 쉘이 존재하고
지금도 발전을 계속하고 있습니다.

  • bash : 우분투가 사용중인, 현재 리눅스의 표준 쉘입니다.
  • zsh : 현재 가장 인기있는 쉘입니다.
    bash쉘보다 더 많은 기능을 보유하고 있습니다.



5-1. zsh 설치하기


GUI 환경이든 CLI 환경이든 인스톨 파일은
내부적으로 모두 코드의 묶음 형태로 이루어져 있습니다.

아카이브 파일(tar)은 구조적으로 우리가 사용하는 압축파일(zip)과
다름없습니다. 패키지도 코드의 배포를 위해 사용되는 코드의 묶음일 뿐이며
(패키지는 폴더에 가깝습니다), 인스톨이란 결국 압축을 푸는 행위와 같습니다.


CLI 환경에서 파일을 설치하려면 어떻게 해야할까요?

일반적으로는 패키지 매니저를 사용합니다.

  • 패키지 매니저란 패키지를 다루는 작업을
    편리하고 안전하게 수행하기 위해 사용되는 툴입니다.

  • 또한 새로운 소프트웨어를 설치, 업데이트, 삭제하는 행위를
    패키지 관리라고 말합니다.

  • 패키지를 설치하기 위해서는 다운로드부터
    설치, 테스트, 업그레이드, 의존성 관리 등 복잡한 상황이 발생합니다.
    이런 복잡성을 낮추고 쉽게 패키지를 이용할 수 있도록
    돕는 소프트웨어가 패키지 매니저 입니다.

  • 여기서 의존성이란 패키지안에 포함된
    클래스 사이에서의 관계가 의존 관계라는 것을 뜻합니다

    어떤 패키지 안에 있는 클래스가 다른 패키지 안에 있는 클래스에
    무엇이 되었든 의존성이 있다면 패키지 간의 의존성이 있다는 뜻으로,
    하나의 클래스가 바뀌면 그에 의존한 다른 클래스까지
    변경이 이루어질 수 있기 때문에 의존성 관리가 중요합니다.

*객체지향 프로그래밍에서는 의존성이라는 단어를 정말 자주 사용합니다...



↓ 아래는 각 OS를 대표하는 패키지 매니저입니다.

  • apt : 리눅스(우분투) 패키지 매니저
    apt install
apt install zsh

*dpkg은 리눅스에서의 install 파일 확장자명


  • homebrew : 맥 OS 패키지 매니저
    brew install
brew install zshl

*dmg는 맥 OS에서의 install 파일 확장자명


파일의 설치가 잘 끝났는지를 확인하려면 버전 체크가 가장 간편합니다

zsh --version

*패키지 매니저에 포함이 되어있지 않은 파일(예oh my zshell 등)은
직접 설치 코드 명령어를 찾아서 설치해야 합니다.

0개의 댓글

관련 채용 정보