세 가지 사용 방식이 있다.
repo를 별도 위치에 두고 dotfiles를 $HOME으로 복사한다.
git clone https://github.com/tot0rokr/dotfiles ~/.dotfiles
~/.dotfiles/install.sh # dotfiles를 $HOME으로 복사 (install.sh/enter.sh/README은 제외)
exec bash # 새 셸에서 적용아무것도 복사하지 않고 $HOME(+XDG_*)만 이 체크아웃으로 돌린다. 되돌리기는 rm -rf 하나.
git clone https://github.com/tot0rokr/dotfiles ~/.myhome
~/.myhome/enter.sh # 인터랙티브 진입 (exit로 원래 셸 복귀)
~/.myhome/enter.sh tmux # tmux로 바로 (전용 소켓)
ssh host -t '~/.myhome/enter.sh' # SSH 접속 즉시 내 환경설치 후 인터랙티브 셸에서 순서대로. 함수는 .bashrc.common이 정의한다.
bootstrap_system_tools # sudo apt: build-essential/git/python3/ctags/wezterm... (root 필요, Ubuntu/Debian)
bootstrap_user_tools # ~/.local: nvim/fzf/rg/bat/eza/starship/lazygit/tmux/bell/noti... (root 불필요, cargo 빌드로 느림)
bootstrap_agents # ~/agents: Claude/Codex/OpenCode/Gemini 하네스 (~/.claude 등 심링크) + claude CLI 자동 설치(없을 때, ~/.local/bin)클린 컨테이너에서 clone→install→bootstrap 전 과정을 자동 실행·검증한다. exit 0이면 통과.
test/run.sh # smoke (install/system/agents, 빠름)
test/run.sh --full # 전체 (+ bootstrap_user_tools, cargo 빌드까지)
test/run.sh --local # 로컬 워킹트리로 검증 (push 전)cd ~/.dotfiles && git pull
./install.sh --dry-run # 바뀔 내용 미리보기 (진입점은 마커 위쪽만 변경으로 표시)
./install.sh # 적용 (B 방식이면 git pull만으로 충분)install.sh는 머신 고유 파일을 덮어쓰지 않도록 보호한다.
.bashrc·.tmux.conf—# Machine-specific settings below마커 아래(네 개인 설정·시크릿)는 그대로 보존하고 위쪽 템플릿 +~/.*.common로드부만 갱신한다 (변경 시<file>.bak.<ts>백업)..wezterm.lua— 파일 전체가 머신 전용 SSH 레지스트리라 이미 있으면 안 덮고 그대로 둔다(첫 설치 때만 스켈레톤 배치).
그 외 dotfile(.bashrc.common·.wezterm.common.lua·.fzf.bash·.gitconfig 등)은
repo가 소스라 repo 버전으로 덮으니 --dry-run으로 먼저 확인하는 걸 권장.
- 이 머신 전용 설정은
~/.bashrc·~/.tmux.conf의 "Machine-specific" 구역에 적고 repo로 커밋하지 않는다. - 셸 시크릿은
~/.config/secrets.env(chmod 600)에 두면.bashrc.common이 자동 로드한다. - noti webhook은
~/.config/noti/webhook(chmod 600).
sudo apt update \
&& sudo apt install -y git \
&& \rm -f ~/.* \
; git clone https://github.com/tot0rokr/dotfiles.git ~ \
&& bash
이식 가능한 공통부와 머신 고유부를 분리한다. .bashrc와 .tmux.conf가 같은 패턴을 쓴다.
.bashrc/.tmux.conf— 진입점(추적됨). clone/install 시~/로 배치되는 기본 템플릿이다. 각각~/.bashrc.common/~/.tmux.common.conf를 불러온 뒤, 이 머신 전용 설정을 그 아래에 직접 적어 쓴다..bashrc.common— 이식 가능한 공통 셸 설정: history/PATH/prompt/git/completion,bootstrap_user_tools·bootstrap_system_tools·bootstrap_agents등 설치 함수, starship/zoxide init. 시크릿 없음..tmux.common.conf— 이식 가능한 공통 tmux 설정: 플러그인(TPM)·키바인딩·status·테마·truecolor. bell-bash 같은 도구 연동은~/.tmux.conf에 머신 고유로 둔다.
진입점 파일(~/.bashrc·~/.tmux.conf)에 추가한 머신 고유 설정은 repo로 커밋하지 않는다(repo의 진입점은 기본 템플릿 상태 유지). 셸 시크릿은 ~/.config/secrets.env(chmod 600)에 두면 .bashrc.common이 자동 로드한다.
install.sh는 이 설정을 계정에 영구 적용한다(홈으로 복사). 반면 공유 계정이나 임시 서버처럼 그 계정 환경을 건드리고 싶지 않을 때는 enter.sh를 쓴다.
enter.sh는 아무것도 복사하지 않는다. 대신 $HOME(과 XDG_*)을 이 체크아웃으로 돌린 뒤 인터랙티브 셸을 띄운다. bash의 ~·startup 파일·git --global·ssh·vim·fzf·starship·zoxide 등이 전부 $HOME 기준으로 홈을 찾으므로, 이 dotfiles로 로그인한 것처럼 쓰인다. 계정 본래의 ~/.bashrc 등은 아예 읽지 않는다.
# 대상 호스트에 별도 디렉터리로 clone → 이 체크아웃이 곧 휴대용 HOME
git clone https://github.com/tot0rokr/dotfiles.git ~/.myhome
~/.myhome/enter.sh # 인터랙티브 진입
~/.myhome/enter.sh tmux # 전용 소켓으로 tmux 진입
ssh host -t '~/.myhome/enter.sh' # SSH 접속 즉시 내 환경으로되돌리기는 rm -rf ~/.myhome 하나면 끝(계정은 손댄 적 없음). 런타임 산출물(툴 설치·캐시·.tmux/plugins)은 전부 이 dir 안에 들어가고 .gitignore가 자동으로 무시한다.
한계: $USER/whoami/id, ~다른유저 확장, sudo(HOME 리셋)는 여전히 실제 계정을 가리킨다. HOME은 "홈을 어디서 찾을지" 화살표만 바꾸는 것이지 chroot가 아니다. 또한 repo-local .git/config처럼 더 구체적인 설정원은 전역(~/.gitconfig)을 이기므로 HOME과 무관하게 그대로 적용된다.
- mpv 설치
sudo apt install mpv
- ffmpeg 설치
sudo apt install ffmpeg
- yt-dlp 설치
- img2sixel 설치
sudo apt install libsixel-bin
- timg 설치
sudo apt install timg
- ranger 설치
sudo apt install ranger
- ✅ 1. Windows에서 Xming 실행
- Xming 바로가기 파일 속성에 -ac 추가 -
- SSH 접속 시 -X 또는 -Y 옵션 사용
ssh -X <id>@<ubuntu-ip> ssh -Y <id>@<ubuntu-ip> - Server SSH 설정(/etc/ssh/sshd_config)
sudo systemctl restart ssh
X11Forwarding yes X11DisplayOffset 10 X11UseLocalhost no - $DISPLAY 설정(.bashrc에 해놨음)
https://github.com/jtroo/kanata/releases 에서 kanata 설치 -> $HOME/.bin/kanata 로 저장
[Unit]
Description=Kanata keyboard remapper
Documentation=https://github.com/jtroo/kanata
[Service]
Type=simple
ExecStart=/home/{USERNAME}/.local/bin/kanata --cfg /home/{USERNAME}/.config/kanata/tenkeyless.key
Restart=never
[Install]
WantedBy=default.target
.xprofile에 kime 사용 등록
export GTK_IM_MODULE=kime
export QT_IM_MODULE=kime
export XMODIFIERS=@im=kime그 다음 systemctl daemon-reload / start / enable
참고: https://osg.kr/archives/3109
-
설치
sudo apt install kime
-
IM 등록 (
im-config로 kime 선택 또는~/.xinputrc에run_im kime)im-config -n kime
.xprofile/.profile환경변수 (dotfiles에 포함):export GTK_IM_MODULE=kime export QT_IM_MODULE=kime export XMODIFIERS=@im=kime
-
GNOME 입력소스에서 ibus 제거 (안 하면 한/영 토글이 ibus-hangul로 가서 kime 레이아웃이 안 먹음)
gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us')]" pkill -f 'ibus-(daemon|engine|x11|portal|dconf|extension)'
-
설정 파일 배치 (dotfiles에 포함되어 있음)
~/.config/kime/config.yaml— 신세벌식 P2 (sebeolsik-3sin-p2),ComposeChoseongSsang+ComposeJongseongSsang(세벌식 한정)- 한/영 토글 키: 우측 Alt, Hangul, Muhenkan, Super+Space, Shift+Space
-
데몬 기동
pkill -x kime; pkill -x kime-indicator; pkill -x kime-xim nohup kime >/dev/null 2>&1 & disown
sudo apt install gnome-shell-extensions sudo apt install gnome-tweaks https://support.system76.com/articles/pop-keyboard-shortcuts/ https://github.com/pop-os/shell
sudo apt install pavucontrol # audio manager
sudo apt install blueman # bluetooth manager
# 1. 필요 패키지 설치
sudo apt update
sudo apt install -y git build-essential libevent-dev libncurses-dev bison pkg-config autotools-dev automake
# 2. 최신 tmux 소스 클론
git clone https://github.com/tmux/tmux.git
cd tmux
# 3. 최신 안정 버전으로 체크아웃 (예: 3.3a)
git checkout 3.3a
# 4. 빌드
sh autogen.sh
./configure
make
# 5. 설치 (옵션)
sudo make install
~/.config/kitty/kitty.conf
# Truecolor 활성화
enable_true_color yes
# 외부 앱이 kitty 기능 제어 가능하게 허용
allow_remote_control yes
# (선택) 기본 TERM
term xterm-kitty
.tmux.conf
set -ga terminal-overrides ',xterm-kitty:Tc:sitm=\E[3m' # kitty
# 256 color
set -g default-terminal "xterm-kitty" # kitty
# true color
set -as terminal-features ',xterm-kitty:RGB' # kitty
# 터미널 에뮬레이터 고유 기능 사용을 위해 escape sequences tmux가 가로채지 않도록 하는 기능
set -g allow-passthrough on # kitty
Windows 클라이언트의 WezTerm 설정은 두 파일로 나뉩니다.
~/.wezterm.lua— 이 머신 전용 진입점. SSH 서버 레지스트리(호스트/IP)를 여기에만 적습니다. 내부 IP가 들어가므로 레포에 커밋하지 않습니다.~/.wezterm.common.lua— 포터블(dotfiles 추적). 키맵·외관·테마 토글과 SSH 런처 빌더가 들어 있습니다.
~/.wezterm.lua의 servers 목록에 항목을 추가하면 런처(Ctrl+Shift+Alt+L)에 SSH <name> / BTOP on <name> 메뉴가 자동 생성됩니다.
local servers = {
{ name = "Dev", host = "192.168.0.42", user = "you",
enter = "tmux attach || tmux new-session", autossh = true },
}| 필드 | 설명 |
|---|---|
name |
런처에 표시될 라벨 |
host |
IP·호스트명·~/.ssh/config 별칭 |
user |
(선택) SSH 사용자명 |
key |
(선택) 개인키 파일명($HOME 기준). 생략 시 기본 키(~/.ssh/id_ed25519) 사용 |
cwd |
(선택) 런처 프로세스의 작업 디렉터리 |
enter |
(선택) 접속 시 실행할 원격 명령. 예: tmux attach || tmux new-session |
autossh |
(선택) true면 끊겨도 자동 재접속(PS 재시도 루프 + ServerAlive 키프얼라이브) |
런처는 Windows에서 네이티브 OpenSSH(C:\Windows\System32\OpenSSH\ssh.exe)만 사용하고 인증은 SSH 키로 합니다. 비밀번호 자동입력을 두 방식으로 시도했으나 모두 실패했기 때문입니다.
- sshpass + MSYS2 ssh — sshpass는 같은 MSYS2 런타임으로 빌드된 ssh의 프롬프트만 가로챌 수 있어
C:\msys64\usr\bin\ssh.exe를 써야 하는데, 이 Cygwin PTY 계층이 WezTerm의 ConPTY 위에서 tty 출력을 바이트 단위 저속 경로로 떨궈 스크롤·출력이 기어갑니다. (네트워크·GPU 문제가 아니라 로컬 PTY 변환 오버헤드 — 로컬 VM까지 동일하게 느려짐.) - plink (PuTTY) — charset을 지정하는 CLI 옵션이 없어 원격 UTF-8을 시스템 코드페이지(CP949)로 오독해 한글 mojibake가 나고, 기본
-sanitise-stdout이 제어문자(ESC)를?로 뭉개 tmux·nvim·powerline이 깨집니다.
네이티브 ssh는 바이트를 그대로 흘려보내 UTF-8·ANSI가 완벽하고 빠릅니다. (Unix 쪽은 Cygwin 페널티가 없어 server.password + sshpass 옵션이 그대로 유효합니다.)
# 1) 키 생성 (무passphrase — 무인 재접속용)
ssh-keygen -t ed25519 -f $env:USERPROFILE\.ssh\id_ed25519 -C "me@wezterm"
# 2) 서버에 공개키 등록 — 비번 1회 입력
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh you@192.168.0.42 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
# 3) 확인 — 비번 없이 hostname이 뜨면 성공
ssh you@192.168.0.42 hostnamePowerShell 5.1 함정: 원격 명령 문자열 안에
"$VAR"처럼 따옴표+변수를 넣으면 PS가 ssh로 넘기며 따옴표를 뭉개(native 인자 파싱 버그), 원격 셸에서 단어 분할이 일어납니다. 위처럼 공개키는 stdin으로만 흘리고(Get-Content | ssh … "cat >> …") 원격 명령에는 따옴표·$를 쓰지 마세요.
등록 후 WezTerm을 재시작하고 런처로 접속하면 비번 없이 붙고 tty도 빠릅니다.