파일을 선택해야 할 때 나오는 다이얼로그 크기가 제각각에 너무 작게 나와서 어떻게 변경하는지 찾아 정리했다. VLC는 QT고 Chrome은 gtk를 사용하고 있는 등 중구난방으로 동작하는데 이건 내가 사용하는 배포판의 문제인지 원래 다 그런지는 잘 모르겠다.

gtk 설정

gsettings로 설정할 수 있다고 하는데 지금 사용하고 있는 gtk 버전에 따라 설정이 다르고 어떤 버전이 사용되고 있는지 확인할 방법을 찾을 수 없었다. 대신 dconf로 모든 설정을 저장해서 직접 확인하고 적용하는 것이 가능하다.

$ dconf dump / > dconf-settings.txt

이제 dconf-settings.txt를 열어서 FileChooser를 찾는다. window-size 및 기타 설정을 적당히 변경한 후에 다시 적용한다.

$ dconf load / < dconf-settings.txt

qt 설정

css의 변형인 qss를 통해서 사이즈를 변경할 수 있다.

$ qt5ct

상단 탭에서 Style Sheets를 누른 후 새로운 qss 파일을 생성한다.

새로운 파일을 체크한 후 Edit을 누르고 다음 내용을 추가한다. 크기는 알맞게 선택한다.

QFileDialog {min-height: 900px; min-width: 1600px;}

저장 후 적용 버튼을 누르면 끝난다.

Published on October 26, 2022

리눅스에서 어떤 프로그램을 사용하고 있는지, 어떤 설정을 사용하고 있는지 정리하는 노트입니다. 랩탑에서 메인으로 사용하고 있는데 그래픽 세팅으로 사용하면 아무래도 자잘하게 설정할 것도 많고... 여기에 빵가루를 남깁니다.

사용하는 프로그램

dwm 쓰고 있어서 다른 wm 사용하면 편하게 할 것을 안편하게 쓰고 있는 부분이 많습니다. 더 좋은 것 있으면 언제든지 알려주세요.

  • [Manjaro]: Arch linux 기반.
  • suckless dwm: X용 동적 창 관리자. 화면을 꽉 채우는 방식이 기본이라서 편리. 커스텀을 많이 할 수 있는데 거의 기본으로 사용중.
  • suckless st: 단순한 터미널인데 dwm과 잘 맞음.
  • zsh: oh-my-zsh에서 테마만 바꾸는 수준 ;ㅅ;
  • fcitx: 한글 입력기. 다들 잘 안된다고 불편한 프로그램이라는데 어쩐지 내 컴퓨터에서는 잘 돌아감.
  • nvim: 빔빔빔
  • scrot: 스크린샷 캡쳐 도구
  • go-chromecast: 크롬캐스트 제어할 수 있는 cli
  • nemo: 파일 탐색기. 특별한건 없는데 아이콘 크기를 키울 수 있어서.
  • dictd: cli 사전.
  • evince: PDF 뷰어.

시스템 제어 관련

  • pactl, amixer: 오디오 제어. pactl은 음량 100%을 넘길 수 있음.
    • pactl set-sink-volume @DEFAULT_SINK@ 150%
  • xorg-xbacklight: 디스플레이 밝기 제어.

open 사용하기

맥에서는 open 명령어 사용하는 것처럼 리눅스에서는 xdg-open을 사용할 수 있는데 약간 동작이 다르다. 다음 스크립트로 비슷하게 동작하는 open을 만들 수 있다. /usr/local/bin/open에 아래 내용으로 저장한다.

#!/bin/bash
CMD="xdg-open \"$(pwd)/$1\""
bash -c "$CMD" 2> /dev/null &

xdg-open은 mime에 따라 어떤 프로그램으로 실행할지 지정할 수 있는데 xdg-mime으로 현재 설정을 확인하거나 변경할 수 있다. nemo를 파일 탐색기로 사용하려면 다음처럼 지정한다.

$ xdg-mime query default inode/directory # 현재 지정된 프로그램 확인
$ xdg-mime default nemo.desktop inode/directory # nemo로 변경

마우스 커서 크기 변경

~/.Xresources에 다음처럼 입력한다.

