Induire une connexion graphique Mac à partir de SSH

16

Comment induire la connexion graphique Mac à partir de SSH? Existe-t-il un moyen de faire loginwindowdémarrer une session utilisateur par le processus en exécutant une commande lors de la connexion à distance via SSH en tant qu'administrateur sur Mac OS X?

Lorsque la machine est dans la fenêtre de connexion (aucun utilisateur n'est actuellement connecté), je veux qu'elle ouvre la session d'un utilisateur comme si j'avais cliqué sur le nom d'utilisateur et entré un mot de passe.

Les solutions qui n'impliquent pas de script de l'interface graphique sont hautement préférées, mais cette page Apple KB peut être intéressante pour ceux qui choisissent cette voie.

Sophie Alpert
la source

Réponses:

4

Ne pas connaître le mot de passe complique les choses, mais la solution est peut-être la suivante: est-il possible de masquer temporairement le mot de passe d'un utilisateur? (Et ensuite réinitialisez-le à ce qu'il était auparavant.)

Pour commencer:

Tout d'abord, affichez la fenêtre de connexion. Déconnectez-vous simplement de l'utilisateur actuel, utilisez le changement rapide d'utilisateur ou utilisez SSH:

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

Ou, pour passer immédiatement à un utilisateur spécifique, qui affichera probablement la fenêtre de connexion (cela ne fonctionne plus du tout sur mon Leopard 10.5):

sudo ./CGSession -switchToUserID 501

Ce qui est affiché maintenant dépend un peu des Préférences Système, mais supposons que ce soient les icônes des utilisateurs et leurs noms. Pour activer un nom, il faudrait taper les premières lettres. Ensuite, après Retour, l'invite de mot de passe s'affiche. Alternativement, on peut sélectionner n'importe quel nom (comme en appuyant sur la flèche vers le bas), puis appuyer sur Option-Retour pour être invité à la fois pour n'importe quel nom d' utilisateur et son mot de passe. Je ne sais pas comment on peut voir quel écran est affiché, mais gardons cela pour plus tard ...

Donc, pour sélectionner le premier nom d'utilisateur (aléatoire) et appuyez sur Option-Retour, tapez un nom d'utilisateur spécifique, appuyez sur Retour et tapez le mot de passe:

sudo osascript -e 'tell app "Événements système"
  code clé 125
  retour de frappe en utilisant l'option vers le bas
  frappe "le nom d'utilisateur"
  délai 1.0
  retour de frappe
  délai 1.0
  frappe "le mot de passe"
  délai 1.0
  retour de frappe
fin dire

Ce qui précède montre une erreur qui, pour autant que je sache, ne limite pas l'utilisation:

osascript [285]: 3891612: (connectAndCheck) Les applications non fiables ne sont pas 
    autorisé à se connecter ou à lancer Windows Server avant la connexion.
_RegisterApplication (), Échec de l'établissement de la connexion par défaut à
    le WindowServer, _CGSDefaultConnection () est NULL.

