大家知道有时为了管理/测试方便,比如测试AD用户登录配置是否正确,需要登录到众多电脑上,使用下面的代码可以通过ARD等方式,使远程电脑自动登录到指定的用户username。
osascript <<EOT
tell application "System Events" to keystroke "$username"
tell application "System Events" to delay 2
tell application "System Events" to keystroke tab
tell application "System Events" to delay 2
tell application "System Events" to keystroke "$password"
tell application "System Events" to delay 2
tell application "System Events" to keystroke return
EOT
因为普通的Unix命令无法访问GUI程序的安全环境/名字空间,除非在执行该GUI程序的相同用户环境里。如果需要使用脚本的方式在无用户登录的时候,访问LoginWindow,就需要使用特殊的命令。
launchctl bsexec <PID> <command and args>命令就是通过该进程的PID,使用其它的用户环境执行后面的命令。
于是可以将上面的命令改写如下:
#!/bin/sh USERNAME="username" PASSWORD="passsword" logger "AutoLogin Start…." sleep 3 PID=`ps -ax | grep loginwindow.app | grep -v grep | tail -n 1 | awk '{print $1}'` launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke \"\"" launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke \"$USERNAME\"" sleep 2 launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke return" sleep 2 launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke \"$PASSWORD\"" sleep 2 launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke return" logger "AutoLogin End…." exit 0
定时运行机制,还是使用Launch daemon来完成的好。
问题的关键就是使用Launch服务提供的定时执行的参数,StartCalendarInterval,定义好自己使用的时间。
下面是一个例子:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>StartCalendarInterval</key> <dict> <key>Minute</key> <integer>54</integer> <key>Hour</key> <integer>9</integer> </dict> <key>UserName</key> <string>root</string> <key>Label</key> <string>edu.ts.AutoLogin</string> <key>ProgramArguments</key> <array> <string>/Library/Adminscripts/AutoLogin.sh</string> </array> <key>LaunchOnlyOnce</key> <false/> <key>RunAtLoad</key> <false/> <key>ServiceDescription</key> <string>Auto Login Test</string> </dict> </plist>
实际环境中,可能遇到很多问题,使得上面的脚本无法正常运行。下面时比较常见的两个:
所以,处理好这些"意外"是保证脚本顺利成功的条件。最简单的方法就是设置好后重新启动电脑。
因为该脚本中使用明码,所以可能导致安全隐患。
另外一个可能的方法是,在一台机器上设置好自动登录后,得到/etc/kcpassword文件,里面的密码是加密的,然后设置com.apple.loginwidnow中的autoLoginUser,这样可以让系统在重新启动后自动登录,把所有这些打成pkg包,使用一个方式定时发布到客户端。
在此感谢Mike Lynn的帮助
Tony Liu