Xcursor.size: 48
!Xcursor.theme: Hackneyed !지정하고 싶은 cursor theme

HiDPI / 배경화면 설정

~/.xprofile에 추가한다.

xrandr --dpi 144 # xorg-xrandr 필요

# 단색 설정
xsetroot -solid "#1a1b23" # xorg-xsetroot 필요

# 이미지 설정
feh --bg-scale /path/to/image.jpg # feh 필요

pbcopy, pbpaste 사용하기

맥에서 쓰던 명령어가 손에 익어서 똑같은 기능을 하는 단축어를 만들었다. 터미널에서 시스템 클립보드와 유닉스 파이프로 상호작용이 필요할 때 유용하다. 다음 내용을 .zshrc에 추가한다.

alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'

다음처럼 쓸 수 있다.

$ cat hello.md | pbcopy # 시스템 클립보드에 저장됨
$ pbpaste > something.js

청색광 켜고 끄기

청색광 차단 효과는 왈가왈부가 많지만 그래도 밤에 쨍한 화면보는 것보다는 눈이 편하니까 만든 단축어다.

redshift라는 프로그램도 있는데 뭔가 잘 동작하지 않아서 xrandr를 사용하고 있다.

xrandr를 사용해서 감마값을 조정한다. (xorg-xrandr 필요) 먼저 현재 모니터 포트를 확인한다.

$ xrandr --listmointors
 0: +*eDP1 2560/310x1440/170+0+0  eDP1

내 경우에는 eDP1이 해당 출력이다. 다음처럼 .zshrc에 추가한다.

alias daylight_mode="xrandr --output eDP1 --gamma 1:1:1 --brightness 1.0"
alias night_mode="xrandr --output eDP1 --gamma 1:0.72:0.43 --brightness 0.55"

모니터가 여럿이면 --output eDP1 --output eDP2 이런 식.

오피스 파일을 pdf로 변환하기

libreoffice를 사용하면 오피스 파일, 즉, pptx, ppt, docx, doc 등을 pdf로 변환할 수 있다. 다른 도구도 많았는데 중간에 내용이 안나오거나 하는 경우가 종종 있었다. 용도 외로 사용하는 기분이 들긴 하지만 가장 높은 신용도.

.zshrc에 추가한다.

alias to-pdf="libreoffice --headless --convert-to pdf"

사용은 아래처럼.

$ to-pdf lecture_03.pptx
$ to-pdf *.ppt
$ to-pdf essay_mid.docx

충전 어뎁터 연결 시 스크립트 구동하기

acpi를 통해서 스크립트를 구동할 수 있다. /etc/acpi/events에 파일을 추가한다.

event=ac_adapter.*
action=/etc/acpi/ac_adapter.sh %e

이제 acpi에서 해당 이벤트가 발생하면 등록한 스크립트가 실행된다.

내 경우에는 aplay를 이용해서 wav 파일을 재생하도록 했다. 해당 경로에 아래와 같은 스크립트를 추가한다.

#!/bin/bash

case "$1" in
    ac_adapter)
        case "$2" in
            AC*|AD*)
                case "$4" in
                    00000001) # 연결시 1 분리시 0
                        aplay /etc/acpi/ac_adapter.wav 2>&1
                        ;;
                esac
                ;;
        esac
        ;;
esac

wav 파일도 당연히 해당 경로에 필요하다. 그리고 acpid를 다시 시작한다.

$ systemctl restart acpid.service

Caps Lock 키를 한영키로 사용하기

.Xmodmap에 다음 내용을 추가한다.

clear lock
keycode 66 = Hangul

동작하지 않는다면 .xinitrc 에서 해당 파일을 불러오지 않는 경우일 수 있다. 그럴 때는 .xinitrc에 다음을 추가한다.

xmodmap "$HOME/.Xmodmap"

얼마 전 구입한 크롬북에 무엇을 어떻게 설치해서 써야 낮은 사양에서도 편하게 쓸 수 있나 둘러보다가 suckless에서 만든 dwm에 대해 알게 되었다. 레딧에서 자주 보였던 윈도우 관리자라서 이름 정도는 알고 있었지만 그렇게까지 미니멀한게 필요하지 않다는 생각에 찾아보지도 않았었다. 조그마한 메모리 사용까지도 영향을 받는 기기를 쓰다보니 무거운 데스크탑 환경을 벗어나야만 했다.

