Wywołaj logowanie graficzne Maca z SSH

16

Jak zaindukować graficzny login Maca z SSH? Czy istnieje sposób, aby loginwindowproces rozpoczął sesję użytkownika, uruchamiając polecenie podczas zdalnego logowania przez SSH jako administrator w Mac OS X?

Gdy maszyna jest w oknie logowania (żaden użytkownik nie jest aktualnie zalogowany), chcę, aby otworzyła sesję użytkownika, tak jakbym kliknął nazwę użytkownika i wprowadził hasło.

Preferowane są rozwiązania niewymagające skryptowania GUI, ale ta strona Apple KB może być interesująca dla tych, którzy wybierają tę drogę.

Sophie Alpert
źródło

Odpowiedzi:

4

Brak znajomości hasła komplikuje sprawę , ale może rozwiązaniem jest: czy można tymczasowo usunąć hasło użytkownika? (A potem zresetuj go do tego, co było wcześniej.)

Na początek:

Najpierw wyświetl okno logowania. Po prostu wyloguj się z bieżącego użytkownika, użyj szybkiego przełączania użytkowników lub użyj SSH:

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

Lub, aby od razu przejść do konkretnego użytkownika, który prawdopodobnie wyświetli okno logowania (to nagle nie działa już na moim 10.5 Leopardzie):

sudo ./CGSession -switchToUserID 501

To, co się teraz pokazuje, zależy trochę od Preferencji systemowych, ale załóżmy, że są to ikony użytkowników i ich nazwy. Aby aktywować nazwę, musielibyśmy wpisać pierwsze litery. Następnie po powrocie pojawia się monit o hasło. Alternatywnie można wybrać dowolną nazwę (np. Naciskając Strzałkę w dół), a następnie nacisnąć klawisz Option-Return, aby wyświetlić monit o podanie dowolnej nazwy użytkownika i hasła. Nie wiem, jak rozpoznać, który ekran jest wyświetlany, ale zapiszmy to na później ...

Tak więc, aby wybrać pierwszą (losową) nazwę użytkownika i nacisnąć Option-Return, wpisz konkretną nazwę użytkownika, naciśnij Return i wpisz hasło:

sudo osascript -e 'powiedz aplikacji „System Events”
  kod klucza 125
  naciśnięcie klawisza Return przy użyciu opcji w dół
  naciśnięcie klawisza „nazwa użytkownika”
  opóźnienie 1.0
  powrót z klawisza
  opóźnienie 1.0
  naciśnięcie klawisza „hasło”
  opóźnienie 1.0
  powrót z klawisza
koniec powiedz „

Powyższe pokazuje błąd, który, o ile wiem, nie ogranicza użycia:

osascript [285]: 3891612: (connectAndCheck) Niezaufane aplikacje nie są 
    wolno się połączyć lub uruchomić Windows Server przed zalogowaniem.
_RegisterApplication (), NIE POWIODŁO SIĘ, aby ustanowić domyślne połączenie z
    WindowServer, _CGSDefaultConnection () ma wartość NULL.

Możesz też użyć skryptu specyficznego dla języka z „ Skryptuj okno logowania za pomocą Pulpitu zdalnego Apple ” (może kiedyś komentarze na tej stronie pokażą lepsze rozwiązanie):

powiedz procesowi „SecurityAgent”
  ustaw wartość pola tekstowego 1 grupy 1 okna 1 na „nazwa użytkownika”
  ustaw wartość pola tekstowego 2 grupy 1 okna 1 na „hasło”
koniec powiedz
kliknij przycisk „Zaloguj się” w oknie 1 procesu aplikacji „SecurityAgent”

Ale głównym problemem jest to, że nadal potrzebuje hasła . Jednak: oczywiście hasło nie jest potrzebne, gdy użytkownik ma puste hasło. W rzeczywistości dla pustych haseł wystarczy kliknięcie ikony użytkownika. Tak więc, jeśli wysyłanie naciśnięć klawiszy przy użyciu AppleScript jest dopuszczalne, być może „wszystko” pozostaje do ustalenia:

  • Czy można tymczasowo wyczyścić hasło użytkownika, aby umożliwić rozpoczęcie (lub wznowienie) sesji bez znajomości tego hasła ...?

  • Czy można uczynić AppleScript odpornym na błędy? Lubić:

    • Jak stwierdzić, czy okno logowania jest widoczne? (być może stat -f%Su /dev/consolemoże pomóc, ponieważ ustępuje,root gdy wyświetlane jest okno logowania)
    • Jak stwierdzić, które okno logowania jest wyświetlane? (Na przykład: jedna z ikonami i nazwami logowania lub listą rozwijaną, a może tylko monit o hasło, jeśli ktoś zdecydował się na przełączenie na określonego użytkownika?)
    • Pozbądź się opóźnień.
    • Co z tym komunikatem o błędzie?

(Uwaga do testowania: podczas korzystania z udostępniania ekranu wydaje się, że ustawienie preferencji Podczas kontrolowania komputerów: Szyfrowanie haseł i naciśnięć klawiszy zachowuje również połączenie, gdy wyświetlane jest okno logowania lub po pomyślnym zalogowaniu użytkownika. Podczas korzystania z funkcji Szyfruj całą sieć dane, a następnie mój Mac musi ponownie nawiązać połączenie Udostępniania ekranu za każdym razem, gdy wyświetlane jest logowanie lub użytkownik jest przełączany).

