AppleScriptでmkpasswd

  • 投稿日:
  • by
  • カテゴリ:

Linuxにはmkpasswdというコマンドがあって、パスワードが必要な時はコマンドを叩くとか、パイプで渡してやれば良いのだけど、MacOS Xだとpwgenとか入れないといけないらしい。しかも生成したパスワードをターミナルで選択してコピペするのは、ちょっとどうなんだろ?ということでAppleScriptで実装してみた。
Automaterで「サービス」を開いて「AppleScriptを実行」をドラッグ&ドロップし、中身を以下のAppleScriptコードにして[名前]を付けて保存すると、[サービス]メニューに[名前]が現れるので、任意のテキストフィールドでサービスを実行、あるいはキーボードショートカットをシステム環境設定で設定しておけば、キーボードショートカットでパスワードが入力される、と。
これでパスワードを設定する時にさぼらないで、強固なパスワードを使いやすくなるかなぁ。
入力したパスワードは****とかで置き換えられると分からなくなるので、クリップボードに保存される仕様。
あと、入力値のチェックとかしてないので、そこはよろしく。



on delItem of theList at n
	if n ≤ 1 then
		return (rest of theList)
	else if n ≥ number of theList then
		return (items 1 thru -2 of theList)
	else
		return (items 1 thru (n - 1) of theList) & (items (n + 1) thru -1 of theList)
	end if
end delItem

on mkpasswd(theLength, numOfUpperAlphas, numOfLowerAlphas, numOfDigits, numOfSigns)
	set upperAlphas to "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	set lowerAlphas to "abcdefghijklmnopqrstuvwxyz"
	set digits to "1234567890"
	set signs to "`~!@#$%^&*()_+-=[]>?;:'"
	
	set numOfLowerAlphas to theLength - (numOfUpperAlphas + numOfDigits + numOfSigns)
	
	set pw to {}
	repeat numOfLowerAlphas times
		set end of pw to some item of lowerAlphas
	end repeat
	repeat numOfUpperAlphas times
		set end of pw to some item of upperAlphas
	end repeat
	repeat numOfDigits times
		set end of pw to some item of digits
	end repeat
	repeat numOfSigns times
		set end of pw to some item of signs
	end repeat
	
	set res to {}
	repeat theLength times
		set pos to random number from 1 to (length of pw)
		set end of res to item pos of pw
		set pw to delItem of pw at pos
	end repeat
	return (res as string)
end mkpasswd

delay 0.2
tell application "System Events"
	set front_app to name of (path to frontmost application)
end tell

set userCanceled to false

set thePrompt to "Please input the length of password:"
try
	set dialogResult to display dialog thePrompt buttons {"OK"} default answer "8"
on error number -128
	set userCanceled to true
end try

if userCanceled = false then
	set theLength to text returned of dialogResult as integer
	set pw to my mkpasswd(theLength, 2, 2, 2, 1)
	set the clipboard to pw
	tell application front_app
		activate
		tell application "System Events" to keystroke "v" using command down
	end tell
end if