์ธ ๊ฐ์ง ์ฌ์ฉ ๋ฐฉ์์ด ์๋ค.
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 ๋ฑ ์ฌ๋งํฌ)ํด๋ฆฐ ์ปจํ ์ด๋์์ 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๋ ๋น ๋ฆ ๋๋ค.