Alternativement, utilisez le script spécifique à la langue de " Script la fenêtre de connexion via Apple Remote Desktop " (peut-être qu'un jour les commentaires sur ce site montreront une meilleure solution):

dire au processus "SecurityAgent"
  définir la valeur du champ de texte 1 du groupe 1 de la fenêtre 1 sur "le nom d'utilisateur"
  définir la valeur du champ de texte 2 du groupe 1 de la fenêtre 1 sur "le mot de passe"
fin dire
cliquez sur le bouton "Connexion" de la fenêtre 1 du processus de candidature "SecurityAgent"

Mais le principal problème est: cela nécessite toujours le mot de passe . Cependant: aucun mot de passe n'est évidemment nécessaire lorsqu'un utilisateur a un mot de passe vide. En fait, pour les mots de passe vides, il suffit de cliquer sur l'icône d'un utilisateur. Donc, si l'envoi de touches à l'aide d'AppleScript est acceptable, alors peut-être "tout" ce qu'il reste à comprendre:

  • Est-il possible de masquer temporairement le mot de passe d'un utilisateur, pour permettre de démarrer (ou reprendre) la session sans connaître ce mot de passe ...?

  • Peut-on rendre l'AppleScript à l'abri des erreurs? Comme:

    • Comment savoir si la fenêtre de connexion est visible? (peut stat -f%Su /dev/consolepeut- être aider, car cela donne lieuroot pendant que la fenêtre de connexion est affichée)
    • Comment savoir quelle fenêtre de connexion est affichée? (Comme: une montrant des icônes et des noms de connexion, ou une liste déroulante, ou peut-être seulement une invite de mot de passe si quelqu'un a choisi de passer à un utilisateur spécifique?)
    • Débarrassez-vous des retards.
    • Et ce message d'erreur?

(Remarque pour les tests: lors de l'utilisation du partage d'écran, il semble que la définition de la préférence Lors du contrôle des ordinateurs: Chiffrer les mots de passe et les frappes ne conserve également la connexion que lorsque la fenêtre de connexion s'affiche ou après qu'un utilisateur s'est connecté avec succès. Lors de l'utilisation de Chiffrer tout le réseau données alors mon Mac a besoin de rétablir la connexion de partage d'écran à chaque fois qu'une connexion est affichée ou un utilisateur est activée).

Arjan
la source
C'est un bon début, mais il a deux problèmes. Tout d'abord, cela ne fonctionne pas si vous êtes dans la fenêtre de connexion, ce que je voulais, et il demande un mot de passe, ce que je préférerais ne pas. Comme il est root, il devrait pouvoir changer d'utilisateur sans mot de passe.
Sophie Alpert
Aha. Je ne sais même pas comment me connecter en tant qu'autre utilisateur lorsque je suis assis devant l'ordinateur lui-même, donc pas de cigare pour sudo osascript -e 'tell app "System Events" to keystroke "password" & return'. L'écran étant verrouillé, la saisie d'un nom d'utilisateur et d'un mot de passe administratifs reprend la session de l'autre utilisateur. Mais comment démarrer une session pour n'importe quel utilisateur sans connaître le mot de passe? (Juste pour être sûr, si vous connaissez le mot de passe: une autre solution peut être le partage d'écran, qui fonctionne également pour l'écran de connexion. Vous devrez reconnecter le partage d'écran après le démarrage ou la reprise d'une session utilisateur spécifique.)
Arjan
C'est bon. Je préférerais cependant une solution sans simuler manuellement les frappes.
Sophie Alpert du
2
Je me demande si quelqu'un sait comment démarrer une session pour quelqu'un d'autre. Donc, sans considérer la réponse ci-dessus, juste dans l'utilisation quotidienne de Mac OS X: un administrateur peut-il se connecter en tant qu'un autre utilisateur, sans connaître le mot de passe de cet utilisateur? (Tout comme suà l'invite de commande, mais ensuite pour une session GUI. Ou tout comme lorsque l'écran est verrouillé, où la saisie d'un nom d'utilisateur et d'un mot de passe administratifs reprend la session de l'autre utilisateur.)
Arjan
Il n'est peut-être pas possible de le faire sans la frappe AppleScript: docs.info.apple.com/article.html?path=RemoteDesktop/3.0/en/…
Sophie Alpert
1

J'ai enquêté sur cela récemment.

Mettez cela dans la pile PAM de votre application, ou testez avec sshd:

session    required       pam_launchd.so launchd_session_type=Aqua

Cela vous aidera grandement à obtenir une session graphique qui est assez proche d'une session utilisateur désactivée. En particulier, il est dans le bon espace de noms bootstrap et possède les ports de bootstrap corrects (je pense). Vous pouvez vérifier la source de ce que fait pam_launchd; il utilise une bibliothèque privée d'aspect raisonnable (fonctions vproc_priv.h dans libvprop) pour appeler les routines Mach pour configurer les ports et l'espace de noms. Il correspond à tous les documents (limités) qu'Apple fournit pour les appels système dérivés de Mach.

Ensuite, vous devez définir votre ID utilisateur d'audit sur celui de l'utilisateur avec l'API BSM, sinon la fenêtre de connexion ne vous parlera pas sur Lion.

La session ressemble maintenant très près à une session désactivée si vous cochez "launchctl blist", et certains processus et services prennent bien vie (comme le pasteboard, etc.). En fait, tout sauf Finder et loginwindow est en cours d'exécution. Tant que loginwindow ne s'exécute pas, vous ne pouvez pas lancer d'application graphique et le processus de loginwindow par session est toujours généré en tant qu'enfant direct du global. Comment pousser le processus de loginwindow pour lancer une nouvelle loginwindow dans la nouvelle session? Je ne trouve pas de moyen de mettre la dernière pièce en place!

Toute aide pour compléter cette réponse a été reçue avec gratitude.

Nicholas Wilson
la source
0

l'exécution de la commande avec sudo vous permet de définir le script sur illisible par les utilisateurs standard. Ce n'est pas parfait, mais si votre administrateur est déjà compromis, le jeu est quand même terminé!

chmod ur scriptname

mon script ressemble à ceci, il fonctionne à distance lorsqu'un utilisateur est déjà en cours d'exécution, pour passer à un deuxième utilisateur via SSH (testé sur 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
zeigerpuppy
la source
0

J'avais besoin de connecter le même utilisateur à 25 postes de travail différents, afin de faire une mise à jour logicielle. Je n'ai pas pu exécuter la commande 'osascript -e ...' de manière fiable à partir de sessions SSH, même avec les privilèges sudo. J'ai toutefois pu l'exécuter via Apple Remote Desktop. Si vous avez ARD:

  1. sélectionnez vos machines
  2. réveillez-les et déconnectez-les des autres utilisateurs, si nécessaire
  3. choisissez "Envoyer la commande UNIX ..." dans le menu "Gérer"
  4. collez le script d'Arjan (en omettant le mot «sudo») dans la boîte de dialogue de commande
  5. sélectionnez et entrez "Exécuter la commande en tant que: utilisateur: root"

J'ai été ravi de trouver les 25 Mac Minis exécutant Finder en tant qu'utilisateur, en moins d'une minute. Juste pour réitérer, avec ARD vous n'avez pas à taper le mot de passe sudo sur chaque machine. Les lignes que vous devez coller dans la boîte de dialogue de commande sont (en remplaçant un nom d'utilisateur et un mot de passe valides):

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'
William H. Hooper
la source