cappyzawa/op-kv: command line tool for using op like as key-value
tl;dr
- 1Password command-line tool: Full documentationを便利に扱うCLIを作った
- 上記CLIをkey-valueライクにread/writeすることができる。
Motivation
今更だけどdotfileをちゃんと実装してみようという気になった。
そこで自分の .zshrc
を改めて確認したらTokenがベタ打ちされているものが結構あった。 このままではGitHubにあげることができない。
このTokenたちを全部ファイルにあげてどこかに置いておくか。。。?
とも考えたが、それだと参照するのが面倒すぎる。
全部1つにまとめると読み取りが面倒だし、1つ1つ分けると次は書き込みが面倒だ。
自分のCredential管理は1Passwordに寄せているのでどうせ管理するならそこでしたい。
ただ、いちいちApp起動してして登録するのもなぁなんて考えているときに、1PasswordにCLIがあることを知った。
1Password command-line tool: Full documentation
これはいい!と思ったんだが、使い方がつらすぎる。
ユースケースとしては、CredentialのKey-Valueの登録が主だと思うのだが、それを実行するには以下を実行する必要がある。
ではmediumのAccessToken(XXXXXXXX
)を登録したいとする。
書き込み
$ D=$(op get template login | jq -c '.fields[1].value = XXXXXXXX' | op encode)
$ op create item login $D --title=MediumAccessToken
読み込み
$ op get item MediumAccessToken | jq -r '.details.fields[] | select(.designation=="password").value'
もっと簡単に気軽に上記のアクションをしたいということで実装した。
正直shellのfunctionでも実現できたと思うんだが、わざわざgolangで実装した。
理由は以下。
k8s, dockerなどでも使われているらしいので使ってみたかった
ライブラリを利用したCLIをgoで実装したことがなかった(-h
をよしなにしてくれるのいいなと思ってた)
- factoryチックなものをやってみたかった
テスタブルにするためmainからinterfaceを作成してDIしてたけど、main以外からも作成したくなった
factoryを導入するともmain以外からinterfaceを作成してもテストが可能になる
How to install
goが利用可能な場合
$ go get github.com/cappyzawa/op-kv/cmd/op-kv
goが利用できない場合
macの例
$ curl -sL https://github.com/cappyzawa/op-kv/releases/download/v1.0.0/op-kv-darwin-amd64 > op-kv
$ chmod +x op-kv
zplugを利用している場合
zplug "cappyzawa/op-kv", \
from:gh-r, \
as:command, \
rename-to:op-kv, \
on:"stedolan/jq", \
on:"cappyzawa/get-op"
便利だなzplug
How to use
$ op-kv -h
use "op" like as kv
Usage:
op-kv [flags]
op-kv [command]
Available Commands:
help Help about any command
read Display one password of specified item by UUID or name
write Generate one password by specified item and password
Flags:
-h, --help help for op-kv
Use "op-kv [command] --help" for more information about a command.
read/writeが利用できる。
ただ、執筆現在ではこのコマンドの利用前にop signin
しておく必要があり、ややUXが落ちる。
せめてsigninしてなかったらsigninを促すところまではやっておきたい(TBD)
write
これの代替
$ D=$(op get template login | jq -c '.fields[1].value = XXXXXXXX' | op encode)
$ op create item login $D --title=MediumAccessToken$ op-kv read -h
$ op-kv write -h
Generate one password by specified item and password
Usage:
op-kv write <item> <password> [flags]
Flags:
-h, --help help for write
先ほどの例だと以下のようになる。
$ op-kv write MediumAccessToken XXXXXXXX
success to write password!!
read
これの代替
$ op get item MediumAccessToken | jq -r '.details.fields[] | select(.designation=="password").value'$ op-kv read -h
Display one password of specified item by UUID or name
Usage:
op-kv read [<UUID>|<name>] [flags]
Flags:
-h, --help help for read
先ほどの例だと以下のようになる。
$ op-kv read MediumAccessToken
XXXXXXXX