1PasswordのCLI(op)をkey-value likeに扱えるツールを作った

cappyzawa
6 min readFeb 16, 2019

--

cappyzawa/op-kv: command line tool for using op like as key-value

tl;dr

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

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

Usage

$ 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

--

--