
whosthere v0.8.3
Go๋ก ์์ฑ๋ ๋ํํ ํฐ๋ฏธ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(TUI)๋ฅผ ๊ฐ์ถ ๊ทผ๊ฑฐ๋ฆฌ ํต์ ๋ง(LAN) ํ์ ๋๊ตฌ์ ๋๋ค. ์ง๊ด์ ์ธ ๋ฐฉ์์ผ๋ก LAN์ ๋ฐ๊ฒฌํ๊ณ ํ์ํ๋ฉฐ ์ดํดํ์ธ์. ๋๋.. ๋๊ตฌ์ธ์? ๐ช
Whosthere
Go๋ก ์์ฑ๋ ๋ํํ ํฐ๋ฏธ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(TUI)๋ฅผ ๊ฐ์ถ ๋ก์ปฌ ์์ญ ๋คํธ์ํฌ ๊ฒ์ ๋๊ตฌ์ ๋๋ค. ์ง๊ด์ ์ธ ๋ฐฉ์์ผ๋ก LAN์ ๋ฐ๊ฒฌํ๊ณ ํ์ํ๋ฉฐ ์ดํดํ์ธ์.
Whosthere๋ mDNS ๋ฐ SSDP ์ค์บ๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ถํ ์๋ ๋์ ์ค์บ์ ์ํํฉ๋๋ค. ๋ํ TCP/UDP ์ฐ๊ฒฐ์ ์๋ํ์ฌ ARP ํด์๋๋ฅผ ํธ๋ฆฌ๊ฑฐํจ์ผ๋ก์จ ๋ก์ปฌ ์๋ธ๋ท์ ์ค์ํํ ๋ค์ ARP ์บ์๋ฅผ ์ฝ์ด ๋ก์ปฌ ์์ญ ๋คํธ์ํฌ์์ ์ฅ์น๋ฅผ ์๋ณํฉ๋๋ค. ์ด ๊ธฐ์ ์ ์์น๋ ๊ถํ ์์ด ARP ์บ์๋ฅผ ์ฑ์๋๋ค. ๋ฐ๊ฒฌ๋ ๋ชจ๋ ์ฅ์น๋ OUI ์กฐํ๋ฅผ ํตํด ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ ์กฐ์ ์ฒด๋ฅผ ํ์ํ๋๋ก ๊ฐํ๋ฉ๋๋ค.
Whosthere๋ ๋ชจ๋ ๋คํธ์ํฌ ๊ด๋ฆฌ์๊ฐ ๋ฌป๋ ์ง๋ฌธ์ธ "๋คํธ์ํฌ์ ๋๊ฐ ์๋์?"์ ์น๊ทผํ๊ณ ์ง๊ด์ ์ธ ๋ฐฉ์์ผ๋ก ๋ต๋ณํฉ๋๋ค.

