Induksi login grafis Mac dari SSH


16

Bagaimana cara menginduksi login grafis Mac dari SSH? Apakah ada cara untuk membuat loginwindowproses memulai sesi pengguna dengan menjalankan perintah ketika login jarak jauh melalui SSH sebagai admin di Mac OS X?

Ketika mesin berada di jendela login (tidak ada pengguna yang saat ini masuk), saya ingin membuka sesi pengguna seolah-olah saya telah mengklik nama pengguna dan memasukkan kata sandi.

Solusi yang tidak melibatkan pembuatan skrip GUI sangat disukai, tetapi halaman Apple KB ini mungkin menarik bagi mereka yang menggunakan rute itu.

Jawaban:


4

Tidak mengetahui kata sandi membuat segalanya menjadi rumit, tetapi mungkin solusinya adalah: apakah mungkin untuk sementara mengosongkan kata sandi pengguna? (Dan setelah itu reset ke apa pun sebelumnya.)

Sebagai permulaan:

Pertama, dapatkan jendela login untuk ditampilkan. Cukup logout pengguna saat ini, gunakan pengalihan pengguna cepat, atau gunakan SSH:

cd "/ System / Library / CoreServices / Ekstra Menu / User.menu / Isi / Sumber Daya /"
sudo ./CGSession -suspend

Atau, untuk langsung beralih ke pengguna tertentu, yang mungkin akan menampilkan jendela masuk (ini tiba-tiba tidak lagi berfungsi pada Leopard 10,5 saya):

sudo ./CGSession -switchToUserID 501

Apa yang ditampilkan sekarang sedikit bergantung pada System Preferences, tetapi mari kita asumsikan itu adalah ikon dan nama pengguna. Untuk mengaktifkan nama, kita harus mengetikkan huruf pertama. Kemudian, setelah Kembali, prompt kata sandi muncul. Atau satu dapat memilih setiap nama (seperti dengan menekan Panah Bawah) dan kemudian tekan Option-Kembali ke diminta untuk kedua setiap username dan password-nya. Saya tidak tahu bagaimana orang dapat mengetahui layar mana yang ditampilkan, tetapi mari kita simpan itu untuk nanti ...

Jadi, untuk memilih nama pengguna pertama (acak) dan tekan Option-Return, ketikkan nama pengguna tertentu, tekan Return, dan ketikkan kata sandi:

sudo osascript -e 'beri tahu aplikasi "System Events"
  kode kunci 125
  keystroke kembali menggunakan opsi turun
  keystroke "nama pengguna"
  keterlambatan 1.0
  kembali keystroke
  keterlambatan 1.0
  keystroke "kata sandi"
  keterlambatan 1.0
  kembali keystroke
akhiri '

Di atas menunjukkan beberapa kesalahan, yang sejauh yang saya tahu tidak membatasi penggunaan:

osascript [285]: 3891612: (connectAndCheck) Aplikasi yang tidak tepercaya tidak 
    diizinkan untuk terhubung atau meluncurkan Window Server sebelum masuk.
_RegisterApplication (), GAGAL UNTUK membangun koneksi default untuk
    WindowServer, _CGSDefaultConnection () adalah NULL.

Atau, gunakan skrip khusus bahasa dari " Script the Login window through Apple Remote Desktop " (mungkin suatu hari komentar di situs itu akan menunjukkan solusi yang lebih baik):

beri tahu proses "SecurityAgent"
  setel nilai bidang teks 1 dari grup 1 dari jendela 1 ke "nama pengguna"
  setel nilai bidang teks 2 grup 1 dari jendela 1 ke "kata sandi"
akhiri saja
klik tombol "Masuk" dari jendela 1 proses aplikasi "SecurityAgent"

Tetapi masalah utamanya adalah: ini masih membutuhkan kata sandi . Namun: jelas tidak diperlukan kata sandi saat pengguna memiliki kata sandi kosong. Bahkan, untuk kata sandi kosong, cukup mengklik ikon pengguna saja yang diperlukan. Jadi, jika mengirim penekanan tombol menggunakan AppleScript dapat diterima, maka mungkin "semua" yang tersisa untuk mencari tahu:

  • Apakah mungkin untuk sementara mengosongkan kata sandi pengguna, untuk memungkinkan memulai (atau melanjutkan) sesi tanpa mengetahui kata sandi itu ...?

  • Bisakah satu membuat AppleScript-proof? Suka:

    • Bagaimana cara mengetahui apakah jendela login terlihat? (mungkin stat -f%Su /dev/consoledapat membantu, karena itu menghasilkanroot saat jendela masuk ditampilkan)
    • Bagaimana cara mengetahui jendela masuk mana yang ditampilkan? (Seperti: yang memperlihatkan ikon dan nama login, atau daftar dropdown, atau mungkin hanya prompt kata sandi jika seseorang memilih untuk beralih ke pengguna tertentu?)
    • Singkirkan penundaan.
    • Bagaimana dengan pesan kesalahan itu?

(Catatan untuk pengujian: saat menggunakan Berbagi Layar sepertinya mengatur preferensi Saat mengendalikan komputer: Mengenkripsi hanya kata sandi dan penekanan tombol juga mempertahankan koneksi ketika jendela login ditampilkan, atau setelah pengguna berhasil login. Saat menggunakan Enkripsi semua jaringan data maka Mac saya perlu membangun kembali koneksi Screen Sharing setiap kali login ditampilkan atau pengguna diaktifkan.)


