SMB共有やWebサイトなどに接続したときに保存した認証情報は、キーチェーンの「インターネットパスワード」として保存される。security dump-keychainの出力から、srvr(サーバー名)の行を取り出すと、パスワードを表示せずに、保存済みの接続先を一覧できる。
$ security dump-keychain | grep '"srvr"<blob>='
"srvr"<blob>="nas.local"
"srvr"<blob>="www.example.com"
接続ダイアログでパスワードが入力済みになる理由を調べたいときや、不要な接続情報が残っていないかを点検したいときに使える。実行例はmacOS 27.0.1のもの。サーバー名は例である。
パスワードは表示されない
dump-keychainは、オプションなしでは、項目の属性だけを出力する。パスワードの本体は出力に含まれない。
$ security dump-keychain | grep -c '^data:'
0
パスワードを復号して表示する-dオプションもあるが、この記事では使わない。
出力の構造を確認するために、インターネットパスワードの項目を1件だけ表示する。
$ security dump-keychain | grep -A25 -m1 '^class: "inet"'
class: "inet"
attributes:
0x00000007 <blob>=...
"acct"<blob>="alice"
...
"path"<blob>=<NULL>
"port"<uint32>=0x00000000
"prot"<blob>=<NULL>
"ptcl"<uint32>="smb "
...
"srvr"<blob>="nas.local"
"type"<uint32>=<NULL>
class: "inet"がインターネットパスワードを表す。主な属性は次のとおりである。
| 属性 | 内容 |
|---|---|
srvr | サーバー名 |
acct | アカウント名(ユーザー名) |
ptcl | プロトコル。smb 、afp 、htpsなど |
port | ポート番号。0x00000000は未指定 |
path | パス |
ptclの値は、4文字で表される。smb とafp は、末尾に空白が含まれる。
保存済みのサーバー名を重複なしで集計する
同じサーバーに複数のアカウントを保存していると、srvrの行が重複する。sort | uniq -cで、サーバーごとの件数を数える。
$ security dump-keychain | grep '"srvr"<blob>=' | sed 's/.*=//' | sort | uniq -c
1 "nas.local"
2 "www.example.com"
サーバー名、プロトコル、アカウントを表にして表示する
awkで、インターネットパスワードの項目ごとに、プロトコル、サーバー名、アカウント名を1行に並べる。
$ security dump-keychain | awk '
function val(line, v) { v = line; sub(/^[^=]*=/, "", v); gsub(/^"|" *$/, "", v); return v }
/^class: / { acct = ""; ptcl = "" }
/^ "acct"<blob>=/ { acct = val($0) }
/^ "ptcl"<uint32>=/ { ptcl = val($0) }
/^ "srvr"<blob>=/ { printf "%s\t%s\t%s\n", ptcl, val($0), acct }'
smb nas.local alice
htps www.example.com alice
htps www.example.com bob
属性は名前の昇順に出力される。acctとptclがsrvrより先に出力されるため、srvrの行で1行を出力している。
ptclで絞り込めば、SMB共有だけを確認できる。awkの出力をgrep '^smb'に渡す。
$ security dump-keychain | awk '...' | grep '^smb'
smb nas.local alice
16進数で表示される値を文字列に戻す
日本語など、ASCII以外の文字を含む値は、16進数で出力される。
$ security dump-keychain | grep '"acct"<blob>='
"acct"<blob>=0xE38386E382B9E38388
0xを除いた部分をxxd -r -pに渡すと、文字列に戻せる。
$ echo E38386E382B9E38388 | xxd -r -p
テスト
特定のサーバーの項目だけを表示する
security find-internet-password -sでサーバー名を指定すると、該当する項目の属性を表示できる。
$ security find-internet-password -s nas.local
keychain: "/Users/[ユーザー名]/Library/Keychains/login.keychain-db"
version: 512
class: "inet"
attributes:
...
"srvr"<blob>="nas.local"
...
見つからないときは、エラーが表示される。
$ security find-internet-password -s no-such-host.example
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
-rでプロトコルも指定できる。4文字のプロトコル名で、smb のように末尾の空白も含める。
$ security find-internet-password -r 'smb '
find-internet-passwordは、条件に一致する最初の1件を表示する。パスワードを表示するオプションもあるが、この記事では使わない。