Features
- ๋ํํ TUI: ๋ฐ๊ฒฌ๋ ์ฅ์น๋ฅผ ์ง๊ด์ ์ผ๋ก ํ์ํ๊ณ ํ์ํฉ๋๋ค.
- ๋น ๋ฅด๊ณ ๋์์ฑ: ์ฌ๋ฌ ๊ฒ์ ๋ฐฉ๋ฒ์ ๋์์ ํ์ฉํฉ๋๋ค.
- ๊ถํ ์์น ๋ถํ์: ์์ ํ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ์คํ๋ฉ๋๋ค.
- ์ฅ์น ์ ๋ณด ๋ณด๊ฐ: OUI ์กฐํ๋ฅผ ์ฌ์ฉํ์ฌ ์ฅ์น ์ ์กฐ์ ์ฒด๋ฅผ ํ์ํฉ๋๋ค.
- ํตํฉ ํฌํธ ์ค์บ๋: ๋ฐ๊ฒฌ๋ ํธ์คํธ์ ๋ํ ์ ํ์ ์๋น์ค ๊ฒ์ (๊ถํ์ด ์๋ ์ฅ์น๋ง ์ค์บํ์ธ์!).
- HTTP API๋ฅผ ๊ฐ์ถ ๋ฐ๋ชฌ ๋ชจ๋: ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๊ณ ๋ค๋ฅธ ๋๊ตฌ์ ํตํฉ๋ฉ๋๋ค.
- ํ ๋ง ๋ฐ ์ค์ : YAML ๊ตฌ์ฑ์ ํตํด ๋ชจ์๊ณผ ๋์์ ๊ฐ์ธํํฉ๋๋ค.
Installation
Homebrew๋ฅผ ํตํด brew๋ก:
brew install whosthere
NixOS์์ nix๋ก:
nix profile install nixpkgs#whosthere
Arch Linux์์ yay๋ก:
yay -S whosthere-bin
ํจํค์ง ๊ด๋ฆฌ์๊ฐ ๋ชฉ๋ก์ ์์ผ๋ฉด ์ธ์ ๋ ์ง Go๋ก ์ค์นํ ์ ์์ต๋๋ค:
go install github.com/ramonvermeulen/whosthere@latest
๋๋ ์์ค์์ ๋น๋:
git clone https://github.com/ramonvermeulen/whosthere.git
cd whosthere
make build
๋ํ ๋ฆด๋ฆฌ์ค ํ์ด์ง์์ ๋ฏธ๋ฆฌ ๋น๋๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
Usage
๋ํํ ๊ฒ์์ ์ํด TUI ์คํ:
whosthere
๋จ์ผ ์ค์บ์ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด CLI๋ก ์คํ:
whosthere scan -t 5
JSON ํ์ผ๋ก ๊ฒฐ๊ณผ ์ถ๋ ฅ:
whosthere scan -t 5 --json --pretty > devices.json
HTTP API๋ฅผ ๊ฐ์ถ ๋ฐ๋ชฌ์ผ๋ก ์คํ:
whosthere daemon --port=8080
์ถ๊ฐ ๋ช ๋ น์ค ์ต์ ์ ๋ค์์ ์คํํ์ฌ ํ์ธํ ์ ์์ต๋๋ค:
whosthere --help
Key bindings (TUI)
| Key | ๋์ |
|---|---|
/ | ์ ๊ท ํํ์ ๊ฒ์ ์์ |
k | ์ |
j | ์๋ |
g | ๋งจ ์๋ก ์ด๋ |
G | ๋งจ ์๋๋ก ์ด๋ |
y | ์ ํํ ์ฅ์น์ IP ๋ณต์ฌ |
Y | ์ ํํ ์ฅ์น์ MAC ๋ณต์ฌ |
enter | ์ฅ์น ์ธ๋ถ ์ ๋ณด ํ์ |
CTRL+t | ํ ๋ง ์ ํ๊ธฐ ์ ํ |
CTRL+i | ์ธํฐํ์ด์ค ์ ํ๊ธฐ ์ ํ |
CTRL+c/q | ์ ํ๋ฆฌ์ผ์ด์ ์ค์ง |
ESC | ๊ฒ์ ์ง์ฐ๊ธฐ / ๋์๊ฐ๊ธฐ |
p (details view) | ์ฅ์น์์ ํฌํธ ์ค์บ ์์ |
tab (modal view) | ๋ฒํผ ์ ํ ์ ํ |
Configuration
Whosthere๋ ๋ค์ ์ฐ์ ์์(๋์์์ ๋ฎ์ ์)๋ก ์ฌ๋ฌ ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค:
- ๋ช
๋ น์ค ํ๋๊ทธ - ์ต๊ณ ์ฐ์ ์์. ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋๊ทธ๋
whosthere --help๋ฅผ ์ฐธ์กฐํ์ธ์. - ํ๊ฒฝ ๋ณ์ -
WHOSTHERE__์ ๋์ฌ ์ฌ์ฉ. ํ๊ฒฝ ๋ณ์๋ฅผ ํตํ ๊ตฌ์ฑ์ ์ฐธ์กฐํ์ธ์. - ๊ตฌ์ฑ ํ์ผ - YAML ๊ตฌ์ฑ ํ์ผ. ๊ตฌ์ฑ ํ์ผ์ ์ฐธ์กฐํ์ธ์.
- ๊ธฐ๋ณธ๊ฐ - ๋์ฒด ๊ธฐ๋ณธ๊ฐ. config.go์
DefaultConfig()๋ฅผ ์ฐธ์กฐํ์ธ์.
Configuration File
Whosthere๋ ๋ค์ ์์๋ก ๊ตฌ์ฑ ํ์ผ์ ์ฐพ์ผ๋ฉฐ, ์ฒ์ ๋ฐ๊ฒฌ๋ ํ์ผ์ ์ฌ์ฉํฉ๋๋ค:
--configํ๋๊ทธ ๋๋WHOSTHERE_CONFIGํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์ง์ ๋ ๊ฒฝ๋ก$XDG_CONFIG_HOME/whosthere/config.yaml(XDG_CONFIG_HOME์ด ์ค์ ๋ ๊ฒฝ์ฐ)~/.config/whosthere/config.yaml(๊ธฐ๋ณธ ์์น)
๊ตฌ์ฑ ์์ :
# Uncomment the next line to configure a specific network interface - uses OS default if not set
# network_interface: eth0
# When enabled, devices from all network interfaces are shown and persist when switching interfaces
# Note: if two interfaces share the same subnet (e.g. both use 192.168.1.x), devices may get merged
# since they are identified by IP address. Use with caution on overlapping subnets.
all_interfaces: false
# How often to run discovery scans
scan_interval: 20s
# Maximum timeout for each scan, recommended to be less than the scan interval
scan_timeout: 10s
scanners:
mdns:
enabled: true
ssdp:
enabled: true
arp:
enabled: true
sweeper:
enabled: true
interval: 5m
timeout: 20s
port_scanner:
timeout: 5s
# List of TCP ports to scan on discovered devices
tcp: [21, 22, 23, 25, 80, 110, 135, 139, 143, 389, 443, 445, 993, 995, 1433, 1521, 3306, 3389, 5432, 5900, 8080, 8443, 9000, 9090, 9200, 9300, 10000, 27017]
splash:
enabled: true
delay: 1s
theme:
# When disabled, the TUI will use the terminal it's default ANSI colors
# Also see the NO_COLOR environment variable to completely disable ANSI colors
enabled: true
# See the complete list of available themes at https://github.com/ramonvermeulen/whosthere/tree/main/internal/ui/theme/theme.go
# Set name to "custom" to use the custom colors below
# For any color that is not configured it will take the default theme value as fallback
name: default
# Disable ANSI colors completely, overrides theme.enabled
# Can also be set via NO_COLOR or WHOSTHERE__THEME__NO_COLOR environment variables
# no_color: false
# Custom theme colors (uncomment and set name: custom to use)
# primitive_background_color: "#000a1a"
# contrast_background_color: "#001a33"
# more_contrast_background_color: "#003366"
# border_color: "#0088ff"
# title_color: "#00ffff"
# graphics_color: "#00ffaa"
# primary_text_color: "#cceeff"
# secondary_text_color: "#6699ff"
# tertiary_text_color: "#ffaa00"
# inverse_text_color: "#000a1a"
# contrast_secondary_text_color: "#88ddff"
Environment Variables
์ผ๋ฐ ํ๊ฒฝ ๋ณ์
| ๋ณ์ | ์ค๋ช |
|---|---|
WHOSTHERE_CONFIG | ๊ตฌ์ฑ ํ์ผ์ ๊ฒฝ๋ก๋ก, ๊ธฐ๋ณธ ์์น๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค. |
WHOSTHERE_LOG | ๋ก๊ทธ ๋ ๋ฒจ์ ์ค์ ํฉ๋๋ค (์: debug, info, warn, error). ๊ธฐ๋ณธ๊ฐ์ info์
๋๋ค. |
NO_COLOR | TUI์์ ANSI ์์์ ๋นํ์ฑํํฉ๋๋ค. |
ํ๊ฒฝ ๋ณ์๋ฅผ ํตํ ๊ตฌ์ฑ
YAML ๊ตฌ์ฑ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ตฌ์ฑ ์ต์
์ WHOSTHERE__ ์ ๋์ฌ(์ด์ค ๋ฐ์ค ์ฐธ๊ณ )๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์ค์ ํ ์ ์์ต๋๋ค. ์ค์ฒฉ๋ ๊ตฌ์ฑ ํค๋ ์ด์ค ๋ฐ์ค๋ก ๊ตฌ๋ถ๋๋ฉฐ, ํค๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค.
์์:
WHOSTHERE__SPLASH__ENABLED=false- ์คํ๋์ ํ๋ฉด์ ๋นํ์ฑํํ๋ฉฐ, YAML ๊ตฌ์ฑ์splash.enabled: false์ ํด๋นํฉ๋๋ค.WHOSTHERE__SPLASH__DELAY=2s- ์คํ๋์ ํ๋ฉด ์ง์ฐ์ 2์ด๋ก ์ค์ ํ๋ฉฐ, YAML ๊ตฌ์ฑ์splash.delay: 2s์ ํด๋นํฉ๋๋ค.WHOSTHERE__SCAN_INTERVAL=30s- ์ค์บ ๊ฐ๊ฒฉ์ 30์ด๋ก ์ค์ ํ๋ฉฐ, YAML ๊ตฌ์ฑ์scan_interval: 30s์ ํด๋นํฉ๋๋ค.WHOSTHERE__SCANNERS__MDNS__ENABLED=false- mDNS ์ค์บ๋๋ฅผ ๋นํ์ฑํํ๋ฉฐ, YAML ๊ตฌ์ฑ์scanners.mdns.enabled: false์ ํด๋นํฉ๋๋ค.WHOSTHERE__PORT_SCANNER__TCP=80,443,8080- ์ฌ์ฉ์ ์ ์ TCP ํฌํธ๋ฅผ ์ค์บํ๋๋ก ์ค์ ํ๋ฉฐ, YAML ๊ตฌ์ฑ์port_scanner.tcp: [80, 443, 8080]์ ํด๋นํฉ๋๋ค.WHOSTHERE__THEME__NAME=cyberpunk- ํ ๋ง๋ฅผ ์ฌ์ด๋ฒํํฌ๋ก ์ค์ ํ๋ฉฐ, YAML ๊ตฌ์ฑ์theme.name: cyberpunk์ ํด๋นํฉ๋๋ค.
Daemon mode HTTP API
Whosthere๋ฅผ ๋ฐ๋ชฌ ๋ชจ๋๋ก ์คํํ๋ฉด ๋งค์ฐ ๊ฐ๋จํ HTTP API๋ฅผ ๋ ธ์ถํ๋ฉฐ, ๋ค์ ์๋ํฌ์ธํธ๊ฐ ์์ต๋๋ค:
| ๋ฉ์๋ | ์๋ํฌ์ธํธ | ์ค๋ช |
|---|---|---|
| GET | /devices | ๋ฐ๊ฒฌ๋ ๋ชจ๋ ์ฅ์น ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ |
| GET | /device/{ip} | ํน์ ์ฅ์น์ ์ธ๋ถ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ |
| GET | /health | ์ํ ํ์ธ |
Themes
ํ
๋ง๋ ๊ตฌ์ฑ ํ์ผ์ ํตํด ๋๋ ๋ฐํ์ ์ CTRL+t ํค ๋ฐ์ธ๋ฉ์ ํตํด ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ํ
๋ง์ ์ ์ฒด ๋ชฉ๋ก์ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ผ๋ฉฐ, ์์ ์ ํ
๋ง๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด PR์ ์ด์ด ์ฃผ์ธ์!
ํ ๋ง ๊ตฌ์ฑ ์์ :
theme:
enabled: true
name: cyberpunk
name์ด custom์ผ๋ก ์ค์ ๋๋ฉด ๋ค๋ฅธ ์์ ์ต์
์ ์ฌ์ฉํ์ฌ ์์ ๋ง์ ์ฌ์ฉ์ ์ ์ ํ
๋ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. enabled ์ต์
์ด false๋ก ์ค์ ๋๋ฉด TUI๋ ํฐ๋ฏธ๋์ ๊ธฐ๋ณธ ANSI ์์์ ์ฌ์ฉํฉ๋๋ค. NO_COLOR ํ๊ฒฝ ๋ณ์๊ฐ ์ค์ ๋๋ฉด ๋ชจ๋ ANSI ์์์ด ๋นํ์ฑํ๋ฉ๋๋ค.
Logging
๋ก๊ทธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋๋ ํฐ๋ฆฌ์ ๊ธฐ๋ก๋ฉ๋๋ค:
$XDG_STATE_HOME/whosthere/app.log(XDG_STATE_HOME์ด ์ค์ ๋ ๊ฒฝ์ฐ)~/.local/state/whosthere/app.log(๋์ฒด Linux/MacOS)%LOCALAPPDATA%/whosthere/app.log(๋์ฒด Windows)
TUI ๋ชจ๋๋ก ์คํํ์ง ์์ ๋๋ ์ฝ์์๋ ๋ก๊ทธ๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค.
Platforms
Whosthere๋ ๋ค์ ํ๋ซํผ์ ์ง์ํฉ๋๋ค:
- Linux
- macOS
- Windows
Known Issues
ํด๋ฆฝ๋ณด๋ ๊ธฐ๋ฅ์ด ์๋ํ๋ ค๋ฉด go-clipboard์ ํฌํฌ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. OS์ ๋ง๋ ์ ์ ํ ๋ณต์ฌ ๋๊ตฌ๊ฐ ์ค์น๋์ด ์๋์ง ํ์ธํ์ธ์:
| OS | ์ง์๋๋ ๋ณต์ฌ ๋๊ตฌ |
|---|---|
| Darwin | pbcopy |
| Windows | clip.exe |
| Linux/FreeBSD/NetBSD/OpenBSD/Dragonfly | X11: xsel, xclip Wayland: wl-copy |
Disclaimer
Whosthere๋ ์์ ์ ํ ๋คํธ์ํฌ์ ๊ฐ์ด ๋คํธ์ํฌ ๊ฒ์ ๋ฐ ์ค์บ์ ์ํํ ๊ถํ์ด ์๋ ๋คํธ์ํฌ์์ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ํ๊ฐ๋์ง ์์ ๋คํธ์ํฌ ์ค์บ์ ๋ถ๋ฒ์ด๊ฑฐ๋ ๋น์ค๋ฆฌ์ ์ผ ์ ์์ต๋๋ค. ์ด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ํญ์ ์ ์ ํ ์น์ธ์ ๋ฐ์์ผ ํฉ๋๋ค.
์ด ๋๊ตฌ๋ ์ฃผ๋ก ๊ต์ก ๋ชฉ์ ๊ณผ ํ ๋คํธ์ํฌ ํ์์ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. ๊ธฐ๋ฅ์ ์ด๊ณ ์ ์ฉํ์ง๋ง ์ ๋ฌธ์ ์ธ ์์ค์ ๋คํธ์ํฌ ๋ชจ๋ํฐ๋ง ์๋ฃจ์ ์ผ๋ก ๊ฐ์ฃผ๋์ด์๋ ์ ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ ๊ถํ ์๋ ์ค์บ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ ํฌ๊ด์ ์ด์ง ์์ ์ ์์ต๋๋ค. ์ค์ํ ๋คํธ์ํฌ ๋ถ์์ด๋ ๋ณด์ ํ๊ฐ๋ฅผ ์ํด์๋ ๊ณต์ ์ง์์ ๋ฐ๋ ์ ๋ฌธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
Contributing
๊ธฐ๋ฅ ์์ฒญ, ๋ฒ๊ทธ ์ ๊ณ , ๊ฐ์ ์ฌํญ ๋ฑ์ ๊ธฐ์ฌ์ ์ ์์ ํ์ํฉ๋๋ค! GitHub ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ด์๋ฅผ ์ด๊ฑฐ๋ ํ ๋ฆฌํ์คํธ๋ฅผ ์ ์ถํด ์ฃผ์ธ์. ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌํํ๊ธฐ ์ ์ GitHub ์ด์์์ ๋ ผ์ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.