suckless.org는 공개된 소프트웨어도 흥미롭지만 게시된 웹페이지 내용도 재미있다.

Our project focuses on advanced and experienced computer users. ("Philosophy")

코드 품질에 대한 이야기도 흥미롭다. 직관적으로 문제를 해결하는 코드가 코드 복잡도를 낮춘다는 이야기도 재미있다. 모든 내용이 유익하다고는 할 수 없고 공감이 안되는 부분도 있긴 하지만 소프트웨어가 어떤 맥락에서 만들어졌는지 이해하는데는 큰 도움이 된다.

As the number of lines of code in your software shrinks, the more skilled you have become and the less your software sucks. ("Philosophy")

처음엔 왜 이런 기능도 없어보이는 도구가 필요한가 의아했는데 설치하고 한동안 사용해보니 그 매력에 완전 빠졌다. dwm을 사용하면 tmux의 확장판인 기분이 든다. 프로그램의 모든 창을 타일로 관리할 수 있기 때문이다. tmux는 터미널만 정렬하고 쓸 수 있지만 dwm은 실행할 수 있는 모든 것을 타일로 관리할 수 있다. 물론 타일 외에도 다른 레이아웃도 사용할 수 있고 태그라는 기능으로 다중 윈도우처럼 사용하는 것도 가능하다. 게다가 매우 가벼워서 존재하지 않는 것처럼 느껴질 정도다.

특별히 독특하다고 느낀 부분은 코드 패치인데 프로그램이 모든 기능을 지원하고 설정을 제공하는 것이 아니라는 점이다. 필요한 기능은 별도의 diff 파일로 제공하고 있어서 기능이 필요하지 않으면 아예 바이너리에도 포함되지 않는다. 이런 실용주의적 접근이 아마 도구 자체가 가벼운 이유인 듯 하다. 익숙하지 않다면 분명 복잡한 과정이겠지만.

대략 이런 모습

설치

설치는 직접 받아서 빌드해야 한다. 설정을 위한 파일이 따로 존재하지 않고 config.h에 정의해서 빌드해야 하기 때문이다. c로 작성된 소프트웨어라 컴파일러가 없다면 설치해야 한다.

suckless.org의 dwm 페이지에서 압축 파일로 받거나 git 리포지터리에서 복제할 수 있다.

$ git clone https://git.suckless.org/dwm

먼저 기본 config 파일을 생성해야 한다.

$ make config.h

config.h에서 변경하고 싶은 내용은 변경하면 된다. 그리고 빌드해서 설치한다.

$ make && make install

설치 후에는 로그인 화면에서 dwm을 설치할 수 있도록 /usr/share/xsessionsdwm.desktop을 추가한다.

[Desktop Entry]
Encoding=UTF-8
Name=Dwm
Comment=Dynamic window manager
Exec=dwm
Icon=dwm
Type=XSession

dwm을 효과적으로 사용하려면 동적 메뉴인 dmenu도 설치해야 한다. dwm처럼 suckless의 dmenu 페이지에서 받거나 git 리포지터리를 이용한다.

$ git clone https://git.suckless.org/dmenu/ && cd dmenu
$ make config.h
$ make && make install

이제 로그아웃해서 dwm 세션을 선택해 로그인하면 된다.

단축키

dwm을 시작해보면 아무 것도 없는 휑한 화면만 나온다. 대부분의 기능은 단축키로 사용할 수 있다. 기본 단축키를 기준으로 설명하지만 이 단축키는 모두 config.h에서 추가/수정/삭제가 가능하다.

Shift + Alt + Q      dwm 종료하기
Shift + Alt + Enter  터미널 실행하기
Alt + P              dmenu 열기
Shift + Alt + C      현재 창 닫기

Alt + j, k           창 커서 이동하기
Alt + h, l           마스터 창 크기 조절하기
Alt + d, i           창 마스터/스택으로 이동하기
Alt + Enter          마스터 창과 스택 바꾸기
Alt + 1...9          해당 숫자 태그로 이동하기
Shift + Alt + 1...9  현재 창 해당 태그로 보내기

