[Linux] Ubuntu Package | tar, zip | Compile | make | User, Group

pos++·2023년 11월 5일
0

Linux

목록 보기
7/16
post-thumbnail

2023.11.01 TIL

Ubuntu Package

About Ubuntu Package

deb

devian, Ubuntu 계열에서 사용하는 패키지

  • Binary 파일로 구성 - 컴파일이 필요 없다
  • 패키지의 파일이 관련 디렉토리에 바로 설치된다
  • 패키지를 삭제할 때 관련된 파일을 일괄적으로 삭제할 수 있다
  • 바로 업그레이드가 가능하다
  • 해당 패키지와 의존성을 가지고 있는 패키지가 무엇인지 알려준다
    따라서 의존성이 있는 패키지를 미리 설치할 수도 있고, apt 명령을 사용하면 의존성이 있는 패키지가 자동으로 설치된다

Ubuntu Package Category

  • main : 우분투에 의해 공식적으로 지원, 자유롭게 배포 가능
  • restricted : 우분투에 의해 지원, 완전한 자유 라이선스는 아님
  • universe : 리눅스에서 사용할 수 있는 거의 대부분의 SW, 자유 SW일수도 아닐수도 있고, 기술적 지원 보장하지 않음
  • multiverse : 자유 SW가 아닌 SW가 포함, 개인이 직접 라이선스를 관리해야함

Ubuntu Package 저장소

패키지의 기능 추가, 보안 패치 등 지속적인 업그레이드 관리

사용자는 저장소에 접속하여 최신 패키지를 설치할 수 있다.

패키지 저장소에 대한 정보
→ /etc/apt/sources.list 파일
→ 패키지 유형, 저장소 주소(http URL 주소), Ubuntu 버전 정보, 카테고리

Ubuntu Package 설치

apt 명령으로 패키지 관리하기

apt [명령] [package_name]

update → update list of available packages

list → list packages based on package names

upgrage → (비추) upgrade the system by installing/upgrading packages


search → search in package descriptions

install → install packages

remove → remove packages

purge → remove packages and configurations

apt-cache show vsftpd → vsftpd 패키지에 대한 간단한 정보 출력

-f → 검색 결과로 패키지에 대한 전체 기록 출력

-h → 간단한 도움말 출력

stats → 캐시에 대한 통계 정보 출력

dump → 현재 설치되어 있는 패키지 업그레이드

search [keyword] → 캐시에서 키워드 검색

showpkg [packagename] → 패키지에 대한 의존성, 역의존성 정보 검색하여 출력

show [packagename] → 패키지에 대한 간단한 정보 출력

pkgnames → 사용가능한 모든 패키지의 이름 출력

Ubuntu Package 설치하기

apt-get install vsftpd → vsftpd 패키지 설치

apt-get install netcat --only-upgrade → netcat 패키지를 새로 설치하지 않고 업그레이드만

-d → 패키지를 내려받기만 한다

-f → 의존성이 깨진 패키지를 수정하려고 시도

-h → 간단한 도움말 출력

update → 패키지 저장소에서 새로운 패키지 정보를 가져옴

upgrade → 현재 설치되어 있는 패키지 업데이트

install [packagename] → 패키지 설치 또는 업그레이드

--no-upgrade → upgrade 없이 설치

--only-upgrade → 설치하지 않고 업그레이드만

remove [packagename] → 패키지 삭제

download [packagename] → 패지키를 현재 디렉토리로 다운로드

autoclean → 불완전하게 내려받았거나 오래된 패키지를 삭제

autoremove → 자동으로 설치되었으나 필요없는 패키지 정리

clean → 캐지되어 있는 모든 패키지를 삭제, 디스크 공간 확보

check → 의존성이 깨진 패키지를 확인

apt-get --download-only source [packagename] → 패키지의 소스코드만 다운로드

apt-get --compile source [packagename] → 패키지의 소스코드를 내려받아 압축을 풀어 컨파일