Arjan
źródło
To dobry początek, ale ma dwa problemy. Po pierwsze, nie działa, jeśli jesteś w oknie logowania, czego chciałem, i prosi o hasło, które wolałbym, aby nie. Ponieważ jest to root, powinien móc przełączać użytkowników bez hasła.
Sophie Alpert,
Aha. Nie wiem nawet, jak zalogować się jako inny użytkownik, siedząc przy samym komputerze, więc nie mam cygara sudo osascript -e 'tell app "System Events" to keystroke "password" & return'. Gdy ekran jest zablokowany, wprowadzenie nazwy użytkownika administracyjnego i hasła wznawia sesję innego użytkownika. Ale jak rozpocząć sesję dla dowolnego użytkownika bez znajomości hasła? (Dla pewności, jeśli znasz hasło: innym obejściem może być Udostępnianie ekranu, które działa również w przypadku ekranu logowania. Musisz ponownie podłączyć Udostępnianie ekranu po uruchomieniu lub wznowieniu określonej sesji użytkownika.)
Arjan
To jest dobre. Wolałbym jednak rozwiązanie bez ręcznej symulacji naciśnięć klawiszy.
Sophie Alpert,
2
Zastanawiam się, czy ktoś wie, jak rozpocząć sesję dla kogoś innego. Tak więc, bez uwzględnienia powyższej odpowiedzi, tylko w codziennym korzystaniu z Mac OS X: czy administrator może zalogować się jako inny użytkownik, nie znając hasła tego użytkownika? (Podobnie jak suw wierszu polecenia, ale w przypadku sesji GUI. Lub tak, jak po zablokowaniu ekranu, gdzie wprowadzenie nazwy użytkownika administracyjnego i hasła wznawia sesję drugiego użytkownika.)
Arjan
Być może nie można tego zrobić bez naciskania klawiszy AppleScript: docs.info.apple.com/article.html?path=RemoteDesktop/3.0/en/...
Sophie Alpert
1

Ostatnio to badałem.

Umieść to w stosie PAM aplikacji lub przetestuj za pomocą sshd:

session    required       pam_launchd.so launchd_session_type=Aqua

To długa droga do uzyskania sesji graficznej, która jest bardzo zbliżona do sesji użytkownika wyłączonego. W szczególności znajduje się we właściwej przestrzeni nazw bootstrap i ma właściwe porty bootstrap (tak myślę). Możesz sprawdzić źródło pod kątem tego, co robi pam_launchd; używa rozsądnej biblioteki prywatnej (funkcje vproc_priv.h w libvprop) do wywoływania procedur Macha do konfigurowania portów i przestrzeni nazw. Pasuje do wszystkich (ograniczonych) dokumentów, które Apple udostępnia dla wywołań Macha.

Następnie musisz ustawić identyfikator użytkownika kontroli na identyfikator użytkownika z interfejsem API BSM, w przeciwnym razie okno logowania nie będzie z tobą rozmawiać na Lion.

Sesja wygląda teraz bardzo blisko sesji wyłączonej, jeśli zaznaczysz opcję „launchctl blist”, a niektóre procesy i usługi ładnie ożywają (np. Pulpit itd.). W rzeczywistości działa wszystko oprócz Findera i loginwindow. Do momentu uruchomienia loginwindow nie można uruchomić aplikacji graficznej, a proces loginwindow na sesję jest zawsze spawnowany jako bezpośrednie dziecko globalne. W jaki sposób można dotknąć procesu loginwindow, aby uruchomić nowe loginwindow w nowej sesji? Nie mogę znaleźć sposobu na założenie ostatniego kawałka!

Jakakolwiek pomoc w wypełnieniu tej odpowiedzi została przyjęta z wdzięcznością.

Nicholas Wilson
źródło
0

uruchomienie polecenia za pomocą sudo pozwala ustawić skrypt jako nieczytelny dla standardowych użytkowników. To nie jest idealne, ale jeśli twój administrator jest już zagrożony, gra jest skończona!

chmod nazwa skryptu

mój skrypt wygląda tak, działa zdalnie, gdy jeden użytkownik już działa, aby przełączyć się na drugiego użytkownika przez SSH (testowane na 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
źródło
0

Musiałem zalogować tego samego użytkownika na 25 różnych stacjach roboczych, aby dokonać aktualizacji oprogramowania. Nie byłem w stanie niezawodnie uruchomić polecenia „osascript -e ...” z sesji SSH, nawet z uprawnieniami sudo. Byłem jednak w stanie uruchomić go za pomocą Pulpitu zdalnego Apple. Jeśli masz ARD:

  1. wybierz swoje maszyny
  2. obudź je i wyloguj w razie potrzeby z innych użytkowników
  3. wybierz „Wyślij polecenie UNIX ...” z menu „Zarządzaj”
  4. wklej skrypt Arjana (pomijając słowo „sudo”) w oknie dialogowym poleceń
  5. wybierz i wprowadź „Uruchom polecenie jako: Użytkownik: root”

Z przyjemnością znalazłem wszystkie 25 komputerów Mac Minis z systemem Finder jako użytkownik w ciągu niecałej minuty. Dla przypomnienia, z ARD nie musisz wpisywać hasła sudo na każdym komputerze. Wiersze, które należy wkleić w oknie dialogowym poleceń to (podstawienie prawidłowej nazwy użytkownika i hasła):

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
źródło