# 레이아웃
Alt + t               타일 모드
Alt + f               플로팅 모드
Alt + m               모노클 모드

## 플로팅 모드
Alt + 우클릭          창 크기 조절하기
Alt + 좌클릭          창 위치 이동하기
Shift + Alt + Space   플로팅 전환하기

타일로도 충분히 편리하게 사용하고 있어서 플로팅은 거의 사용하지 않고 있다.

우측 상단에 dwm-{버전} 표시는 status라고 하는 영역인데 이 영역 문자열은 다음 명령어로 변경할 수 있다.

$ xsetroot -name "Hello World"

이 상태 영역을 주기적으로 업데이트하는 별도의 도구를 설치하면 편리하다. dwmstatus 페이지에서 상태 모니터 도구를 찾을 수 있다. 나도 하나 간단하게 작성했는데 dwm-simple-status에서 확인할 수 있다.


suckless에서 개발한 다양한 도구를 보고 있으면 나도 이런 가벼운 도구를 만들고싶다는 생각이 자연스레 따라온다. 많은 dwm 포크와 클론을 보면 비슷한 생각을 하는 사람이 많나보다. dwm, dmenu, surf, st 모두 웹사이트에 게시한 철학을 잘 따라서 만들어진 도구라 더 매력적으로 느껴지는 것 같다.

맥북 프로 키보드에 불만족스러워서 그런지 회사에서도 미팅 때마다 사람들이 들고 들어온 노트북을 계속 눈여겨 보게 되었다. 3년 전까지는 델 납품을 받았는데 그 이후로는 레노보를 사용하고 있어서 Dell Latitude랑 XPS, Lenovo Thinkpad 13, Thinkpad T740, 요가 시리즈 정도를 대부분 들고 다녔다. Acer 쓰는 사람도 좀 있었고. 그 중에 sysadmin 하는 분들이 노트북에 리눅스 설치하고 다니는거 보고는 나도 하나 그런 노트북 있으면 좋겠군 싶어서 검트리에서 적당한 가격에 이것저것 설치하고 놀 수 있는 노트북을 찾고 있었다.

그러다가 Dell Latitude E7240를 $100에 구입했다. 원래 $150에 구입하기로 했고 판매자가 보기로 한 장소에 나갔는데 판매자가 약속을 잊었다고 미안하다고 할인해주고 다음 날 집 앞으로 가져다줬다. 40도 넘는 더위를 뚫고 갔다가 돌아오는게 좀 짜증나긴 했지만 역시나 막상 받고나니 다 기분이 풀렸다.

구입한 모델은 i3긴 했지만 8GB 램에 128GB SSD였다. 좀 지난 모델이긴 하지만 울트라북이고 가벼워서 만족스러웠다. $300에 구입했던 인스피론보다 훨씬 안정적이고 빨라서 너무 만족스럽다. TN 패널인게 아쉽지만 찾아보니 IPS로도 모델이 있길래 교체에 문제가 없을 것 같아 IPS 패널도 하나 주문했다.

그런 후에 무슨 배포판을 설치할까 고민했다. 뭘 설치할 일이 있으면 늘 고민 없이 우분투를 설치했었다. Archlinux 좋다는 얘기를 계속 듣기도 했고 arch를 사용하지 않아도 그 위키에서 도움을 받은 적이 많아서 이번엔 arch를 설치하기로 했다. lxde나 그놈을 사용했는데 KDE로 설치해보기로 했다.

Archlinux는 위키에 모든 단계가 잘 정리되어 있어서 따라하기만 하면 된다! 는 생각보다 좀 환상이었다. 설치하기 위해서는 이거 이거 보면 된다 그러고 링크를 누르면 또 엄청난 분량의 설명이 나온다. 그래서 설치하면서 했던 단계를 간단하게 정리했다. 기본적으로는 설치 가이드와 동일하다.

설치 전

archlinux iso를 받아서 usb에 설치한다. Etcher를 사용하면 손쉽게 이미지를 usb에 넣을 수 있다. 이 usb를 노트북에 꽂고 부팅한다. bios에서 부팅 순서를 확인하고 usb를 가장 먼저 읽도록 설정한다.

