OS X: 用脚本定时登录Mac电脑

远程登录:

大家知道有时为了管理/测试方便,比如测试AD用户登录配置是否正确,需要登录到众多电脑上,使用下面的代码可以通过ARD等方式,使远程电脑自动登录到指定的用户username。

  1. osascript <<EOT   
  2. tell application "System Events" to keystroke "$username"   
  3. tell application "System Events" to delay 2   
  4. tell application "System Events" to keystroke tab   
  5. tell application "System Events" to delay 2   
  6. tell application "System Events" to keystroke "$password"   
  7. tell application "System Events" to delay 2   
  8. tell application "System Events" to keystroke return   
  9. EOT 

定时登录需求:

如果需求是无人职守地定时让系统自动登录,以便进行特定的管理操作,那么上面的代码无法执行。而为什么ARD可以成功呢?因为,在你从ARD发送Unix命令的时候,选择了用户root,也就是说使用root的用户环境来执行该命令。

因为普通的Unix命令无法访问GUI程序的安全环境/名字空间,除非在执行该GUI程序的相同用户环境里。如果需要使用脚本的方式在无用户登录的时候,访问LoginWindow,就需要使用特殊的命令。

重写脚本:

launchctl bsexec <PID> <command and args>命令就是通过该进程的PID,使用其它的用户环境执行后面的命令。

于是可以将上面的命令改写如下:

  1. #!/bin/sh    
  2. USERNAME="username"  
  3. PASSWORD="passsword"   
  4.   
  5. logger "AutoLogin Start…."  
  6. sleep 3  
  7.   
  8. PID=`ps -ax | grep loginwindow.app | grep -v grep | tail -n 1 | awk '{print $1}'`   
  9.   
  10. launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke \"\""   
  11. launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke \"$USERNAME\""   
  12. sleep 2   
  13. launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke return"   
  14. sleep 2   
  15. launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke \"$PASSWORD\""   
  16. sleep 2   
  17. launchctl bsexec $PID osascript -e "tell application \"System Events\" to keystroke return"   
  18.   
  19. logger "AutoLogin End…."  
  20. exit 0  

这样就可以在无人登录的时候访问LoginWindow,并对它输入字符串。

相关推荐