dpkg 명령으로 패키지 관리하기

apt 명령과 달리 의존성이 있는 패키지를 자동으로 설지하지 않는다.

dpkg -s netcat → netcat 패키지 상세정보 출력

sudp dpkg -i netcat 1.10-41.1_all.deb → netcat 패키지 설치 시도

-l → 설치된 패키지의 목록 출력

-l [packagename] → 패키지의 설치 상태 출력

-s [packagename] → 패키지의 상세 정보 출력

-S [pathname] → 경로명이 포함된 패키지를 검색

-L [packagename] → 패키지에서 설치된 파일의 목록 출력

-c .deb [file] → 지정한 .deb 파일의 내용 출력

-i .deb [file] → 해당 파일을 설치 (sudo)

-r [packagename] → 해당 패키지를 삭제 (sudo)

-P [packagename] → 해당 패키지와 설정 정보를 모두 삭제 (sudo)

-x .deb [file] [directory] → 해당 파일을 지정한 디렉토리에 풀어놓는다

aptitude 명령으로 패키지 관리하기

apt 명령처럼 패키지 관리를 자동화한다.

sudo aptitute → curses를 이용한 visual mode로 동작 (text 기반 UI)

sudo aptitude install gnome-clocks → 시계 패키지 설치

search [keyword] → keyword 검색후 일치하는 패키지 목록 출력

update → 패키지 저장소 업데이트

upgrade → 모든 패키지를 최신 버전으로 업그레이드

show [packagename] → 패키지에 대한 자세한 정보 출력

download [packagename] → 패키지 다운로드

clean → 패키지 캐시 디렉토리에서 모든 패키지 파일 삭제

install → 패키지 설치

remove → 패키지 삭제

purge → 패키지와 설정 파일을 모두 삭제

Ubuntu Software Center

Application 메뉴에 있음 → App Store 같은거


Snap Package 설치

Snap

  • 우분투가 새로 도입한 패키지 형식
  • 샌드박스 형태의 패키지
    • 패키지를 만들 때 프로그램이 사용하는 모든 라이브러리를 패키지 안에 포함
    • 개발자가 다른 패키지나 라이브러리와의 의존성을 신경쓰지 않아도 된다
    • 기존 시스템과 격리되어 실행하므로 보안 강화
    • 패키지 용량이 커진다는 단점이 있다

Snap 명령어 설치

sudo apt-get install snap

Snap 목록 출력

snap list

Snap 찾기

snap find hello-world

Snap 설치

sudo snap install hello-world

Snap 상세 정보 확인

sudo snap info hello-world

Snap 삭제

sudo snap remove hello-world

ls /snap



파일 아카이브와 압축

파일 아카이브

  • 파일을 묶어서 하나로 만든 것
  • tar (tape archive) 명령은 원래 여러 파일이나 디렉토리를 묶어서 마그네틱 테이프와 같은 이동식 저장장치에 보관하기 위해 사용하는 명령
  • 파일 크기는 줄어들지 않는다

tar 를 이용한 압축

파일 여러개를 묶어서 압축할 때 주로 사용

tar cvf ch2.tar ch2 → ch2 폴더를 묶어서 ch2.tar 아카이브 파일을 생성(묶기만 함! 크지 줄어들지 X)

tar tvf ch2.tar → ch2.tar 아카이브 내용 확인

tar xvf ch2.tar → ch2.tar 아카이브 압축 풀기. 보통 폴더 하나를 만들어 거기에서 풀어서 파일 충돌 예방

tar uvf ch2.tar ch2 → ch2.tar 아카이브의 파일 중 필요한 파일 업데이트

tar rvf ch2.tar hosts → ch2.tar 아카이브의 마지막에 hosts 파일을 무조건 추가

tar cvzf ch2.tar.gz ch2 → ch2.tar 아카이브 파일 생성과 동시에 ch2.tar.gz 파일로 압축