부팅이 다 되면 root 계정에 로그인 된다. 먼저 인터넷을 연결한다. wiki 설치 안내에서는 안나오는데 wifi 접속할 수 있는 dialog 스크립트를 제공한다.

# wifi-menu

만약 wifi 드라이버를 인식하지 못하면 스크립트가 동작하지 않는데 그럼 위키에서 설명하는 방식 따라서 직접 연결해야 한다.

파티션 설정은 cfdisk 또는 fdisk를 사용한다.

# cfdisk

내 경우에는 sda1 (bootable), sda2 (50GB, home), sda3 (4GB, swap)으로 설정했다.

# mkfs.ext4 /dev/sda1
# mkfs.ext4 /dev/sda2
# mkswap /dev/sda3
# swapon /dev/sda3

드라이버를 마운트한다.

# mount /dev/sda1 /mnt
# mkdir /mnt/home
# mount /dev/sda2 /mnt/home

설치

본격적인 설치 전에 가까운 미러 서버를 선택한다. /etc/pacman.d/mirrorlist 열어서 가까운 서버를 최상단으로 옮긴다. 내 경우는 swin.edu.au를 가장 위로 올렸다.

이제 호스트 드라이브에 리눅스를 설치한다.

# pacstrap /mnt base base-devel

설정한 디스크 설정을 호스트 드라이브에 저장한다.

# genfstab -U /mnt >> /mnt/etc/fstab

chroot로 호스트에 접속한다.

# arch-chroot /mnt

일단 사용에 필수적인 패키지를 설치한다. vim은 필수고, wifi_menu는 dialog에 의존성이 있고 WPA를 사용하면 wpa_supplicant도 설치해야 한다.

# pacman -S vim wpa_supplicant dialog

이제 타임존 설정이 필요하다. /usr/share/zoneinfo/ 안에 적합한 타임존을 찾아서 링크를 추가한다.

# ln -sf /usr/share/zoneinfo/Australia/Melbourne /etc/localtime

하드웨어 시간을 맞춘다.

# hwclock --systohc --utc

로케일을 설정한다.

# locale-gen
# echo LANG=en_AU.UTF-8 > /etc/locale.conf
# export LANG=en_AU.UTF-8

hostname 설정과 host를 설정한다.

# echo "ed-dell" > /etc/hostname
# echo "127.0.0.1 ed-dell" >> /etc/hosts

Grub 설치한다. bootable로 지정한 첫 파티션에 grub을 설치하면 된다.

# pacman -S grub
# grub-install /dev/sda
# grub-mkconfig -o /boot/grub/grub.cfg

root 비밀번호를 설정한다.

# passwd

설치된 패키지를 최신 버전으로 갱신한다. 미러에서 바로 설치했기 때문에 실제로는 별다른 내용 없이 지나가지만 그래도 한다.

# pacman -Syu

이제 종료하고 USB를 제거하고 켜면 설치된 arch를 사용할 수 있다.

# exit
# reboot

KDE 설치

KDE 페이지를 보고 설치하면 된다. 임시로 wifi-menu를 사용해서 인터넷을 연결한다. 그리고 아래 패키지를 설치한다.

xf86-video-intel은 그래픽카드 드라이버인데 본인에게 맞는걸 설치해야 한다. 목록은 Xorg를 참조한다.

# pacman -S xorg
# pacman -S xf86-video-intel
# pacman -S sddm
# pacman -S plasma-desktop
# pacman -S kde-applications
# pacman -S kdeplasma-addons # 네트워크 매니저가 포함됨

root 대신 사용할 계정을 생성한다.

# useradd -d /home/edward edward
# passwd edward
# echo "edward   ALL=(ALL) ALL" >> /etc/sudoers

sddm을 설정한다.

# sddm --example-config > /etc/sddm.conf

/etc/sddm.conf을 열어서 autologin을 설정한다.

[Autologin]
User=edward
Session=plasma.desktop

KDE를 사용하면 wifi-menu가 더이상 필요 없다. 그 전에 네트워크 매니저 서비스를 켠다.

# systemctl enable NetworkManager.service

bluetooth를 사용한다면 몇가지 패키지를 더 설치한다.

