cappyzawa
cappyzawa
Sep 29 · 5 min read

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

cappyzawa/op-kv: command line tool for using op (https://support.1password.com/command-line/) like as key-value

以前紹介したツールをちょっと便利にした

それで得た学び、みたいな高尚なことは書いていない

モチベーション

PCのFキーが壊れてしまいまたも(社用)PC交換になってしまった。

そうだ、移行にあたり以前作った上記ツールを使おうと思ったのだが、コマンドを実行する前に必ずop signinを実行して、それで得られるSessionTokenを環境変数にセットする必要があり利用が億劫になった。(自分で作ったのに)

opのsignin

op sigin はsession tokenを得るコマンドである。

$ op signin <subdomain> <email> <secretKey>
Enter the password for <email> at <subdomain>.1password.com:
export OP_SESSION_<subdomain>="XXXXXXXXXXXXXXXXXX"
# This command is meant to be used with your shell's eval function.
# Run 'eval $(op signin <subdomain>)' to sign into your 1Password account.
# If you wish to use the session token itself, pass the --output=raw flag value.

ここで発行されたSessionTokenの有効期限は30分であり、それ以上時間が空いてしまうと、もう一回このsigninの手順を踏む必要がある

signinの実行後、$XDG_CONFIG_HOME/.op/configにsigninした情報が保持される。($XDG_CONFIG_HOMEが設定されていなければ$HOMEになる)

ちょっと便利にしたこと

上記の面倒な手順をなんとかスキップするのが今回の目的だ。

op cliをインストールして、一回でもsignin を実行するとconfigファイルが生成されるからそれを利用することにした。

{
"latest_signin": "<subdomain>",
"accounts": [
{
"shorthand": "<subdomain>",
"url": "https://<subdomain>.1password.com",
"email": "<email>",
"accountKey": "SECRETKEY",
"userUUID": "XXXXXXXXYYYYYYY"
}
]
}

上記のconfigにはunlockするためのmaster keyが入っていないが、特定の環境変数($OP_PASSWORD)を用意し、あとはデフォルトでlatest_signin に書かれているsubdomainにアクセスするようにした。

実際にはwrapper(op-kv)のサブコマンドを実行する前に都度signinをするようにし、op get ...など認証が必要なものはwrapper内部で--session フラグを持たせている

それと以前までjsonの絞り込みとしてjqを外部コマンドとして実行していたが、依存コマンドを減らしたかったからちゃんとgoのコードで処理するようにした。

インストール

go

$ go get -u github.com/cappyzawa/op-kv/cmd/op-kv

zdharma/zplugin: Flexible Zsh plugin manager with clean fpath, reports, completion management, turbo mode, services

$ zplugin ice lucid as"program" from"gh-r" \
has"op"
zplugin light cappyzawa/op-kv

以前までzplug/zplug: A next-generation plugin manager for zsh を使っていてとても好きだったけど、zpluginの方が開発が盛んそうだったから乗り換えてみた

今となってはかなりzpluginに依存している(dotfiles/zplugin.zsh at master · cappyzawa/dotfiles)

write

1passwordにパスワードを登録する

以前までパスワードしか登録できなかったが、今回ユーザ名も登録できるようにした

$ op-kv write testTable -u testUsername -p testPassword
success to write password (testPassword) and username (testUsername) to "testTable"

read

1passwordからパスワードを参照する

writeでユーザ名を登録できるようにしたからこちらでもユーザ名もみれるようにした(--table)

# 従来通りパスワードのみ参照
$ op-kv read testTable
testPassword%

# ユーザ名も一緒に参照(table形式)
$ op-kv read testTable --table
| USERNAME | PASSWORD |
-----------------------------------------------------------------------------------------------
| testUsername | testPassword |

cappyzawa
Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade