遠程登錄:
大家知道有時為了管理/測試方便,比如測試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,並對它輸入字符串。