Saya mencoba mencari cara untuk meluncurkan aplikasi GUI sebagai pengguna lain yang masuk secara interaktif, dalam sesi grafis pengguna tersebut.
Misalnya, saya punya dua pengguna, foo dan bar. Keduanya masuk, tetapi pengguna interaktif saat ini adalah foo. Saya ingin meluncurkan Calculator.app sebagai "bilah" pengguna, sehingga ketika saya berpuasa pengguna beralih ke bilah, saya menemukan jendela Kalkulator terbuka di sesi bilah.
Inilah yang saya coba yang tidak berhasil:
sudo -u bar /Applications/Calculator.app/Contents/MacOS/Calculator
Ini meluncurkan Calculator.app sebagai bilah, tetapi jendela terbuka di sesi grafis foo.
sudo -u bar osascript -e "tell application \"Calculator\" to activate"
Efek yang sama.
sudo -u bar open "/Applications/Calculator.app"
Meluncurkan Kalkulator sebagai foo, bukan bar.
launchctl asuser [uid of bar] [any of the above commands]
Efek yang sama.
Apakah ada cara untuk mencapai ini? Saya bersedia untuk menghibur segala macam solusi yang mungkin, termasuk bash scripting, AppleScript, menulis Core Foundation atau program Cocoa, dan sebagainya. Dalam situasi saya, semua program atau skrip dapat dijalankan sebagai pengguna mana pun, termasuk root.
Catatan: Saya sadar bahwa itu mungkin menggunakan Acara Apple jarak jauh, tetapi saya tidak dapat menggunakannya karena dalam situasi yang saya coba lakukan ini saya tidak memiliki jaminan bahwa "Acara Apple Jarak Jauh" akan diaktifkan di preferensi Berbagi.
Bantuan apa pun akan sangat dihargai!
sumber
open
perintah, menggunakanSSH
?Jawaban:
Apa yang ingin Anda capai adalah mungkin tetapi sulit. Anda harus meluncurkan aplikasi dalam sesi pengguna yang sesuai. Untuk alasan keamanan, melintasi pembagian sesi pengguna sulit.
Anda memerlukan proses yang sudah berjalan di sesi pengguna lain untuk mendengarkan permintaan Anda dan meluncurkan aplikasi atas nama Anda.
bsexec launchd
Untungnya, versi terbaru
launchd
memiliki kemampuan ini; meskipun insinyur Apple belum merekomendasikan penggunaan umumnya. Gunakanbsexec
opsi di launchctl untuk menargetkan sesi pengguna yang sesuai:Pendekatan yang disarankan adalah menulis tiket kerja launchd dan me-restart Mac - atau meminta pengguna untuk log-out dan kembali lagi.
Penyebab Masalah
Masalahnya berasal dari aplikasi yang terhubung ke
WindowServer
proses yang salah . Setiap sesi pengguna memiliki WindowServer yang terpisah; proses ini menangani antarmuka pengguna. Metode Anda sebelumnya menempatkan kepemilikan proses dengan pengguna yang tepat tetapi terhubung ke proses WindowServer Anda sendiri.Masalah ini disebutkan dalam catatan teknis Daemon dan Agen dari Apple.
Pengalaman
saya mengetahui ini dari pengalaman pribadi. Untuk Power Manager, saya menulis pmuser agar ada dalam setiap sesi pengguna.
pmuser
mendengarkan daemon kami dan menangani peluncuran dan perintah per pengguna. Meskipun daemon kami memiliki otoritas root, kami masih membutuhkan proses per pengguna untuk bekerja dengan andal dalam sesi pengguna.sumber
Tidak ada jawaban bsexec di atas yang berfungsi pada El Capitan (10.11), karena System Integration Protection (SIP) menutup port. "launchctl asuser" berfungsi, tetapi harus dijalankan sebagai root. Perintah di bawah ini berfungsi pada El Capitan (dan OS terbaru):
Perhatikan bahwa 501 adalah userid untuk pengguna saya yang lain.
sumber
bruno.medeiros@brunojcm-macbook:~ $ sudo launchctl asuser 501 open /Applications/Firefox.app
LSOpenURLsWithRole() failed with error -600 for the file /Applications/Firefox.app
sudo launchctl asuser $(id -u <user_id_name>) <app>
. Yang mengatakan, saya mendapatkan kesalahan yang berbedaposix_spawn(): 13: Permission denied
bahkan jika saya menjalankan dengan ID pengguna yang sama dengan yang saya masuki (dan memiliki sesi) untuksudo launchctl asuser $(id -u mtylutki) /Applications/Calculator.app
Akhirnya, 10.10 menyediakan implementasi "launchctl bsexec" yang benar yang dapat Anda gunakan:
kata pria
Jadi sebagai PID param Anda dapat menggunakan pid dari proses loginwindow yang sesuai . UID adalah id pengguna dari pengguna yang memiliki loginwindow dan GID adalah grup utamanya.
Ini berfungsi dengan baik untuk setiap perintah dan tentu saja untuk pekerjaan launchd (fe launchagents) juga pada akhirnya seperti:
sumber
task_for_pid(): 0x5
kesalahan sekarang untuk ini, di mana saya telah memverifikasi PID sudah benar.Anda dapat menggunakan Finder sebagai tuan rumah untuk izin yang tepat
osascript -e "tell application \"Finder\" to open (\"${app}\" as POSIX file as alias)"
. Dengan begitu ia akan diluncurkan melalui konteks GUI apa pun yang diluncurkan Finder.sumber
Ini bekerja melalui ssh:
tetapi jika mencobanya melalui Terminal.app, maka itu akan membuka TextEdit di GUI pengguna saat ini.
Jika Anda tidak yakin itu
ssh
diaktifkan, mungkin Anda dapat mengaktifkannya untuk sementaradan nonaktifkan lagi setelah itu jika perlu?
Kalau tidak, saya bingung.
Diuji pada 10.9.
sumber
Sederhana
kemudian jalankan perintah secara normal.
sumber
bar
, tetapi masih akan berjalan dalamfoo
sesi grafis.