https://guumaster.github.io/hostctl/

Go 製のコマンドラインツール。 /etc/hosts に行を足したり行を削除したり、グルーピングしてON/OFF を切り替えたりできる。 たまに編集するだけであればテキストエディタで編集すれば良いと思うが、頻繁に編集するフローがあるのであれば hostctl が便利。

インストール方法

https://guumaster.github.io/hostctl/docs/installation/

Hello, hostctl

$ sudo hostctl list
+----------+--------+-----------------+----------------------------+
| PROFILE  | STATUS |       IP        |           DOMAIN           |
+----------+--------+-----------------+----------------------------+
| default  | on     | 127.0.0.1       | localhost                  |
| default  | on     | 255.255.255.255 | broadcasthost              |
| default  | on     | ::1             | localhost                  |
| default  | on     | 127.0.0.1       | kubernetes.docker.internal |
+----------+--------+-----------------+----------------------------+

バックアップ

hostctl コマンドで色々編集する前に、現時点の /etc/hosts をバックアップとしてどこかに置いといた方が良い。

$ hostctl backup
[✔] Backup 'hosts.20220307' created.

+---------+--------+-----------------+----------------------------+
| PROFILE | STATUS |       IP        |           DOMAIN           |
+---------+--------+-----------------+----------------------------+
| default | on     | 127.0.0.1       | localhost                  |
| default | on     | 255.255.255.255 | broadcasthost              |
| default | on     | ::1             | localhost                  |
| default | on     | 127.0.0.1       | kubernetes.docker.internal |
+---------+--------+-----------------+----------------------------+

これでカレントディレクトリに /etc/hosts のコピーが作成される。

リストアを行うコマンドもある。

sudo hostctl restore --from ./hosts.20220307

行の追加

構文

sudo hostctl add domains プロファイル名 ドメイン名(スペース区切りで1個以上)

$ sudo hostctl add domains my-app my-server-1 my-server-2
[✔] Domains 'my-server-1, my-server-2' added.

+---------+--------+-----------+-------------+
| PROFILE | STATUS |    IP     |   DOMAIN    |
+---------+--------+-----------+-------------+
| my-app  | on     | 127.0.0.1 | my-server-1 |
| my-app  | on     | 127.0.0.1 | my-server-2 |
+---------+--------+-----------+-------------+

$ cat /etc/hosts
## ... 省略 ...
## profile.on my-app
127.0.0.1 my-server-1
127.0.0.1 my-server-2
## end

ファイルからまとめて入力することができる。

$ cat .etchosts
127.0.0.1       my-server-42
127.0.0.1       my-server-43

$ sudo hostctl add my-app < .etchosts
+---------+--------+-----------+--------------+
| PROFILE | STATUS |    IP     |    DOMAIN    |
+---------+--------+-----------+--------------+
| my-app  | on     | 127.0.0.1 | my-server-42 |
| my-app  | on     | 127.0.0.1 | my-server-43 |
+---------+--------+-----------+--------------+

$ cat /etc/hosts
## ... 省略 ...
## profile.on my-app
127.0.0.1 my-server-42
127.0.0.1 my-server-43
## end

プロジェクトごとに使う設定が決まっているなら .etchosts を git 管理して、 npm の preinstall にこのコマンドを入れたりしても良いと思う。

行の削除

構文

sudo hostctl remove domains プロファイル名 ドメイン名(スペース区切りで1個以上)

$ sudo hostctl remove domains my-app my-server-1
[✔] Domains 'my-server-1' removed.

+---------+--------+-----------+-------------+
| PROFILE | STATUS |    IP     |   DOMAIN    |
+---------+--------+-----------+-------------+
| my-app  | on     | 127.0.0.1 | my-server-2 |
+---------+--------+-----------+-------------+

## cat /etc/hosts
## ... 省略 ...
## profile.on my-app
127.0.0.1 my-server-2
## end

プロファイルをまるごと削除することもできる。

構文

sudo hostctl remove プロファイル名

$ sudo hostctl remove my-app
[✔] Profile(s) 'my-app' removed.

プロファイルを一つしか扱わないなら、こういうエイリアスを設定しておくのも便利。

alias domainadd='sudo hostctl add domain my-app'
domainadd foo

プロファイルの有効化と無効化

プロファイルごとに設定を一時的に無効化することができる。

操作前

$ sudo hostctl list
+----------+--------+-----------------+----------------------------+
| PROFILE  | STATUS |       IP        |           DOMAIN           |
+----------+--------+-----------------+----------------------------+
| default  | on     | 127.0.0.1       | localhost                  |
| default  | on     | 255.255.255.255 | broadcasthost              |
| default  | on     | ::1             | localhost                  |
| default  | on     | 127.0.0.1       | kubernetes.docker.internal |
+----------+--------+-----------------+----------------------------+
| my-app-1 | on     | 127.0.0.1       | my-server-1                |
+----------+--------+-----------------+----------------------------+
| my-app-2 | on     | 127.0.0.1       | my-server-1                |
+----------+--------+-----------------+----------------------------+

無効化

$ sudo hostctl disable my-app-1
+----------+--------+-----------+-------------+
| PROFILE  | STATUS |    IP     |   DOMAIN    |
+----------+--------+-----------+-------------+
| my-app-1 | off    | 127.0.0.1 | my-server-1 |
+----------+--------+-----------+-------------+

$ cat /etc/hosts
## ... 省略 ...
## profile.off my-app-1
## 127.0.0.1 my-server-1    ## ここがコメントアウトされてる
## end

## profile.on my-app-2
127.0.0.1 my-server-1
## end

有効化

$ sudo hostctl enable my-app-1
+----------+--------+-----------+-------------+
| PROFILE  | STATUS |    IP     |   DOMAIN    |
+----------+--------+-----------+-------------+
| my-app-1 | on     | 127.0.0.1 | my-server-1 |
+----------+--------+-----------+-------------+


$ cat /etc/hosts
## ... 省略 ...
## profile.off my-app-1
127.0.0.1 my-server-1
## end

## profile.on my-app-2
127.0.0.1 my-server-1
## end

一時的なプロファイルを作る

プロファイルとドメインを作成 → 他の作業 → プロファイルを削除というフローがあるなら、add コマンドに --wait 0 オプションを使うのが良い。 これを使うと /etc/hosts を更新した後にキー入力を受け付ける状態になって、 Ctrl+c を押すと /etc/hosts がコマンド実行前の状態に戻る。

$ sudo hostctl add domains my-tmp my-server-1 --wait 0
[✔] Domains 'my-server-1' added.

+---------+--------+-----------+-------------+
| PROFILE | STATUS |    IP     |   DOMAIN    |
+---------+--------+-----------+-------------+
| my-tmp  | on     | 127.0.0.1 | my-server-1 |
+---------+--------+-----------+-------------+

[ℹ] Waiting until ctrl+c to remove domains from profile 'my-tmp, my-server-1'


^C
[✔] Profile 'my-tmp' removed.

キー入力をせずに一定時間後に削除して良いなら --wait0 以外の値を渡せば良い。 sudo hostctl add domain my-tmp my-server-1 --wait 60 を実行すると60秒間だけ my-server-1 というホスト名が使える状態になり、60秒後にそれが使えなくなる。