
ローカルエリアネットワーク発見ツール。Goで書かれたインタラクティブなターミナルユーザーインターフェース(TUI)付き。 直感的にLANを発見、探索、理解できます。 ノックノック…誰かいる? 🚪
# Whosthere
[](https://go.dev/doc/devel/release)
[](LICENSE)
[](https://github.com/ramonvermeulen/whosthere/releases)
[](https://github.com/ramonvermeulen/whosthere/releases)
[](https://github.com/ramonvermeulen/whosthere)
Go で書かれたインタラクティブな Terminal User Interface (TUI) を備えたローカルエリアネットワーク検出ツール。
直感的な方法で LAN を検出、探索、理解できます。
Whosthere は [**mDNS**](https://en.wikipedia.org/wiki/Multicast_DNS) と [**SSDP**](https://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol) スキャナーを使用して、**非特権で並行スキャン**を実行します。さらに、TCP/UDP 接続を試みて ARP 解決をトリガーすることでローカルサブネットをスイープし、その後 [**ARP キャッシュ**](https://en.wikipedia.org/wiki/Address_Resolution_Protocol) を読み取ってローカルエリアネットワーク上のデバイスを識別します。この手法は、昇格された権限を必要とせずに ARP キャッシュを populate します。検出されたすべてのデバイスは [**OUI**](https://standards-oui.ieee.org/) ルックアップで強化され、利用可能な場合は製造元が表示されます。
Whosthere は、すべてのネットワーク管理者が問いかける疑問「私のネットワークには誰がいるのか?」に答えるための、親しみやすく直感的な方法を提供します。

## 機能
- **インタラクティブな TUI:** 検出されたデバイスを直感的にナビゲートして探索できます。
- **高速かつ並行:** 複数の検出方法を同時に活用します。
- **昇格された権限が不要:** 完全にユーザー空間で動作します。
- **デバイスのエンリッチメント:** [**OUI**](https://standards-oui.ieee.org/) ルックアップを使用してデバイスの製造元を表示します。
- **統合ポートスキャナー:** 検出されたホストに対するオプションのサービス検出 (許可を得たデバイスのみをスキャンしてください!)。
- **HTTP API を備えたデーモンモード:** バックグラウンドで実行し、他のツールと統合できます。
- **テーマと設定:** YAML 設定を介して外観と動作をカスタマイズできます。
## インストール
[**Homebrew**](https://brew.sh/) で `brew` を使用:
```bash
brew install whosthere
```
[**NixOS**](https://nixos.org/) で `nix` を使用:
```bash
nix profile install nixpkgs#whosthere
```
[**Arch Linux**](https://archlinux.org/) で `yay` を使用:
```bash
yay -S whosthere-bin
```
お使いのパッケージマネージャーがリストにない場合は、いつでも [**Go**](https://go.dev/) でインストールできます:
```bash
go install github.com/ramonvermeulen/whosthere@latest
```
または **ソースからビルド**:
```bash
git clone https://github.com/ramonvermeulen/whosthere.git
cd whosthere
make build
```
さらに、[**リリースページ**](https://github.com/ramonvermeulen/whosthere/releases) からビルド済みバイナリをダウンロードできます。
## 使用方法
インタラクティブな検出のために TUI を実行:
```bash
whosthere
```
単一のスキャンを実行して結果を出力するために CLI として実行:
```bash
whosthere scan -t 5
```
結果を JSON ファイルに出力:
```bash
whosthere scan -t 5 --json --pretty > devices.json
```
HTTP API を備えたデーモンとして実行:
```bash
whosthere daemon --port=8080
```
ファイルからエイリアスを一括インポート、または現在のエイリアスをエクスポート:
```text
whosthere aliases import ./aliases.yaml
whosthere aliases export --stdout
```
追加のコマンドラインオプションは以下を実行して確認できます:
```bash
whosthere --help
```
## キーバインド (TUI)
| Key | Action |
| ------------------ | --------------------------- |
| `/` | 正規表現検索を開始 |
| `k` | 上へ |
| `j` | 下へ |
| `g` | 先頭へ移動 |
| `G` | 末尾へ移動 |
| `y` | 選択したデバイスの IP をコピー |
| `Y` | 選択したデバイスの MAC をコピー |
| `enter` | デバイスの詳細を表示 |
| `CTRL+t` | テーマセレクターを切り替え |
| `CTRL+i` | インターフェースセレクターを切り替え |
| `CTRL+c`/`q` | アプリケーションを停止 |
| `ESC` | 検索をクリア / 戻る |
| `p` (詳細ビュー) | デバイスのポートスキャンを開始 |
| `tab` (モーダルビュー) | ボタンの選択を切り替え |
## 設定
Whosthere は以下の優先順位 (高い順から低い順) で複数の設定方法をサポートしています:
1. **コマンドラインフラグ** - 最優先。利用可能なフラグは `whosthere --help` を参照してください。
1. **環境変数** - `WHOSTHERE__` をプレフィックスとして付けます。[**環境変数による設定**](#configuration-via-environment-variables) を参照してください。
1. **設定ファイル** - YAML 設定ファイル。[**設定ファイル**](#configuration-file) を参照してください。
1. **デフォルト値** - フォールバックのデフォルト。[**config.go**](https://github.com/ramonvermeulen/whosthere/blob/main/internal/core/config/config.go) の `DefaultConfig()` を参照してください。
### 設定ファイル
Whosthere は以下の順序で設定ファイルを探し、最初に見つかったものを使用します:
1. `--config` フラグまたは `WHOSTHERE_CONFIG` 環境変数で指定されたパス
1. `$XDG_CONFIG_HOME/whosthere/config.yaml` (`XDG_CONFIG_HOME` が設定されている場合)
1. `~/.config/whosthere/config.yaml` (デフォルトの場所)
**設定例:**
```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
# Optional IPv4 CIDR subnets to sweep. When set, the sweeper skips the auto-detected interface subnet unless it is listed here.
# target_subnets: ["10.0.0.0/24", "10.0.1.0/24"]
# WARNING: scanning subnets larger than /16 sends packets to 65535+ IPs per subnet. Enable only if you understand the traffic implications. Consider using smaller /24 subnets for targeted scanning.
# scan_large_subnets: 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"
aliases:
# Uncomment to import aliases.yaml into the local database on startup (only when it changed)
# auto_import: false
# Override the aliases file path - defaults to the app config directory
# file: "/path/to/aliases.yaml"
```
## 環境変数
### 一般的な環境変数
| Variable | Description |
| ------------------ | ------------------------------------------------------------------------------- |
| `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__TARGET_SUBNETS=10.0.0.0/24,10.0.1.0/24` - ターゲットサブネットを設定。YAML 設定の `target_subnets: ["10.0.0.0/24", "10.0.1.0/24"]` と同等
- `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` - テーマを cyberpunk に設定。YAML 設定の `theme.name: cyberpunk` と同等
## デバイスエイリアス
エイリアスはステートディレクトリ内のローカルな [bbolt](https://github.com/etcd-io/bbolt) データベースに保存されます。一度に多数を設定するには、YAML ファイル (設定ディレクトリ内の `aliases.yaml`、`aliases.file` 設定キーまたはパス引数で上書き可能) からインポートします。
このファイルは **ミラーではなくパッチ** であり、読み取り専用です。インポートはファイルに含まれる MAC を upsert し、それ以外は変更しません。また、TUI での編集は **ファイルに書き戻されることはありません**。再生成するには `export` を使用してください。
```yaml
version: 1
aliases:
aa:bb:cc:dd:ee:ff: "Living Room TV"
de:ad:be:ef:00:01: "Office Printer"
```
- `version` はファイルフォーマットのバージョンです。`1` を使用してください (これがないファイルはデフォルトで 1 になります)。
- MAC は一般的な任意の形式で受け付けられ、正規化されます。したがって `AA:BB:CC:DD:EE:FF`、`aa-bb-cc-dd-ee-ff`、`aabbccddeeff` は同等です。空のエイリアス (`""`) はエイリアスをクリアします。
- 無効な MAC はスキップされて報告されますが、残りのインポートは引き続き実行されます。
```bash
whosthere aliases import # from the default location
whosthere aliases import ./aliases.yaml
whosthere aliases export # to the default location
whosthere aliases export --stdout # to stdout
```
起動時のインポートを有効にするには `aliases.auto_import: true` を設定します。ファイルはハッシュチェックされ、変更された場合にのみ再インポートされるため、変更されていないファイルが TUI の編集を上書きすることはありません。ただし、**変更されたファイルは、それが含むすべての MAC のエイリアスを上書きします**。TUI 専用のエイリアスはファイルに含めないか、編集後に `export` して同期を保ってください。
## デーモンモードの HTTP API
Whosthere をデーモンモードで実行すると、以下のエンドポイントを持つ非常にシンプルな HTTP API を公開します:
| Method | Endpoint | Description |
| ------ | -------------- | ---------------------------------- |
| GET | `/devices` | 検出されたすべてのデバイスのリストを取得 |
| GET | `/device/{ip}` | 特定のデバイスの詳細を取得 |
| GET | `/health` | ヘルスチェック |
## テーマ
テーマは設定ファイルを介して、または実行時に `CTRL+t` キーバインドを介して設定できます。
利用可能なテーマの完全なリストは [**こちら**](https://github.com/ramonvermeulen/whosthere/blob/main/internal/ui/theme/theme.go) で確認できます。独自のテーマを追加する PR をぜひお待ちしています!
テーマ設定の例:
```yaml
theme:
enabled: true
name: cyberpunk
```
`name` が `custom` に設定されている場合、他のカラーオプションを使用して独自のカスタムテーマを作成できます。
`enabled` オプションが `false` に設定されている場合、TUI はターミナルのデフォルト ANSI カラーを使用します。
`NO_COLOR` 環境変数が設定されている場合、すべての ANSI カラーが無効になります。
## ロギング
ログはアプリケーションのステートディレクトリに書き込まれます:
- `$XDG_STATE_HOME/whosthere/app.log` (`XDG_STATE_HOME` が設定されている場合)
- `~/.local/state/whosthere/app.log` (Linux/MacOS のフォールバック)
- `%LOCALAPPDATA%/whosthere/app.log` (Windows のフォールバック)
TUI モードで実行していない場合、ログはコンソールにも書き込まれます。
## プラットフォーム
Whosthere は以下のプラットフォームをサポートしています:
- [x] Linux
- [x] macOS
- [x] Windows
## 既知の問題
クリップボード機能を動作させるために、[**go-clipboard のフォーク**](https://github.com/dece2183/go-clipboard) が使用されています。
お使いの OS に適したコピーツールがインストールされていることを確認してください:
| OS | Supported copy tools |
| -------------------------------------- | -------------------------------------------- |
| Darwin | `pbcopy` |
| Windows | `clip.exe` |
| Linux/FreeBSD/NetBSD/OpenBSD/Dragonfly | X11: `xsel`, `xclip` <br> Wayland: `wl-copy` |
## 免責事項
Whosthere は、自身のホームネットワークなど、ネットワーク検出とスキャンを実行する許可を得ているネットワークでの使用を目的としています。許可のないネットワークのスキャンは違法かつ非倫理的である可能性があります。
ネットワーク上でこのツールを使用する前に、必ず適切な許可を取得してください。
このツールは主に教育目的およびホームネットワークの探索のために作成されました。機能的で有用ではありますが、プロフェッショナルグレードのネットワーク監視ソリューションと見なすべきではありません。結果は非特権のスキャン技術に基づいており、包括的でない可能性があります。重要なネットワーク分析やセキュリティ評価には、正式なサポートを備えた確立されたプロフェッショナルツールの使用を検討してください。
## コントリビューション
機能リクエスト、バグ報告、改善などのコントリビューションや提案を歓迎します!
GitHub リポジトリで issue を開くか、pull request を送信してください。
大きな変更を実装する前に、必ず GitHub issue で議論してください。