앞서 알아본 대로 리눅스의 가장 대표적인 특징은 멀티 유저입니다
이는 여러 사용자가 동시에 하나의 시스템에 접근할 수 있음을 뜻합니다
리눅스에서 작동하는 모든 프로세스는 사용자(계정)로부터 시작됩니다
(이 파일을 누가 만들었고, 수정했고, 사용했는지 등의 행위가 기록됩니다)
*프로세스의 UID
A라는 계정이 로그인된 상태에서
vi
명령어를 통해 hello.txt
라는 파일을 생성했습니다
이 경우 이 파일의 소유자는 A가 됩니다
A는 만약 B라는 계정이 hello.txt
에 접근하려고 했을 때
접근 가능한 수준(열람금지, 수정불가 등)을 제한할 수 있습니다
B가 이 파일에 접근하려면 소유자의 허가, 즉 권한이 필요합니다
B는 A에게 부여받은 권한대로 파일을 열거나 수정 및 저장할 수 있게 됩니다.
또한 권한을 부여해야 할 사용자가 많아질 경우,
개개인 별로 권한을 부여하는 것이 번거로워지기 때문에
그룹이라는 개념도 존재합니다
리눅스에는 3가지 타입의 사용자가 존재합니다
리눅스는 설치할 때부터 자동적으로 root
계정을 생성합니다.
그리고 우리가 사용할 일반 사용자 계정도 생성합니다
(0번과 1000번, 맥OS의 경우 사용자 계정은 501번~)
먼저 사용자를 확인하는 명령어들입니다.
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
는 로그인한 계정과 터미널, 그리고 로그인 시간 등과 같은 정보도 같이 출력해줍니다.)
다음은 사용자 생성, 수정 조회를 위한 명령어입니다
사용자 생성 및 수정과 관련된 명령어들은 대부분 root
계정의 권한이 필요합니다
root
계정에 접속해서 만드는 방법도 있기는 하지만,
무척 위험하기 때문에 보통은 금기시합니다.
cd /etc
> ls -al
> ls -al |grep passwd
> vi passwd
(이 경우 에디터로 패스워드 파일을 열었을 때 열람은 가능하지만
수정 및 저장이 불가능한 것은 사용자에게 권한이 없기 때문입니다)
하지만 일반 사용자에게 root
계정의 권한이 필요한 경우들이 있습니다
이럴 때에는 root
계정의 권한을 잠시 빌려쓸 수 있어야 합니다.
sudo
(substitute user do) : 다른 사용자의 권한으로 실행할 수 있다
sudo vi passwd
(방금 전과 달리 관리자 권한을 위임받아서 에디터를 열었기 때문에
에러 없이 수정 및 저장이 가능합니다. 위험!)
다음은 sudo
가 필요한 명령어들입니다
sudo
명령어를 쓴다는 것은 root
사용자의 권한이 필요하다는 것을 뜻합니다
adduser
: 새로운 사용자를 생성합니다
sudo adduser user1
위 명령어로 계정을 생성하면 리눅스가 다음과 같은 요구를 합니다.
[sudo] password for user
: 이 때 요구하는 패스워드는 현 사용자의 계정입니다New password
: 새롭게 생성될 사용자 계정의 패스워드를 적어야 합니다
useradd
: 새로운 사용자를 생성합니다
sudo useradd user1
*useradd
는 adduser
와 달리 순수하게 계정 자체만 생성합니다.
(홈 디렉토리 등은 사용자가 수동으로 생성해야 합니다)
다음은 sudo
를 필요로 하는 다른 케이스들입니다
/etc/passwd
> 출력내용 해석하기
userB:x:1002:1004:,,,:/home/userB:/bin/bash
이 명령어들은 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
)
리눅스에서는 그룹을 통해서 파일에 관한 접근 권한을 허가 및 제한할 수 있습니다.
한 명의 사용자가 다수의 그룹에 속하는 것 또한 가능합니다.
*직접 그룹 생성을 하지 않았을 때에도 현재 사용자의 사용자명이
기본 그룹으로 설정되어 있습니다. (맥 OS는 기본 그룹명이 staff)
groups
: 현재 로그인 된 사용자가 속한 그룹 리스트를 확인합니다.
아래 명령어들은
sudo + 명령어 + 그룹명
의 형태로 적습니다
groupadd
: 새로운 그룹을 생성하는 명령어groupmod
: 그룹에 관한 내용을 수정할 때 사용하는 명령어
sudo groupmod -aG
groupdel
: 그룹을 삭제하는 명령어
/etc/group
: 출력 내용 해석하기
blockchain:x:1003:userA,userB,userC
먼저 파일이 들어있는 디렉토리에서 ls -al
을 띄웠을 때 나타나는
권한설정에 대한 문자열을 해석하는 방법에 대해 알아보겠습니다.
-rw-r--r--
>
-/rw-r--r--
>
-
// A
rw- r-- r--
// B : 두 번째 글자부터는 세 글자씩 묶고 띄어서 읽습니다
-
: normal filed
: directoryl
: linked file (window의 바로가기)p
: named pipes
: socketc
: character deviceb
: block devicer
: 읽기(4)w
: 쓰기(2)x
: 실행(1)+) 아래 출력 내용으로 재확인해보겠습니다.
drwxr-xr-x 4 kimxx staff 128 11 9 18:43 .vscode
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 권한 부여가 제대로 되지 않을 경우에는
아래 명령어를 사용합니다.
etc/sudoers
vi /etc/sudoers
root ALL=(ALL:ALL) ALL
kim-- ALL=(ALL:ALL) ALL
:wqs!
Shell
은 사용자의 명령어를 커널에 전달하는 인터페이스 역할을 합니다.
쉘이 해석한 명령어를 kernel
(커널)에 전달하면,
커널은 이를 컴퓨터가 이해할 수 있는 언어로 변환하여 하드웨어에 전달합니다.
쉘은 커널에서 분리된 별도의 프로그램이어서 지금도 다양한 쉘이 존재하고
지금도 발전을 계속하고 있습니다.
bash
: 우분투가 사용중인, 현재 리눅스의 표준 쉘입니다.zsh
: 현재 가장 인기있는 쉘입니다.bash
쉘보다 더 많은 기능을 보유하고 있습니다.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 등)은
직접 설치 코드 명령어를 찾아서 설치해야 합니다.