大家知道有时为了管理/测试方便,比如测试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定时登录需求:
如果需求是无人职守地定时让系统自动登录,以便进行特定的管理操作,那么上面的代码无法执行。而为什么ARD可以成功呢?因为,在你从ARD发送Unix命令的时候,选择了用户root,也就是说使用root的用户环境来执行该命令。
因为普通的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这样就可以在无人登录的时候访问LoginWindow,并对它输入字符串。