如何通过SSH引导Mac图形登录?loginwindow
在Mac OS X上以SSH身份通过SSH远程登录时,是否有办法通过运行命令来使进程启动用户会话?
当机器处于登录窗口(当前没有用户登录)时,我希望它打开用户的会话,就像单击用户名并输入密码一样。
不使用脚本编写GUI的解决方案是高度首选的,但是对于使用该路线的用户来说,此Apple KB页面可能会吸引他们。
如何通过SSH引导Mac图形登录?loginwindow
在Mac OS X上以SSH身份通过SSH远程登录时,是否有办法通过运行命令来使进程启动用户会话?
当机器处于登录窗口(当前没有用户登录)时,我希望它打开用户的会话,就像单击用户名并输入密码一样。
不使用脚本编写GUI的解决方案是高度首选的,但是对于使用该路线的用户来说,此Apple KB页面可能会吸引他们。
Answers:
不知道密码会使事情变得复杂,但是解决方案可能是:是否可以暂时清除用户的密码?(然后将其重置为以前的状态。)
首先:
首先,显示登录窗口。只需注销当前用户,使用快速用户切换或使用SSH:
cd“ /系统/库/ CoreServices /附加菜单/User.menu/Contents/资源/” 须藤./CGSession -suspend
或者,立即切换到特定用户,这可能会显示登录窗口(这突然在我的10.5 Leopard上不再起作用):
sudo ./CGSession -switchToUserID 501
现在显示的内容在一定程度上取决于“系统偏好设置”,但是我们假设它是用户的图标及其名称。要激活名称,我们必须输入前几个字母。然后,在返回后,将显示密码提示。或者,可以选择任何名称(例如通过按向下箭头键),然后按Option-Return键,提示输入任何用户名及其密码。我不知道该如何显示显示的屏幕,但让我们将其保存以备后用...
因此,要选择第一个(随机)用户名,然后按Option-Return键,键入一个特定的用户名,单击Return键,然后输入密码:
sudo osascript -e'告诉应用“系统事件” 关键代码125 使用选项向下键返回按键 按键“用户名” 延迟1.0 击键返回 延迟1.0 按键“密码” 延迟1.0 击键返回 结束告诉
上面显示了一些错误,据我所知这并不限制用法:
osascript [285]:3891612:(connectAndCheck)不受信任的应用程序不是 允许在登录前连接或启动Window Server。 _RegisterApplication(),无法建立默认的连接 WindowServer的_CGSDefaultConnection()为NULL。
或者,使用“ 通过Apple Remote Desktop通过登录窗口编写脚本”中特定于语言的脚本(也许有一天该站点上的注释将显示更好的解决方案):
告诉进程“ SecurityAgent” 将窗口1的组1的文本字段1的值设置为“用户名” 将窗口1的组1的文本字段2的值设置为“密码” 结束告诉 单击应用程序进程“ SecurityAgent”的窗口1中的“登录”按钮
但是主要的问题是:这仍然需要密码。但是:当用户输入空白密码时,显然不需要密码。实际上,对于空白密码,只需单击用户的图标即可。因此,如果使用AppleScript发送击键是可以接受的,那么可能剩下的“全部”就可以弄清楚了:
是否可以暂时清空用户的密码,以允许在不知道该密码的情况下启动(或恢复)会话?
可以使AppleScript防错吗?喜欢:
stat -f%Su /dev/console
会有所帮助,因为这root
会在显示登录窗口时显示)(测试注意事项:使用“屏幕共享”时,似乎设置了首选项。控制计算机时:仅在显示登录窗口时或用户成功登录后,“加密密码和击键”也将保留连接。使用“加密所有网络”时)数据,那么每次显示登录名或切换用户时,Mac都需要重新建立屏幕共享连接。)
sudo osascript -e 'tell app "System Events" to keystroke "password" & return'
。在锁定屏幕的情况下,输入管理用户名和密码将恢复其他用户的会话。但是,如何在不知道密码的情况下为任何用户启动会话?(请确定,如果您知道密码:另一个解决方法可能是“屏幕共享”,它也适用于登录屏幕。在启动或恢复特定的用户会话后,您需要重新连接“屏幕共享”。)
su
在命令提示符下一样,但是随后是GUI会话。或者就像屏幕锁定时一样,在其中输入管理用户名和密码会恢复其他用户的会话。)
我最近一直在对此进行调查。
将其放入应用程序的PAM堆栈中,或使用sshd进行测试:
session required pam_launchd.so launchd_session_type=Aqua
这对于使您获得非常接近已关闭用户会话的图形会话大有帮助。特别是,它在正确的引导程序名称空间中,并且具有正确的引导程序端口(我认为)。您可以检查源中pam_launchd的作用;它使用看起来合理的私有库(libvprop中的vproc_priv.h函数)调用Mach例程来设置端口和名称空间。它与Apple为Mach派生的系统调用提供的所有(有限)文档相匹配。
接下来,您需要将您的审核用户ID设置为使用BSM API的用户的ID,否则登录窗口将不会在Lion上与您对话。
如果您选中“ launchctl blist”,则该会话现在看起来非常接近已关闭的会话,并且某些流程和服务很好地实现了(例如粘贴板等)。实际上,除Finder和loginwindow之外的所有东西都在运行。但是,直到loginwindow运行之前,您才能启动图形应用程序,并且每个会话的loginwindow进程始终作为全局实例的直接子代产生。如何在新会话中拨入loginwindow进程以启动新的loginwindow?我找不到找到最后一块的方法!
感谢您完成此答案的任何帮助。
使用sudo运行命令可让您将脚本设置为标准用户不可读。这并不完美,但是如果您的管理员用户已经受到威胁,那么游戏结束了!
chmod ur脚本名
我的脚本如下所示,当一个用户已经在运行时,它可以远程运行,以通过SSH切换到另一个用户(在Snow Leopard 10.6.3上进行了测试):
#!/bin/bash
#go to login window
/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -switchToUserID 503
osascript -e 'tell app "System Events"
keystroke "password"
delay 1.0
keystroke return
end tell'
exit
我需要将同一用户登录到25个不同的工作站中,以便进行软件更新。即使使用sudo特权,我也无法从SSH会话可靠地运行'osascript -e ...'命令。但是,我可以通过Apple Remote Desktop运行它。如果您患有ARD:
我很高兴能在不到一分钟的时间内找到所有25个运行Finder的Mac Mini。重申一下,使用ARD,您不必在每台计算机上都输入sudo密码。您需要粘贴到命令对话框中的行是(替换为有效的用户名和密码):
osascript -e 'tell app "System Events"
key code 125
keystroke return using option down
keystroke "the username"
delay 1.0
keystroke return
delay 1.0
keystroke "the password"
delay 1.0
keystroke return
end tell'