tar xvfz ch2.tar.gz → ch2.tar.gz 파일 압축 해제

tar cvjf ch2.tar.bz2 ch2 → ch2.tar 아카이브 파일 생성과 동시에 ch2.tar.bz2 파일로 압축

tar xvfz ch2.tar.bz2 → ch2.tar.bz2 파일 압축 해제

c → 새로운 tar 파일 생성

t → tar 파일의 내용 출력

x → tar 파일에서 원본파일 추출

r → 새로운 파일 추가

u → 수정된 파일 업데이트


f → 아카이브 파일이나 테이프 장치 지정. 파일명을 -로 지정하면 tar 파일 대신 표준 입력에서 읽어들인다

v → 처리하고 있는 파일의 정보 출력

h → 심볼릭 링크의 원본 파일을 포함

p → 파일 복구 시 원래의 접근권한 유지

j → bzip2로 압축하거나 해제

z → gzip으로 압축하거나 해제

파일 압축

gzip 을 이용한 압축

gzip ch2.tar → ch2.tar 파일 하나만 ch2.tar.gz 파일로 압축

-d → 파일 압축 해제

-l → 압축 파일의 정보 출력

-r → 하위 디렉토리를 이동하여 파일 압축

-t → 압축 파일을 검사

-v → 압축 정보 화면에 출력

-9 → 최대한 압축

bzip2 를 이용한 압축

bzip2 ch2.tar → ch2.tar.bz2 파일로 압축

-d → 파일 압축 해제

-l → 압축 파일의 정보 출력

-r → 하위 디렉토리를 이동하여 파일 압축

-t → 압축 파일을 검사

-v → 압축 정보 화면에 출력

--best → 최대한 압축

압축 해제하기

gunzip ch2.tar.gz → gzip으로 압축된 파일의 압축 해제. 압축이 해제된 ch2.tar 파일 생성됨

bunzip2 ch2.tar.bz2 → bzip2로 압축된 파일의 압축 해제. 압축이 해제된 ch2.tar 파일 생성됨

압축 파일의 내용 보기

zcat ch2.tar.gz | more → gzip으로 압축된 파일의 내용 출력

bzcat ch2.tar.bz2 | more → bzip2으로 압축된 파일의 내용 출력



Software Compile

Compile & Execute

compiler 설치하기

sudo apt install gcc

소스코드 작성, 실행

vi hello.c

gcc hello.c → a.out 이라는 실행파일 생성

./a.out → 실행

사용자가 원하는 이름으로 실행파일 생성하기

gcc -o hello hello.c → hello 라는 실행파일 생성

./hello → 실행

make

Utility to maintain groups of programs
여러개의 소스코드 쉽게 관리하고 컴파일하도록 해준다.

make 설치하기

sudo apt install make

File format

File name

Makefile

Format → 3 Components

  • Target
  • Dependency
  • Command
target: dependency
[tab]	command

Example

all: main.o add.o sub.o  // 이 3개의 dependency 필요.
	gcc -o test main.o add.o sub.o  // 3개가 모두 있다면 실행. 없다면 찾는다. main.o 부터..
main.o: addsub.h main.c  // 여기선 이 2개의 dependency 필요
	gcc -c main.c
add.o: add.c  // 여기선 이 1개의 dependency 필요
	gcc -c add.c
sub.o: sub.c  // 여기선 이 1개의 dependency 필요
	gcc -c sub.c

clean:
	rm *.o test

Compile

$ makemake all 이 실행됨

$ make main.o → main.o 만 실행

main.c가 바뀌었을 경우, add.c가 한줄 바뀌었을 경우 → 알아서 바뀐 파일만 다시 컴파일한다.

$ make clean → 실행파일 삭제 (ex: 배포할 때)

Macro

CC=gcc
SRC=main.c add.c sub.c
main: $(SRL)  // main: main.c add.c sub.c 와 같게 적용됨
	$(CC) -o test ${SRC}  // gcc -o test main.c add.c sub.c 와 같게 적용됨

