私はパスワードやトークンなどを 1Password に保存しています。これらを環境変数として利用したい場合、クリップボードにコピーして setexport して環境変数にセットするか、頻繁に利用するものであれば envchain を利用していました。

envchain はとても便利なのですが、私は Mac と Linux、それから Windows もたまに使っているため、 keychain や Gnome Keyring でそれぞれ保存するのが手間に思っていました。どうせ 1Password に保存しているので、そこから取得してしまえば良いと思い、 openv というツールを作りました。

GitHub - mrtc0/openv: A tool that uses the credentials stored in 1password as an environment variable.
A tool that uses the credentials stored in 1password as an environment variable....

1Password は公式で op という CLI ツールを配布しています。

Get started with 1Password CLI | 1Password Developer
Learn how to install and sign in to 1Password CLI, then get started with command...

CLI ツールがあるということは Web API があるのでしょうが、API へのエンドポイントは公式には提供されていないため、 openv ではこのop コマンドを内部で実行するようにしています。

やっていることは単純なので jq を駆使してシェルスクリプトで同等のことは実現できますが、 op コマンド単体では少し扱いにくいクレデンシャルの追加なども、より簡単に行えるように、一つのツールとして作りました。

年末に少し Rust を勉強していたのもあり、せっかくなので Rust で書いてみました。
Rust のお作法について曖昧なところがあるのでそこは目をつむってください。

使い方

op コマンドが必要になるので https://support.1password.com/command-line-getting-started/ を見てインストールして Sign in します。

このとき eval (op signin my) のように実行して OP_SESSION_* 環境変数をセットすることで、このセッションが切れるまではパスワードを入力することなくログインすることが可能になります。

本題の openv ですが、 Mac だと brew tap mrtc0/openv && brew instlal openv でインストールできます。それ以外の OS は バイナリをダウンロードするかcargo install openv でインストールできます。

以下は myenv という 1Password vault を作成し、そこにいくつかのクレデンシャルを追加、それを環境変数として利用する例です。

# op create vault <vault name> で 1Password vault を新規作成できる
$ op create vault myenv

# openv を使って myenv vault に `SECRET_TOKEN` と
# `HIDDEN_TOKEN` の2つのクレデンシャルを追加する
$ openv myenv create SECRET_TOKEN
myenv.SECRET_TOKEN> this-is-secret

$ openv myenv create HIDDEN_TOKEN
myenv.HIDDEN_TOKEN> this-is-hidden

# openv <vault name> list で、指定した vault 内のクレデンシャルを一覧できる
$ openv myenv list
HIDDEN_TOKEN
SECRET_TOKEN

# openv <vault name> get で、指定した vault 内のクレデンシャルが
# `NAME=VAULT` というフォーマットで出力される。
# env $(openv <vault name get>) で環境変数にセットして、後続のコマンドを実行できる
$ env $(openv myenv get) sh -c 'env | grep TOKEN'
SECRET_TOKEN=this-is-secret
HIDDEN_TOKEN=this-is-hidden

# -n オプションで vault 内の特定のクレデンシャルを指定できる。
# また `:` で区切ることでセットする環境変数名を指定できる。
# この場合は 1Password には `SECERT_TOKEN` という名前で保存されているクレデンシャルを
# `MY_ENV` としてセットできるようにする。
$ env $(openv myenv get -n SECRET_TOKEN:MY_ENV) sh -c 'echo $MY_ENV'
this-is-secret

# `-n` オプションは複数指定できる。
$ env $(openv myenv get -n SECRET_TOKEN:MY_ENV -n HIDDEN_TOKEN) sh -c 'echo $MY_ENV $HIDDEN_TOKEN'
this-is-secret this-is-hidden

ざっとこんな感じで、自分が使う分には特に困らないかなという状態です。

個人の方は Vault を分けずに運用している方が多い(?)かもしれませんが、その場合は、おそらく Personal Vault に登録されているので、 openv Personal get -n ... のような形で利用できると思います。

補完

あのパスワードやトークンってなんて名前で登録しているんだっけ?となるケースがあるので fish のみですが completions を用意しました。これを利用することで、vault 名やクレデンシャル名も補完できるようになります。

GitHub - mrtc0/fish-openv-completions: fish completions for openv
fish completions for openv. Contribute to mrtc0/fish-openv-completions developme...

まとめ

私個人のユースケースでは十分なのですが、もし他に欲しい機能などがあれば issue なり PR なりください。