
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/passwdLoginID:x:UID:GID:설명:홈디렉토리:LoginShell 형식/etc/shadowLoginID:password:최종변경일:MIN:MAX:WARNING:INACTIVE:EXPIRE:Flag 형식/etc/login.defs/etc/groupgroupname:x:GID:groupmembers 형식/etc/gshadowgroupname: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 → 서브 디렉토리의 소유 그룹도 변경