# pacman -S bluez bluez-utils
# systemctl enable bluetooth.service
# systemctl start bluetooth.service

한국어 설정

fcitx로 설치하고 싶은데 제대로 동작을 안해서 일단 ibus를 설치했다.

# pacman -S ibus ibus-hangul

/etc/locale.gen에 ko_KR을 추가한다.

ko_KR.UTF-8 UTF-8

/etc/locale.conf도 변경한다.

LANG=ko_KR.UTF-8
LC_COLLATE=ko_KR.UTF-8

/etc/xprofile를 열어서 다음 내용을 추가한다.

export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
ibus-daemon -d -x

물론 우분투보다 복잡하게 느껴지긴 하지만 (그게 우분투의 셀링포인트이기도 하고) 직접 설치하지 않으면 전혀 설치가 안되고 설정도 안되는 그런 환경이 OS에 대한 애착을 만드는 기분이다. 만자로를 사용하면 좀 더 쉽게 설치할 수 있다고 한다.

최근 프로젝트 중 인프라 회사와 함께 협업하는 프로젝트가 있었다. 이전까지 사용하던 방식과는 다르게 상당히 세세한 퍼미션 설정으로 환경을 잡길래 다시 공부하는 겸 정리하게 되었다.

리눅스(또는 Unix-like) 시스템에서는 파일의 접근 권한과 파일의 종류를 16비트에 할당해서 관리하고 있다. 이 퍼미션은 심볼릭 표기법과 8진수 표기법으로 나타낼 수 있다. 흔히 심볼릭 표기법 즉, -rwxr-xr-x와 같은 형태로 접할 수 있다.

파일의 퍼미션은 파일의 상태를 확인하는 명령 stat로 확인할 수 있다.

$ stat hello
  File: 'hello'
  Size: 8760        Blocks: 24         IO Block: 4096   regular file
Device: 2dh/45d Inode: 15170       Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-08-11 06:56:19.100326163 +0000
Modify: 2016-08-11 06:55:22.698669517 +0000
Change: 2016-08-11 07:23:31.122522096 +0000
 Birth: -

-c, 또는 --format 플래그를 사용해서 원하는 정보만 출력하는 것도 가능하다. 다음처럼 심볼릭 표기법과 8진수 표기법, 소유자, 그룹, 파일명을 확인한다.

$ stat -c "%a %A %U:%G %n" hello
755 -rwxr-xr-x root:root hello

파일 타입

심볼릭 표기법에서 첫 번째 기호는 파일 타입을 의미한다. 이 정보는 16비트 중 4비트에 해당한다.

  • -: 일반 파일
  • d: 디렉토리
  • l: 심볼릭 링크
  • p: Named pipe
  • s: 소켓
  • b, c: 디바이스 파일

그 외에도 Door 등이 존재한다.

접근 권한

접근 권한은 소유자 접근 권한(owner, u), 그룹 접근 권한(group, g), 기타 사용자 접근 권한(others, o)으로 구분된다. 각각의 권한은 읽기(r, 4), 쓰기(w, 2), 실행하기(x, 1)로 구성되어 있다.

각각 3비트로 구성된 3가지 접근 권한으로 총 16비트 중 9비트를 차지한다.

$ chmod 000 hello # 8진수 표기법으로 권한 없음 지정
$ chmod a= hello # 심볼릭 표기법으로 권한 없음 지정
$ chmod 755 hello # 소유자 rwx, 그룹 rx, 기타 rx
$ chmod u=rwx,g=rx,o=rx hello
$ chmod 644 hello # 소유자 rw, 그룹 r, 기타 r
$ chmod u=rw,g=r,o=r hello

특수 권한

특수 권한은 setuid, setgid, 스티키(sticky) 비트가 있다. 16비트 중 앞에서 사용한 파일 타입과 접근 권한을 제외한 나머지, 3비트는 특수 권한을 저장하는 비트로 사용한다.

물론 기본적으로 접근하는 사용자의 권한은 앞에서 설정한 접근 권한을 따르게 된다. 접근 권한에서 접근을 허용하지 않은 상태에서는 아래 특수 권한도 동작하지 않게 된다. 접근 권한과 특수 권한을 조합하면 많은 경우의 수가 나오지만 실행 권한이 없으면 의미가 없는 경우도 있어서 실제로 사용하는 방식은 다소 제한적인 편이다.

