感谢支持
我们一直在努力

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,并对它输入字符串。

定时机制:


定时运行机制,还是使用Launch daemon来完成的好。


问题的关键就是使用Launch服务提供的定时执行的参数,StartCalendarInterval,定义好自己使用的时间。


下面是一个例子:



  1. <?xml version=“1.0” encoding=“UTF-8”?>  

  2. <!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>  

  3. <plist version=“1.0”>  

  4. <dict>  

  5.     <key>StartCalendarInterval</key>  

  6.     <dict>  

  7.         <key>Minute</key>  

  8.         <integer>54</integer>  

  9.         <key>Hour</key>  

  10.         <integer>9</integer>  

  11.     </dict>  

  12.     <key>UserName</key>  

  13.     <string>root</string>  

  14.     <key>Label</key>  

  15.     <string>edu.ts.AutoLogin</string>  

  16.     <key>ProgramArguments</key>  

  17.     <array>  

  18.         <string>/Library/Adminscripts/AutoLogin.sh</string>  

  19.     </array>  

  20.     <key>LaunchOnlyOnce</key>  

  21.     <false/>  

  22.     <key>RunAtLoad</key>  

  23.     <false/>  

  24.     <key>ServiceDescription</key>  

  25.     <string>Auto Login Test</string>  

  26. </dict>  

  27. </plist>  

实际环境:


实际环境中,可能遇到很多问题,使得上面的脚本无法正常运行。下面时比较常见的两个:


屏幕保护程序: 如果在执行上面的脚本时,屏幕保护程序在运行,那么它会吃掉部分字符。


登录窗口:登录窗口需要是显示用户名和密码,不是用户列表。(Display login window as Name and password);其次,当前光标应该在Username处,否则也是不工作。


所以,处理好这些”意外”是保证脚本顺利成功的条件。最简单的方法就是设置好后重新启动电脑。


安全问题:


因为该脚本中使用明码,所以可能导致安全隐患。


其它方法:


另外一个可能的方法是,在一台机器上设置好自动登录后,得到/etc/kcpassword文件,里面的密码是加密的,然后设置com.apple.loginwidnow中的autoLoginUser,这样可以让系统在重新启动后自动登录,把所有这些打成pkg包,使用一个方式定时发布到客户端。


在此感谢Mike Lynn的帮助


Tony Liu

赞(0) 打赏
转载请注明出处:服务器评测 » OS X: 用脚本定时登录Mac电脑
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