
wlctl v0.1.10
๐ ๋ฆฌ๋ ์ค์์ Network Manager๋ฅผ ์ฌ์ฉํ wifi/ethernet/vpn ๊ด๋ฆฌ๋ฅผ ์ํ TUI

์
impala๋ ํ๋ฅญํ WiFi TUI์ด์ง๋ง iwd์ ํต์ ํฉ๋๋ค. ๋น์ ์ ๋ฐฐํฌํ์ด ์ด๋ฏธ NetworkManager๋ฅผ ์คํ ์ค์ด๋ผ๋ฉด (๋๋ถ๋ถ์ด ๊ทธ๋ ์ต๋๋ค โ GNOME, KDE, Ubuntu, Fedora, Pop, โฆ), ์คํ์ ๋ฏ์ด๋ด์ง ์๊ณ ๋ impala๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. wlctl์ impala์ UX๋ฅผ ์ ์งํ๋ฉด์ NetworkManager๋ฅผ ๋์์ผ๋ก ํ๋ฏ๋ก, DE๊ฐ ์ด๋ฏธ ํ๊ณ ์๋ ์์
๊ณผ ํจ๊ป ๊ทธ๋ฅ ์๋ํฉ๋๋ค.
๊ธฐ๋ฅ
- ์คํ ์ด์ ๋ฐ ์ก์ธ์ค ํฌ์ธํธ ๋ชจ๋
- WPA Enterprise (802.1X)
- ์ฌ๋ฌ ์ด๋ํฐ โ ๊ตฌ๋ํ ์ด๋ํฐ ์ ํ, ์ค์๊ฐ ์ ํ
- VPN ์ฐ๊ฒฐ โ ์ผ๊ธฐ/๋๊ธฐ, ์๋ ์ฐ๊ฒฐ ๊ด๋ฆฌ, ์ ์ฅ๋ VPN/WireGuard ํ๋กํ ์ญ์ (nmtui์ฒ๋ผ); ํ์ฑ ํฐ๋์ ์ค๋ฅธ์ชฝ ์๋จ์ ๋ฐฐ์ง๋ก ํ์
wlctl doctorโ rfkill, ๋๋ผ์ด๋ฒ, ์ฐ๊ฒฐ, IP, DHCP, ๊ฒ์ดํธ์จ์ด, DNS, ์ธํฐ๋ท์ ์ ๊ฒํฉ๋๋ค- QR ์ฝ๋ ๊ณต์ , ์จ๊ฒจ์ง ๋คํธ์ํฌ, ์๋ ํ ์คํธ
- Vim ํค, ๋ชจ๋ ํค ๋ฐ์ธ๋ฉ ์ค์ ๊ฐ๋ฅ
์ค์น
# crates.io
cargo install wlctl
# Arch (AUR)
yay -S wlctl-bin
# Nix (์คํํ์ง ์๊ณ ์ฌ์ฉ)
nix run github:aashish-thapa/wlctl
# ์์ค์์
git clone https://github.com/aashish-thapa/wlctl && cd wlctl
cargo build --release
NixOS์์๋ flake๋ฅผ ์
๋ ฅ์ผ๋ก ์ถ๊ฐํ๊ณ wlctl.packages.${system}.default๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, nix shell github:aashish-thapa/wlctl๋ก ์
ธ์ ๋ฐ๋ก ๋ฃ์ ์ ์์ต๋๋ค.
NetworkManager๊ฐ ์คํ ์ค์ด์ด์ผ ํฉ๋๋ค. Nerd Fonts๋ ์ ํ ์ฌํญ์ด๋ฉฐ ์์ด์ฝ์ ์ฌ์ฉ๋ฉ๋๋ค.
์ฌ์ฉ๋ฒ
TUI๋ฅผ ์คํํ๋ ค๋ฉด wlctl. ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ ์ด๋ค ๊ณ์ธต์ ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํ๋ ค๋ฉด wlctl doctor.
์ ์ญ
| ๋์ | ํค |
|---|---|
| ํจ๋ ์ ํ | Tab / Shift+Tab |
| ์ด๋ | j k / ํ์ดํ |
| ์ด๋ํฐ ๋ชจ๋ ์ ํ (์คํ ์ด์ โ AP) | Ctrl+R |
| VPN ์ฐ๊ฒฐ | v |
| ์ข ๋ฃ | q / Ctrl+C |
| ํ์ ๋ซ๊ธฐ | Esc |
์๋ ค์ง ๋คํธ์ํฌ
| ๋์ | ํค |
|---|---|
| ์ฐ๊ฒฐ / ํด์ | Space ๋๋ Enter |
| ์๋ ์ฐ๊ฒฐ ์ ํ | t |
| ๋คํธ์ํฌ ์ญ์ | d |
| ์ด๊ฒ์ ์ธํฐ๋ท ๊ฒฝ๋ก๋ก ์ค์ | u |
| ๋ชจ๋ ํ์ | a |
| QR ๊ณต์ | p |
์๋ ํ
์คํธ (speedtest-cli ํ์) | Shift+S |
WiFi์ ์ด๋๋ท์ด ๋ชจ๋ ํ์ฑํ๋์ด ์์ ๋, NetworkManager๊ฐ ์ค์ ๋ก ์ธํฐ๋ท์ ๋ผ์ฐํ
ํ๋ ๋งํฌ๊ฐ ๋
น์์ผ๋ก ๊ฐ์กฐ ํ์๋๊ณ ์์ ํ๋จ์ ํ์๋ฉ๋๋ค (๓ฐ Internet: WiFi ยท <ssid>). ์ด๋๋ท ํ ๋๋ ์ฐ๊ฒฐ๋ WiFi์์ u๋ฅผ ๋๋ฅด๋ฉด ๊ธฐ๋ณธ ๊ฒฝ๋ก๊ฐ ํด๋น ๋งํฌ๋ก ์ ํ๋ฉ๋๋ค (๋ค๋ฅธ ๋งํฌ๋ ๊ณ์ ํ์ฑ ์ํ).
์ฅ์น ์์ ํ๋จ์๋ ํ์ฑ ์ด๋ํฐ์ LAN IP๊ฐ ํ์๋ฉ๋๋ค (์: ๓ฐฉ wlan0 ยท 192.168.1.20). ๋ฐ๋ผ์ ip addr์ ์คํํ์ง ์๊ณ ๋ SSH๋ก ์ ์ํ ์ ์์ต๋๋ค.
์ ๋คํธ์ํฌ
| ๋์ | ํค |
|---|---|
| ์ฐ๊ฒฐ / ํด์ | Space ๋๋ Enter |
| ์จ๊ฒจ์ง ๋คํธ์ํฌ ์ฐ๊ฒฐ | h |
| ์ด๋ฆ์ผ๋ก ํํฐ๋ง | / |
| ๋ชจ๋ ํ์ | a |
/๋ฅผ ๋๋ฅด๋ฉด ์
๋ ฅํ๋๋๋ก SSID๋ก ์ค์บ ๋ชฉ๋ก์ ํํฐ๋งํฉ๋๋ค. Enter๋ ํํฐ๋ฅผ ์ ์งํ๊ณ , Esc๋ ์ง์๋๋ค.
VPN ์ฐ๊ฒฐ (v๋ก ์ด๊ธฐ)
| ๋์ | ํค |
|---|---|
| ์ผ๊ธฐ/๋๊ธฐ ์ ํ | Space ๋๋ Enter |
| ์๋ ์ฐ๊ฒฐ ์ ํ | a |
ํ๋กํ ์ญ์ (y/n ํ์ธ) | d |
| WireGuard ๊ตฌ์ฑ ๊ฐ์ ธ์ค๊ธฐ | i |
| ๋ซ๊ธฐ | Esc |
์ ํํ ํฐ๋์ ํ ๋น๋ IP์ ๊ฐ๋ ์๊ฐ์ด ํฐ๋์ด ์๋ ์ค์ผ ๋ ๋ชฉ๋ก ์๋์ ํ์๋ฉ๋๋ค.
WireGuard ๊ตฌ์ฑ ๊ฐ์ ธ์ค๊ธฐ: i๋ฅผ ๋๋ฅธ ๋ค์ ์ ์ฒด ๊ตฌ์ฑ์ ๋ถ์ฌ๋ฃ๊ฑฐ๋ (๋๋ถ๋ถ์ ์ ๊ณต์
์ฒด(Proton, Mullvad)๋ ํ
์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค) .conf ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์
๋ ฅํ๊ณ Enter๋ฅผ ๋๋ฅด์ธ์. wlctl์ด ์ด๋ฅผ ํ์ฑํ์ฌ NetworkManager ํ๋กํ์ ์์ฑํฉ๋๋ค โ nmcli๊ฐ ํ์ ์์ต๋๋ค. ๋ถ์ฌ๋ฃ์ ๊ตฌ์ฑ์ ์๋ฒ ์๋ํฌ์ธํธ์ ์ด๋ฆ์ผ๋ก ์ง์ ๋๊ณ , ํ์ผ ๊ฐ์ ธ์ค๊ธฐ๋ ํ์ผ ์ด๋ฆ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ๊ฒฝ๋ก์์ ~๋ ํ์ฅ๋ฉ๋๋ค. ํ๋กํ์ ์๋ ์ฐ๊ฒฐ ์์ด ์ถ๊ฐ๋ฉ๋๋ค. Enter๋ก ์ผ๊ธฐ/๋๊ธฐ๋ฅผ ์ ํํ์ธ์. OpenVPN .ovpn ํ์ผ์ ์ฌ๊ธฐ์ ์ง์๋์ง ์์ต๋๋ค โ ํด๋น ํ์ผ์ nmcli connection import type openvpn file <path>๋ก ๊ฐ์ ธ์ค์ธ์ (NetworkManager-openvpn ํ๋ฌ๊ทธ์ธ์ด ํ์ํฉ๋๋ค).
์ฅ์น ํจ๋
| ๋์ | ํค |
|---|---|
| ์ด๋ํฐ ์ ๋ณด | i |
| ์ ์ ์ ํ | o |
| ๋ฅํฐ | ? |
์คํ ์ด์ ๋ชจ๋
| ๋์ | ํค |
|---|---|
| ์ค์บ | s |
์ก์ธ์ค ํฌ์ธํธ ๋ชจ๋
| ๋์ | ํค |
|---|---|
| AP ์์ | n |
| AP ์ค์ง | x |
์ค์
~/.config/wlctl/config.toml. ๋ชจ๋ ํค๋ฅผ ๋ค์ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค.
switch = "r"
mode = "station"
esc_quit = false
vpn = "v"
[device]
infos = "i"
toggle_power = "o"
doctor = "?"
[station]
toggle_scanning = "s"
[station.known_network]
toggle_autoconnect = "t"
remove = "d"
show_all = "a"
share = "p"
speed_test = "S"
prefer = "u"
[station.new_network]
show_all = "a"
connect_hidden = "h"
filter = "/"
[access_point]
start = "n"
stop = "x"
vs. impala
| impala | wlctl | |
|---|---|---|
| ๋ฐฑ์๋ | iwd | NetworkManager |
| ๊ธฐ๋ณธ ๋ฐ์คํฌํฑ ๋คํธ์ํฌ ์คํ๊ณผ ๊ณต์กด | ์๋์ค | ์ |
| ๋ค์ค ์ด๋ํฐ ์ ํ๊ธฐ | โ | ์ |
| VPN ์ฐ๊ฒฐ ์ ํ | โ | ์ |
doctor ํ์ ๋ช
๋ น์ด | โ | ์ |
ํฌ๋ ๋ง
pythops/impala์์ ํฌํฌ๋์์ต๋๋ค. UI์ ์ํคํ ์ฒ๋ ๊ทธ๋ค์ ๊ฒ์ ๋๋ค.
๋ผ์ด์ ์ค
GPLv3