2023.11.01 TIL
devian, Ubuntu 계열에서 사용하는 패키지
패키지의 기능 추가, 보안 패치 등 지속적인 업그레이드 관리
사용자는 저장소에 접속하여 최신 패키지를 설치할 수 있다.
패키지 저장소에 대한 정보
→ /etc/apt/sources.list 파일
→ 패키지 유형, 저장소 주소(http URL 주소), Ubuntu 버전 정보, 카테고리
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
→ 사용가능한 모든 패키지의 이름 출력
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
→ 패키지와 설정 파일을 모두 삭제
Application 메뉴에 있음 → App Store 같은거
sudo apt-get install snap
snap list
snap find hello-world
sudo snap install hello-world
sudo snap info hello-world
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으로 압축된 파일의 내용 출력
sudo apt install gcc
vi hello.c
gcc hello.c
→ a.out 이라는 실행파일 생성
./a.out
→ 실행
gcc -o hello hello.c
→ hello 라는 실행파일 생성
./hello
→ 실행
Utility to maintain groups of programs
여러개의 소스코드 쉽게 관리하고 컴파일하도록 해준다.
make
설치하기sudo apt install make
Makefile
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
$ make
→ make all
이 실행됨
$ make main.o
→ main.o 만 실행
main.c가 바뀌었을 경우, add.c가 한줄 바뀌었을 경우 → 알아서 바뀐 파일만 다시 컴파일한다.
$ make clean
→ 실행파일 삭제 (ex: 배포할 때)
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 와 같게 적용됨
$ make -p
→ 모든 매크로 값들 확인 가능
ASFLAGS
→ as 명령어의 옵션 세팅AS
= asCFLAGS
→ gcc 의 옵션 세팅CC
= cc (=gcc)CPPFLAGS
→ g++ 의 옵션 세팅CXX
= g++LDLFLAGS
→ ld 의 옵션 세팅LD
= ldCFLAGS = -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
/etc/passwd
LoginID:x:UID:GID:설명:홈디렉토리:LoginShell
형식/etc/shadow
LoginID:password:최종변경일:MIN:MAX:WARNING:INACTIVE:EXPIRE:Flag
형식/etc/login.defs
/etc/group
groupname:x:GID:groupmembers
형식/etc/gshadow
groupname:password:관리자: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가 설정되어 있는 경우 :
su 명령을 사용하여 다른 사용자로 전환한 경우 :
who
→ 사용자 이름, 사용자가 접속한 단말기 번호, 외부 네트워크에서 접속한 경우 외부 컴퓨터 이름/IP 출력
-q
→ 로그인한 사용자 수, 사용자 계정 이름 출력
-H
→ 출력 항목의 제목도 함께 출력
-b
→ 시스템이 마지막으로 부팅한 날짜, 시간 출력
-m
→ 현재 사용자 계정의 정보 출력
-r
→ 현재 run level 출력
w [username]
→ who 보다 좀 더 자세히, CPU 사용량, 시스템 로드 정보 등을 추가로 출력
last
→ 사용자 이름, 시스템에 로그인하고 로그아웃한 시간, 터미널 번호나 IP 출력
who am i
, who -m
→ UID 출력
whoami
, id
→ EUID 출력
$ su user5
→ $ whoami
→ user5 → $ who am i
→ user1exit
→ $ whoami
→ user1 → $ who am i
→ user1groups
→ 현재 사용자 계정이 속한 그룹을 출력
groups [username]
→ 해당 사용자 계정이 속한 그룹을 출력
사용자가 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
→ 서브 디렉토리의 소유 그룹도 변경