iCloud キーチェーンにlocal キーチェーンを大量にコピーしようとしたら
OSXのローカル・キーチェーンにあるパスワード変更を、iCloud キーチェーンにコピーししようとしたら
ダイアログが出てきます。
OSXのアカウント・パスワードを入力してEnter押せばいいんだけど。とてもとてもじゃないけど800件も押してられない。
どうしよう?自動化だ!
ということで、AppleScript(JavaScript)を使って、自動化することにした。
パスワード入力フォームの処理
keychain をコピーしようとして表示されるダイアログは、Keychains.app が SecurityAgent によりアクセス権を要求している処理になる。
なので、 SecurityAgent が出している画面です。
var my_password = "*PASSWORD*" var p = app.processes.byName("SecurityAgent") var w = p.windows.at(0) var pass = w.textFields.at(0) pass.value = my_password var btn = w.buttons[1] //常に許可 btn.click()
この処理で常に許可を押し続けることが出来る。
既存と重複項目があるとき
重複項目があるときにコピーを拒否される動作は、Keychain側でパスワードエントリの重複を検出している。
したがって、このエラーダイアログを処理するには
var app = Application("System Events") var p = app.processes.byName("Keychain Access") if ( p.windows.length > 1 ) { var w = p.windows.at(0) if (w.roleDescription() == "ダイアログ" ){ btn = w.buttons[0] if (btn.name() == "OK") { btn.click() } } }
このように、Keychainからダイアログのを探すことにした。
このふたつを組み合わせて
このふたつを組み合わせて、無限ループにしてやると、放っておくことで800件のKeychainの移動ができる。便利!
var app = Application("System Events") var my_password = "***********" var Sa = function (){ var p = app.processes.byName("SecurityAgent") try{ p.id() }catch(e){ return ; } if ( p.windows.length > 0 ) { var w = p.windows.at(0) var pass = w.textFields.at(0) pass.value = my_password var btn = w.buttons[1] btn.click() } } var Kc = function (){ var p = app.processes.byName("Keychain Access") try{ if ( p.windows.length > 0 ){ var w = p.windows.at(0) if (w.roleDescription() == "ダイアログ" ){ btn = w.buttons[0] if (btn.name() == "OK") { btn.click() } } } }catch(e){ return ; } } while(1){ delay(1.0) Sa() delay(1.0) Kc() delay(1.0) }
自動化はすばらしい
キーチェーンをコピーするだけで絶望してたのがなんとかなった。
security コマンドすらアクセス出来ない iCloud キーチェーンって使い勝手悪過ぎなんだよ。。。
>security コマンド
iCloudが使えれば最高なんだけど無理っぽいんですよね
takuya@~/Desktop$ security list-keychains "/Users/takuya/Library/Keychains/login.keychain" "/Library/Keychains/System.keychain"
ログインのユーザーごとのキーチェーンしか出てこない。。。。
ここに icloud がないから、UI自動化なんて面倒なことをやらないといけないんだよ。
昔は使えたのになぁ。