第 4 / 7 章
第 4 章

CLI 操作手冊:bw

這一章是給「想批次盤點」的人看的。只是要在網站上自動填密碼的人可以跳到第 5 章。

CLI 的價值只有一個:一次處理幾百筆。盤點、對帳、匯出加密備份 —— 這些在網頁版點到手痠的事,CLI 是一行指令。

代價是它有三個跟其他介面不同的規矩,不知道就會覺得「這東西壞了」。

開始前:確認你裝好了

各平台的安裝方式不同(npm、各發行版套件、Homebrew、Windows 安裝檔都有),本文不指定安裝步驟 —— 裝法會變,但驗證方法不會變:

Bash
bw --version

有版本號就是裝好了。本文寫作時實測的版本是 2026.10.0。

五個指令走完一輪

Bash
# 1) 登入:會問 email、主密碼;有開 2FA 的話再問 6 位碼
bw login

# 2) 解鎖:把 session key 收進環境變數,畫面不印出金鑰
export BW_SESSION=$(bw unlock --raw)

# 3) 確認狀態:要看到 "status":"unlocked"
bw status --session "$BW_SESSION"

# 4) 同步:抓下其他介面(例如網頁版)剛剛改動的資料
bw sync --session "$BW_SESSION"

# 5) 收工:把 session 變數清掉
unset BW_SESSION

三個一定會踩到的點:

① 登入跟解鎖是兩件事。 bw login 只建立登入狀態;要能讀寫資料還要 unlock。
② 每個終端各自 unlock。 開第二個 terminal,BW_SESSION 不存在,要重新 unlock。
③ 你註冊在 EU 區的話,先指到 EU 端點。 否則會看到莫名的登入失敗:

Bash
bw config server https://vault.bitwarden.eu

安全規則(違反一條就等於把秘密搬回明文)

最後那條值得展開一句:工具輸出會經過模型供應商的 API。bw get password 印出來的東西,一旦進了對話,就等於把明文密碼送出你的機器。

一個實用的對帳寫法

匯入之後,最想知道的兩件事是「總共幾筆」和「有沒有空密碼」。bw list items 吐 JSON,用一段小程式統計就好(輸出只有數字,不含任何密碼內容):

Bash
bw list items --session "$BW_SESSION" | python3 -c "
import sys, json
d = json.load(sys.stdin)
logins = [i for i in d if i.get('type') == 1 or str(i.get('type')) == 'login']
empty  = [i for i in logins if not (i.get('login') or {}).get('password')]
print('TOTAL:', len(d), '| logins:', len(logins), '| EMPTY password:', len(empty))
for i in empty: print('  -', i.get('name'))
"

為什麼要看 EMPTY password,而不是只看總數?

因為匯入時選錯格式的典型症狀是:總數完全正確,但每一筆的密碼欄都是空的。只看總數,你會以為搬成功了。

(type 欄位在新舊版 CLI 可能是數字 1 也可能是字串 login,上面的寫法兩種都吃。)

什麼時候不要用 CLI

  • 你只是要在網站上填密碼 → 用瀏覽器擴充
  • 你要匯入一個幾百筆的 CSV → 用網頁版的 Import,格式選單比 CLI 的 token 名稱好認太多

匯入這件事我在第 7 章會講清楚,包含選錯格式怎麼補救。