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件を表示する。パスワードを表示するオプションもあるが、この記事では使わない。