특수 권한이 있기 때문에 root 사용자가 아닌 사용자도 ping과 같은 명령을 사용할 수 있게 된다. /tmp와 같은 공유 디렉토리도 특수 권한 중 하나를 사용한다.

Set-user Identification (SUID, setuid, 4)와 Set-group Identification (SGID, setgid, 2)

setuid가 지정되어 있는 파일을 실행하면 해당 파일은 파일 소유자의 권한으로 실행하게 된다. setgid가 지정되어 있는 파일을 실행하면 해당 파일에 지정되어 있는 그룹의 권한으로 실행하게 된다. 물론 애초에 파일에 접근하는 사용자에게 실행하는 권한이 있어야 실행 가능한 것은 마찬가지다. root 권한으로 지정된 프로그램에 이 비트가 적용되어 있다면 실행할 때 root 권한으로 실행 된다는 뜻이다.

이 기능은 보안상 shell script에서는 동작하지 않는다. 실제로 동작을 확인하고 싶다면 작은 C 프로그램을 만들어서 테스트 해볼 수 있다.

#include <stdio.h>

int main () {
  printf("EUID: %d\nUID: %d\nEGID: %d\nGID: %d\n", geteuid(), getuid(), getegid(), getgid());
  return 0;
}

다음은 setuid를 사용한 예다. 같은 그룹 사용자는 해당 파일을 실행할 수 있고 실행할 때 소유자 권한으로 실행하게 된다.

$ chmod 4750 helloworld # 8진수 표기법
$ chmod u=rwxs,g=rx,o= helloworld # 심볼릭 표기법

다음은 setgid를 설정했다. 이 설정은 누구나 파일을 열 수 있으며 helloworld에 지정된 그룹 권한으로 실행한다.

$ chmod 2755 helloworld
$ chmod u=rwx,g=rxs,o=rx helloworld

Sticky 비트 (1)

스티키 비트는 일종의 공유 디렉토리와 같은 권한을 제공한다. 이 비트가 설정되어 있는 상황에서는 접근 권한이 있는 상황에서도 자신의 소유가 아닌 파일을 삭제할 수 없게 된다. 일반적으로 /tmp와 같은 임시 디렉토리에서 사용한다.

다음은 root 계정에서 haruair의 접근 권한이 있는 파일을 생성했지만 스티키 비트가 지정된 폴더 내에 있어서 삭제할 수 없는 예시다.

# mkdir tmp
# chmod 1777 tmp
# chmod a=rwx,=t tmp
# cd tmp ; touch hello
# chmod 777 hello
# sudo -u haruair -i
$ cd tmp ; rm hello
rm: cannot remove 'hello': Operation not permitted

특수 권한 적용하기

chmod를 8진수 표기법과 함께 사용하는 경우에는 주로 3자리로 많이 사용하지만 4자리로 사용하면 첫 번째 숫자가 특수 권한에 해당한다. 즉, chmod 700chmod 0700과 동일하다. 만약 특수 권한이 지정되어 있는 디렉토리에 chmod 700 식으로 지정하면 기존의 특수 권한이 모두 사라지기 때문에 주의해야 한다.

특수 권한으로 인한 보안 문제

특수 권한은 일반적인 파일 접근 방식과 다르기 때문에 사용에 주의해야 한다. 특히 root 권한으로 실행되도록 setuid가 지정된 프로그램에 보안 취약점이 있다면 공격 대상이 될 수 있다.


퍼미션은 가장 기초적인 수준이다. 좀 더 편리하게 사용할 수 있는 ACL도 있고 SELinux를 사용해서 더 보안성 높은 환경을 구축할 수도 있다. 최근에는 서버 가상화로 아키텍처 수준에서의 권한 분리가 이뤄진다. 상황에 맞는 기능을 선택해서 사용하도록 하자.

색상을 바꿔요

눈에 편한 색상을 골라보세요 :)

Darkreader 플러그인으로 선택한 색상이 제대로 표시되지 않을 수 있습니다.