미리 정해져 있는 macro

$ make -p → 모든 매크로 값들 확인 가능

  • ASFLAGS → as 명령어의 옵션 세팅
    • AS = as
  • CFLAGS → gcc 의 옵션 세팅
    • CC = cc (=gcc)
  • CPPFLAGS → g++ 의 옵션 세팅
    • CXX = g++
  • LDLFLAGS → ld 의 옵션 세팅
    • LD = ld
CFLAGS = -Wall -O -g  // -Wall(경고메세지 모두 표시), -O(최적화), -g(debuging 코드 넣음)

bin=hello  // 만들 실행파일 이름 정의
t1=main  // 사용할 소스코드1
t2=funcs  // 사용할 소스코드2
obj=$(t1).o $(t2).o  // main.o func.o 를 dependency로 가지는 obj Target

all: $(bin)
$(bin): $(obj)
	$(CC) $(obj) -o $@  // $@는 Target의 이름을 나타내는 내부변수. 여기서는 $(bin) = hello
clean:
	rm -f $(bin) *.o


User & Group

사용자 계정 관련 파일

/etc/passwd

  • 사용자 계정 정보가 저장된 기본 파일
  • root 관리자만 수정 가능
  • LoginID:x:UID:GID:설명:홈디렉토리:LoginShell 형식
  • UID
    • 사용자 ID로 시스템이 사용자를 구별하기 위해 사용하는 번호
    • 로그인 ID가 다르더라도 UID가 같으면 리눅스 시스템은 같은 사용자로 판단
  • GID
    • 그룹 ID로 시스템에 등록된 그룹에 대한 정보는 /etc/group 파일에 저장
  • 홈디렉토리
    • 사용자 계정에 할당된 홈 디엑토리의 절대경로
  • Login Shell
    • Ubuntu에서는 /bin/bash를 기본으로 사용

/etc/shadow

  • 사용자 암호에 관한 정보를 별도로 관리하는 파일
  • root 계정으로만 내용을 볼 수 있음
  • LoginID:password:최종변경일:MIN:MAX:WARNING:INACTIVE:EXPIRE:Flag 형식

/etc/login.defs

  • 사용자 계정의 설정과 관련된 기본값을 정의
  • 기본 메일 디렉토리, 패스워드 에이징, 사용자 계정의 UID•GID의 범위, umask값, 사용자 계정 삭제시 그룹 삭제 여부, 암호화 기법

/etc/group

  • 그룹에 대한 정보가 저장되는 파일
  • groupname:x:GID:groupmembers 형식
  • 사용자가 속한 2차그룹을 지정 (/etc/passwd 파일의 GID 항목에 지정된 그룹이 기본그룹)
  • 그룹 이름, x(그룹 암호를 저장하는 곳), GID, 그룹 멤버

/etc/gshadow

  • 그룹 암호가 저장되는 파일
  • groupname:password:관리자:groupmembers 형식
  • 관리자
    • 그룹의 암호나 멤버를 바꿀 수 있는 사용자 계정, 쉽표로 구분
  • groupmembers
    • 쉼표로 구분

사용자 계정 관리 명령

사용자 계정 생성하기

useradd -m -d /home/user2 user2 → user2 만들면서 홈디렉토리를 /home/user2로 지정, 없으면 생성

-u uid → UID 지정

-o → UID의 중복을 허용

-g gid → 기본 그룹의 GID를 지정

-G gid → 2차 그룹의 GID를 지정

-d [directory name] → 홈디렉토리 지정

-s [shell] → 기본 shell 지정

-c [explanation] → 사용자의 이름 등 부가적인 설명 지정

-D → 기본값을 설정하거나 출력, 항목들은 /etc/default/useradd 에 저장됨

-e [YYYY-MM-DD] → EXPIRE 항목 설정