Ini adalah awal yang baik, tetapi memiliki dua masalah. Pertama, itu tidak berfungsi jika Anda berada di jendela masuk, yang saya inginkan, dan meminta kata sandi, yang saya lebih suka tidak. Karena root, itu harus dapat beralih pengguna tanpa kata sandi.
Sophie Alpert

Aha. Saya bahkan tidak tahu cara login sebagai pengguna lain ketika duduk di depan komputer itu sendiri, jadi tidak ada cerutu untuk itu sudo osascript -e 'tell app "System Events" to keystroke "password" & return'. Dengan layar terkunci, memasukkan nama pengguna administratif dan kata sandi dilanjutkan kembali sesi pengguna lain. Tetapi bagaimana cara memulai sesi untuk pengguna tanpa mengetahui kata sandi? (Hanya untuk memastikan, jika Anda mengetahui kata sandi: solusi lain mungkin Berbagi Layar, yang juga berfungsi untuk layar masuk. Anda harus menghubungkan kembali Berbagi Layar setelah sesi pengguna tertentu dimulai atau dilanjutkan.)
Arjan

Ini bagus. Saya lebih suka solusi tanpa mensimulasikan penekanan tombol secara manual.
Sophie Alpert

2
Saya ingin tahu apakah ada yang tahu bagaimana memulai sesi untuk orang lain. Jadi, tanpa mempertimbangkan jawaban di atas, hanya dalam penggunaan sehari-hari Mac OS X: dapatkah administrator masuk sebagai pengguna lain, tanpa mengetahui kata sandi pengguna itu? (Sama seperti supada command prompt, tetapi kemudian untuk sesi GUI. Atau seperti ketika layar terkunci, di mana memasukkan nama pengguna administratif dan kata sandi melanjutkan sesi pengguna lain.)
Arjan

Mungkin tidak mungkin untuk melakukannya tanpa penekanan tombol AppleScript: docs.info.apple.com/article.html?path=RemoteDesktop/3.0/en/…
Sophie Alpert

1

Saya telah menyelidiki ini baru-baru ini.

Masukkan ini ke dalam tumpukan PAM aplikasi Anda, atau uji dengan sshd:

session    required       pam_launchd.so launchd_session_type=Aqua

Itu sangat membantu Anda mendapatkan sesi grafis yang cukup dekat dengan sesi pengguna yang tidak aktif. Secara khusus, itu ada di namespace bootstrap kanan dan memiliki port bootstrap yang benar (saya pikir). Anda dapat memeriksa sumbernya untuk mengetahui apa yang dilakukan pam_launchd; itu menggunakan beberapa perpustakaan pribadi yang tampak masuk akal (fungsi vproc_priv.h di libvprop) untuk memanggil rutin Mach untuk mengatur port dan namespace. Cocok dengan semua dokumen (terbatas) yang disediakan Apple untuk syscalls yang diturunkan dari Mach.

Selanjutnya, Anda perlu mengatur id pengguna audit Anda dengan id pengguna dengan API BSM, atau jendela masuk tidak akan berbicara dengan Anda di Lion.

Sesi ini terlihat sangat dekat dengan sesi yang tidak aktif sekarang jika Anda memeriksa "launchctl blist", dan beberapa proses dan layanan menjadi hidup dengan baik (seperti papan tulis, dan sebagainya). Bahkan, semuanya kecuali Finder dan loginwindow sedang berjalan. Hingga loginwindow berjalan, Anda tidak dapat meluncurkan aplikasi grafis, dan proses loginwindow per-sesi selalu muncul sebagai anak langsung dari aplikasi global. Bagaimana cara menyodok proses loginwindow untuk meluncurkan loginwindow baru di sesi baru? Saya tidak dapat menemukan cara untuk mendapatkan potongan terakhir di tempat!

Segala bantuan yang melengkapi jawaban ini diterima dengan rasa terima kasih.


0

menjalankan perintah dengan sudo memungkinkan Anda untuk mengatur skrip agar tidak dapat dibaca oleh pengguna standar. Itu tidak sempurna, tetapi jika pengguna admin Anda sudah dikompromikan, permainan sudah berakhir!

chmod skrip namamu

skrip saya terlihat seperti ini, berfungsi dari jarak jauh ketika satu pengguna sudah berjalan, untuk beralih ke pengguna kedua melalui SSH (diuji pada 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

Saya perlu login pengguna yang sama ke 25 workstation yang berbeda, untuk melakukan pembaruan perangkat lunak. Saya tidak dapat menjalankan perintah 'osascript -e ...' dengan andal dari sesi SSH, bahkan dengan hak sudo. Namun, saya bisa menjalankannya melalui Apple Remote Desktop. Jika Anda memiliki ARD:

  1. pilih mesin Anda
  2. bangunkan dan keluarkan mereka dari pengguna lain, jika perlu
  3. pilih "Kirim Perintah UNIX ..." dari menu "Kelola"
  4. rekatkan skrip Arjan (menghilangkan kata 'sudo') ke dalam kotak dialog perintah
  5. pilih dan masukkan "Jalankan perintah sebagai: Pengguna: root"

Saya senang menemukan semua 25 Mac Minis menjalankan Finder sebagai pengguna, dalam waktu kurang dari satu menit. Hanya untuk mengulangi, dengan ARD Anda tidak perlu mengetikkan kata sandi sudo pada setiap mesin. Baris yang perlu Anda tempelkan ke dialog perintah adalah (mengganti nama pengguna dan kata sandi yang valid):

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'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.