从SSH引导Mac图形登录


16

如何通过SSH引导Mac图形登录?loginwindow在Mac OS X上以SSH身份通过SSH远程登录时,是否有办法通过运行命令来使进程启动用户会话?

当机器处于登录窗口(当前没有用户登录)时,我希望它打开用户的会话,就像单击用户名并输入密码一样。

不使用脚本编写GUI的解决方案是高度首选的,但是对于使用该路线的用户来说,此Apple KB页面可能会吸引他们。

Answers:


4

不知道密码会使事情变得复杂,但是解决方案可能是:是否可以暂时清除用户的密码?(然后将其重置为以前的状态。)

首先:

首先,显示登录窗口。只需注销当前用户,使用快速用户切换或使用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都需要重新建立屏幕共享连接。)


这是一个好的开始,但是有两个问题。首先,如果您在登录窗口(我想要的)不起作用,并且要求输入密码,但我希望密码不正确。由于它是root用户,它应该能够在没有密码的情况下切换用户。
苏菲·阿尔珀特

啊哈 我什至不知道坐在计算机本身上时如何以其他用户身份登录,因此没有雪茄sudo osascript -e 'tell app "System Events" to keystroke "password" & return'。在锁定屏幕的情况下,输入管理用户名和密码将恢复其他用户的会话。但是,如何在不知道密码的情况下为任何用户启动会话?(请确定,如果您知道密码:另一个解决方法可能是“屏幕共享”,它也适用于登录屏幕。在启动或恢复特定的用户会话后,您需要重新连接“屏幕共享”。)
Arjan

很好 不过,我更喜欢无需手动模拟按键的解决方案。
苏菲·阿尔珀特

2
我想知道是否有人知道如何为其他人开始会议。因此,在不考虑上述答案的情况下,仅在Mac OS X的日常使用中:管理员可以在不知道该用户密码的情况下以其他用户身份登录吗?(就像su在命令提示符下一样,但是随后是GUI会话。或者就像屏幕锁定时一样,在其中输入管理用户名和密码会恢复其他用户的会话。)
Arjan

也许没有AppleScript击键就不可能做到这一点:docs.info.apple.com/article.html?path=RemoteDesktop/3.0/en/…
Sophie Alpert

1

我最近一直在对此进行调查。

将其放入应用程序的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?我找不到找到最后一块的方法!

感谢您完成此答案的任何帮助。


0

使用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

0

我需要将同一用户登录到25个不同的工作站中,以便进行软件更新。即使使用sudo特权,我也无法从SSH会话可靠地运行'osascript -e ...'命令。但是,我可以通过Apple Remote Desktop运行它。如果您患有ARD:

  1. 选择你的机器
  2. 唤醒他们,然后将其注销(如果需要)
  3. 从“管理”菜单中选择“发送UNIX命令...”
  4. 将Arjan的脚本(省略单词“ sudo”)粘贴到命令对话框中
  5. 选择并输入“运行命令为:用户:root”

我很高兴能在不到一分钟的时间内找到所有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'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.