-f [inactive days] → INACTIVE 항목 설정

-k [directory] → 계정 생성시 복사할 초기 파일이나 디렉토리를 설정해놓은 디렉토리를 지정

-m → 홈디렉토리 생성

sudo passwd user2 로 암호를 생성해줘야 함!!

/etc/skel 디렉토리의 역할

  • 사용자 계정의 홈디렉토리에 공통으로 배포해야 할 파일을 만들어놓는곳
  • 사용자 계정 생성시에 파일이 자동으로 복사된다
  • ls -a /etc/skel → 기본으로 몇개 있음

adduser --uid 2001 user5 → user5를 생성, UID를 2001로 지정

--uid [UID] → UID 지정

--gid [GID] → 기본 그룹의 GID 지정

--home [DIR] → 홈디렉토리 지정

--shell [shell] → 기본 shell 지정

--gecos [explanation] → 사용자의 이름 등 부가적인 설명 지정

사용자 계정 정보 수정하기

usermod -u 1111 user1 → user1의 UID를 1111로 변경

usermod -l user111 user1 → user1의 로그인ID를 user111로 변경, 홈디렉토리는 따로 만들고 옮겨야함!!

usermod -d /home/user111 user1 → user1의 홈디렉토리를 /home/user111로 변경, 생성은 안해줌!!

-u uid → UID 수정

-o → UID의 중복을 허용

-g gid → 기본 그룹 수정

-G gid → 2차 그룹 수정

-d [directory name] → 홈디렉토리 수정

-s [shell] → 기본 shell 수정

-c [explanation] → 설명 수정

-f [inactive days] → INACTIVE 날짜 수정

-l [new loginname] → 새 로그인 이름으로 계정 이름 변경

패스워드 에이징 관련 명령

useradd, usermod, passwd

chage

sudo usermod -f 10 -e 2018-10-31 user2 → INACTIVE, EXPIRE 값 변경

sudo chage -l user44 → 패스워드 에이징 설정 내용 출력

사용자 계정 삭제하기

userdel user44 → user44 계정 삭제

-r → 홈 디렉토리까지 함께 삭제

-f → 사용자가 로그인중이어도 강제로 삭제

find / -user [UID] -exec rm -r {} \; → 다른곳에 있는 사용자 소유 파일 검색, 함께 삭제하자


그룹 관리 명령

그룹 생성하기

groupadd -g 2013 gtest → GID가 2013인 gtest라는 그룹 생성

-g [GID] → 그룹의 GID 지정

-o → GID의 중복을 허용

addgroup --gid 2013 gtest → GID가 2013인 gtest라는 그룹 생성

--gid [GID] → 그룹의 GID 지정

그룹 정보 수정하기

groupmod -g 3001 gtest → gtest 그룹의 GID 3001로 변경

groupmod -n gtest111 gtest → gtest 그룹의 이름을 gtest111로 변경

-g [GID] → 그룹의 GID 수정

-o → GID의 중복을 허용

-n [groupname] → 그룹명 변경

그룹 삭제하기

groupdel gtest → gtest 그룹 삭제

그룹 암호 설정하고 사용하기

gpasswd -a test01 gtest11 → 사용자 test01을 gtest11 그룹에 추가

gpassod -d test33 gtest11 → 사용자 test33을 gtest11 그룹에서 삭제

-a [username] → 사용자 계정을 그룹에 추가

-d [username] → 사용자 계정을 그룹에서 삭제

-r → 그룹 암호 삭제

grep gtest111 /etc/group → gtest111 그룹의 멤버 확인

그룹 암호 설정하고 제거하기

gpasswd gtest11 → gtest11 그룹의 암호 변경

gpasswd -r gtest11 → gtest11 그룹의 암호 삭제

소속 그룹 변경하기

newgrp adm → 사용자가 현재 속한 그룹을 adm로 변경

id → 현재 소속그룹 출력

사용자 정보 관리 명령

