Induza o login gráfico do Mac a partir do SSH

15

Como faço para induzir o login gráfico do Mac a partir do SSH? Existe uma maneira de fazer com que o processo loginwindow inicie uma sessão de usuário executando um comando quando conectado remotamente via SSH como administrador no Mac OS X?

Quando a máquina está na janela de login (nenhum usuário está logado no momento), quero que ela abra a sessão de um usuário como se eu tivesse clicado no nome de usuário e inserido uma senha.

As soluções que não envolvem a criação de scripts na GUI são altamente preferidas, mas esta página da Apple KB pode ser de interesse para quem vai por esse caminho.

    
por Sophie Alpert 11.09.2009 / 01:17

4 respostas

4

Não saber a senha torna as coisas complicadas, mas talvez a solução seja: é possível apagar temporariamente a senha de um usuário? (E depois reconfigurá-la para o que era antes.)

Como um começo:

Primeiro, obtenha a janela de login para exibir. Basta desconectar o usuário atual, usar a troca rápida de usuário ou usar o SSH:

cd "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/"
sudo ./CGSession -suspend

Ou, para mudar imediatamente para um usuário específico, o que provavelmente mostrará a janela de login (isso de repente não funciona mais no meu 10.5 Leopard):

sudo ./CGSession -switchToUserID 501

O que é mostrado agora depende um pouco das Preferências do Sistema, mas vamos supor que sejam os ícones dos usuários e seus nomes. Para ativar um nome, teríamos que digitar as primeiras letras. Então, depois de Return, o prompt de senha é exibido. Alternativamente, pode-se selecionar qualquer nome (como pressionando a seta para baixo) e pressione Option-Return para ser solicitado para qualquer nome de usuário e sua senha. Eu não sei como se pode dizer qual tela é mostrada, mas vamos guardar isso para depois ...

Portanto, para selecionar o primeiro nome de usuário (aleatório) e pressione Option-Return, digite um nome de usuário específico, pressione Return e digite a senha:

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'

O texto acima mostra um erro que, até onde eu sei, não limita o uso:

osascript[285] : 3891612: (connectAndCheck) Untrusted apps are not 
    allowed to connect to or launch Window Server before login.
_RegisterApplication(), FAILED TO establish the default connection to
    the WindowServer, _CGSDefaultConnection() is NULL.

Como alternativa, use o script específico do idioma de " Script da janela de Login pelo Apple Remote Desktop " ( talvez um dia os comentários nesse site mostrem uma solução melhor):

tell process "SecurityAgent"
  set value of text field 1 of group 1 of window 1 to "the username"
  set value of text field 2 of group 1 of window 1 to "the password"
end tell
click button "Log In" of window 1 of application process "SecurityAgent"

Mas o problema principal é: isso ainda precisa da senha . No entanto: obviamente, nenhuma senha é necessária quando um usuário tem uma senha em branco. Na verdade, para senhas em branco basta clicar no ícone de um usuário para que seja necessário. Então, se o envio de pressionamentos de tecla usando o AppleScript é aceitável, então talvez "tudo" que resta para descobrir:

  • É possível apagar temporariamente a senha de um usuário para permitir iniciar (ou retomar) a sessão sem saber a senha ...?

  • Pode-se tornar o AppleScript à prova de erros? Como:

    • Como dizer se a janela de login está visível? (talvez stat -f%Su /dev/console possa ajudar, como isso produz root enquanto a janela de login é exibida)
    • Como identificar qual janela de login é exibida? (Como: um mostrando ícones e nomes de login, ou uma lista suspensa, ou talvez apenas um prompt de senha, se alguém selecionou para mudar para um usuário específico?)
    • Livre-se dos atrasos.
    • E essa mensagem de erro?

(Nota para testar: ao usar o Compartilhamento de tela, parece que definir a preferência Ao controlar computadores: Criptografar somente senhas e pressionamentos de teclas também mantém a conexão quando a janela de login é mostrada ou após um usuário Ao usar o Criptografar todos os dados da rede , meu Mac precisa restabelecer a conexão de compartilhamento de tela cada vez que um login for exibido ou um usuário for alternado.

    
por 13.09.2009 / 10:33
1

Eu tenho investigado isso recentemente.

Coloque isso na pilha PAM do seu aplicativo ou teste com sshd:

session    required       pam_launchd.so launchd_session_type=Aqua

Isso ajuda muito a obter uma sessão gráfica muito próxima a uma sessão de usuário comutada. Em particular, ele está no namespace de bootstrap correto e tem as portas de bootstrap corretas (eu acho). Você pode verificar a fonte para o que o pam_launchd faz; ele está usando uma biblioteca particular de aparência razoável (funções vproc_priv.h em libvprop) para chamar as rotinas Mach para configurar as portas e o namespace. Ele combina com todos os documentos (limitados) fornecidos pela Apple para os syscalls derivados de Mach.

Em seguida, você precisa definir seu ID de usuário de auditoria como o do usuário com a API do BSM, ou a janela de login não vai falar com você no Lion.

A sessão parece muito próxima de uma sessão comutada agora, se você marcar "launchctl blist", e alguns processos e serviços ganham vida (como a área de trabalho e assim por diante). Na verdade, tudo, exceto o Finder e a janela de login, está em execução. Até que a janela de login seja executada, não é possível iniciar um aplicativo gráfico, e o processo de login da sessão por sessão é sempre gerado como um filho direto do global. Como alguém cutuca o processo de login para iniciar uma nova janela de login na nova sessão? Não consigo encontrar uma maneira de colocar a última peça no lugar!

Qualquer ajuda para completar esta resposta recebida com gratidão.

    
por 29.01.2013 / 17:14
0

executar o comando com sudo permite que você defina o script como ilegível pelos usuários padrão. Não é perfeito, mas se o seu usuário administrador já está comprometido, o jogo acabou de qualquer maneira!

chmod u-r scriptname

meu script é assim, ele funciona remotamente quando um usuário já está em execução, para alternar para um segundo usuário via SSH (testado no 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
    
por 12.05.2010 / 09:25
0

Eu precisava registrar o mesmo usuário em 25 estações de trabalho diferentes para fazer uma atualização de software. Eu não era capaz de executar o comando 'osascript -e ...' de forma confiável a partir de sessões SSH, mesmo com privilégios sudo. Eu era, no entanto, capaz de executá-lo via Apple Remote Desktop. Se você tem ARD:

  1. selecione suas máquinas
  2. acorde-os e desconecte-os de outros usuários, se necessário
  3. escolha "Enviar comando UNIX ..." no menu "Gerenciar"
  4. cole o script de Arjan (omitindo a palavra 'sudo') na caixa de diálogo de comando
  5. selecione e insira "Executar comando como: Usuário: raiz"

Fiquei encantado em encontrar todos os 25 Mac Minis executando o Finder como o usuário, em menos de um minuto. Apenas para reiterar, com o ARD você não precisa digitar a senha do sudo em todas as máquinas. As linhas que você precisa colar no diálogo de comando são (substituindo um nome de usuário e senha válidos):

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'
    
por 23.09.2018 / 22:28