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


16

Como induzir o login gráfico do Mac a partir do SSH? Existe uma maneira de fazer o loginwindowprocesso iniciar uma sessão do 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á conectado no momento), quero que ela abra a sessão de um usuário como se eu tivesse clicado no nome de usuário e digitado uma senha.

As soluções que não envolvem o script da GUI são altamente preferidas, mas esta página da Apple KB pode ser de interesse para aqueles que seguem esse caminho.

Respostas:


4

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

Para começar:

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

cd "/ Sistema / Biblioteca / CoreServices / Menu Extras / User.menu / Conteúdo / Recursos /"
sudo ./CGSession -suspend

Ou, para mudar imediatamente para um usuário específico, o que provavelmente mostrará a janela de login (de repente, isso 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 assumir que são os ícones dos usuários e seus nomes. Para ativar um nome, teríamos que digitar as primeiras letras. Depois, após Return, o prompt de senha é exibido. Alternativamente pode-se seleccionar qualquer nome (como pressionando seta para baixo) e pressione Option-Return to ser solicitado tanto 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 mais tarde ...

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"
  código chave 125
  retorno de tecla usando a opção para baixo
  pressionamento de tecla "o nome de usuário"
  atraso 1.0
  retorno de pressionamento de tecla
  atraso 1.0
  pressionamento de tecla "a senha"
  atraso 1.0
  retorno de pressionamento de tecla
dizer final '

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

osascript [285]: 3891612: (connectAndCheck) Aplicativos não confiáveis ​​não são 
    permissão para conectar ou iniciar o Windows Server antes do login.
_RegisterApplication (), FAILED TO estabelecer a conexão padrão para
    o WindowServer, _CGSDefaultConnection () é NULL.

Alternativamente, use o script específico do idioma da " Script A janela de login através da Apple Remote Desktop " (talvez um dia os comentários em que o site irá mostrar uma melhor solução):

informe o processo "SecurityAgent"
  defina o valor do campo de texto 1 do grupo 1 da janela 1 como "o nome de usuário"
  defina o valor do campo de texto 2 do grupo 1 da janela 1 como "a senha"
fim de contar
clique no botão "Log In" da janela 1 do processo de inscrição "SecurityAgent"

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

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

  • Alguém pode fazer o AppleScript à prova de erro? Gostar:

    • Como saber se a janela de login está visível? (talvez stat -f%Su /dev/consolepossa ajudar, pois isso geraroot enquanto a janela de login é exibida)
    • Como saber qual janela de login é mostrada? (Como: um mostrando ícones e nomes de login, ou uma lista suspensa, ou talvez apenas uma solicitação de senha, se alguém selecionou mudar para um usuário específico?)
    • Livre-se dos atrasos.
    • E a mensagem de erro?

(Uma observação para o teste: ao usar o Compartilhamento de tela, parece que definir a preferência Ao controlar computadores: Criptografar senhas e pressionamentos de tecla também retém a conexão quando a janela de login é exibida ou após um usuário ter efetuado login com êxito. Ao usar Criptografar todas as redes dados , meu Mac precisa restabelecer a conexão de compartilhamento de tela cada vez que um login é exibido ou um usuário é trocado.)


Este é um bom começo, mas há dois problemas. Primeiro, ele não funciona se você estiver na janela de login, que é o que eu queria, e solicita uma senha, o que eu preferiria que não. Como é root, deve poder trocar de usuário sem a senha.
Sophie Alpert

Aha. Eu nem sei como fazer login como outro usuário quando estou sentado no computador, então nada de charuto sudo osascript -e 'tell app "System Events" to keystroke "password" & return'. Com a tela bloqueada, a inserção de um nome de usuário e senha administrativos retoma a sessão do outro usuário. Mas como iniciar uma sessão para qualquer usuário sem saber a senha? (Apenas para ter certeza, se você souber a senha: outra solução alternativa pode ser o compartilhamento de tela, que também funciona para a tela de login. Você precisará reconectar o compartilhamento de tela depois que uma sessão de usuário específica for iniciada ou retomada.)
Arjan

Isso é bom. Eu preferiria uma solução sem simular manualmente as teclas digitadas.
Sophie Alpert

2
Gostaria de saber se alguém sabe como iniciar uma sessão para outra pessoa. Portanto, sem considerar a resposta acima, apenas no uso diário do Mac OS X: um administrador pode fazer login como outro usuário, sem saber a senha do usuário? (Assim como suno prompt de comando, mas depois em uma sessão da GUI. Ou como quando a tela está bloqueada, onde é inserido um nome de usuário e senha administrativos. Retoma sessão do outro usuário.)
Arjan

Talvez não seja possível fazê-lo sem AppleScript keystroking: docs.info.apple.com/article.html?path=RemoteDesktop/3.0/en/...
Sophie Alpert

1

Estive investigando 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 bastante a obter uma sessão gráfica bastante próxima de uma sessão de usuário alternada. Em particular, ele está no espaço para nome correto do bootstrap e possui as portas de bootstrap corretas (eu acho). Você pode verificar a fonte para o que pam_launchd faz; está usando alguma biblioteca privada de aparência razoável (funções vproc_priv.h no libvprop) para chamar as rotinas Mach para configurar as portas e o espaço para nome. Ele corresponde a todos os documentos (limitados) que a Apple fornece para os syscalls derivados do Mach.

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

A sessão parece muito próxima de uma sessão alternada agora, se você marcar "launchctl blist", e alguns processos e serviços ganham vida agradável (como a área de transferência, etc.). De fato, tudo, exceto o Finder e a janela de login, está em execução. Até que a janela de login seja executada, você não pode iniciar um aplicativo gráfico e o processo de janela de sessão por sessão é sempre gerado como filho direto do global. Como se cutuca o processo da janela 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 concluir esta resposta foi recebida com gratidão.


0

executar o comando com sudo permite definir o script como ilegível para usuários padrão. Não é perfeito, mas se o seu usuário administrador já estiver comprometido, o jogo acabou de qualquer maneira!

chmod ur scriptname

meu script se parece com isso, funciona remotamente quando um usuário já está executando, 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

0

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

  1. selecione suas máquinas
  2. ativá-los e desconectá-los 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 digite "Executar comando como: Usuário: raiz"

Fiquei encantado ao encontrar todos os 25 Mac Minis executando o Finder como 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 na caixa de 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'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.