UID : 사용자가 로그인할때 사용한 계정의 ID

EUID : 현재 명령을 수행하는 주체의 UID (Effective UID)

실행파일 자체에 setuid가 설정되어 있는 경우 :

  • 해당 실행파일을 실행한 프로세스의 UID는 사용자 계정의 UID가 이니라 실제 파일 소유자의 UID
  • 이때 실행 파일 소유자의 UID가 EUID
  • user1이 passwd(root 권한으로만 가능) 실행 → passwd에 setuid가 지정되어 있다면 root 권한을 가지게 되어 user1이 실행했지만 실행이 가능해진다

su 명령을 사용하여 다른 사용자로 전환한 경우 :

  • 사용자가 로그인하면 처음에는 UID와 EUID가 같은 값을 가짐
  • 하지만 su 명령을 사용하여 다른 사용자로 전환하면 UID와 EUID가 달라짐

사용자 로그인 정보 확인

who → 사용자 이름, 사용자가 접속한 단말기 번호, 외부 네트워크에서 접속한 경우 외부 컴퓨터 이름/IP 출력

-q → 로그인한 사용자 수, 사용자 계정 이름 출력

-H → 출력 항목의 제목도 함께 출력

-b → 시스템이 마지막으로 부팅한 날짜, 시간 출력

-m → 현재 사용자 계정의 정보 출력

-r → 현재 run level 출력

w [username] → who 보다 좀 더 자세히, CPU 사용량, 시스템 로드 정보 등을 추가로 출력

last → 사용자 이름, 시스템에 로그인하고 로그아웃한 시간, 터미널 번호나 IP 출력

UID와 EUID 확인하기

who am i, who -m → UID 출력

whoami, id → EUID 출력

  • $ su user5$ whoami → user5 → $ who am i → user1
  • exit$ whoami → user1 → $ who am i → user1

소속 그룹 확인하기

groups → 현재 사용자 계정이 속한 그룹을 출력

groups [username] → 해당 사용자 계정이 속한 그룹을 출력

root 권한 사용하기

  • su 명령 사용 → root 계정으로 전환 → 모든 권한 부여 (비추… 위험하다…)
  • sudo 명령 사용 → 특정 작업을 수행할 수 있는 권한만 부여

sudo 권한 설정하기

사용자가 sudo를 통해 어떤 권한을 사용할 수 있는지 설정한다.
/etc/sudoers 파일에 설정

사용자 계정 호스트=명령어 형식
user5 ALL=/user/sbin/useradd, /usr/sbin/usermod → user5에게 사용자 추가, 수정 권한 부여

Ex: user5가 사용자 계정을 추가하려면

$ su -user5
$ sudo useradd han01
$ grep han01 /etc/passwd → 추가된거 확인

passwd 명령 활용하기

사용자 계정의 암호를 수정한다.

sudo passwd -l user5 → user5의 암호를 잠금, 로그인 불가능!

-l → 지정한 계정의 암호를 잠금 → /etc/shadow 파일의 해당 계정 암호 앞에 ! 가 생긴다

-u → 암호 잠금 해제

-d → 지정한 계정의 암호 삭제

파일 및 디렉토리의 소유자, 소유 그룹 변경하기

chown user2 file1 → file1의 소유자를 user2로 변경

chown user2:gr01 file1 → file1의 소유자는 user2로, 소유 그룹은 gr01로 변경

chown -R user5:han01 temp → temp/와 그 안의 파일까지 소유자는 user5로, 소유 그룹은 han01로 변경

-R → 서브 디렉토리의 소유자와 소유 그룹도 변경

chgrp han01 file1 → file1의 소유 그룹을 han01로 변경

sudo chgrp -R user5 temp → temp/와 그 안의 파일까지 소유 그룹을 han01로 변경

-R → 서브 디렉토리의 소유 그룹도 변경

profile
밀린 TIL 업로드 조금씩 정리중...

0개의 댓글