Bir GUI uygulamasını başka bir kullanıcının grafik oturumunda nasıl başlatabilirim?


15

Bir GUI uygulamasının etkileşimli olarak oturum açan ve bu kullanıcının grafiksel oturumunda başka bir kullanıcı olarak nasıl başlatılacağını çözmeye çalışıyorum.

Örneğin, iki kullanıcım var, foo ve bar. Her ikisi de giriş yapmış, ancak geçerli etkileşimli kullanıcı foo. Calculator.app kullanıcısını "bar" olarak başlatmak istiyorum, böylece kullanıcı bara hızlı bir şekilde geçiş yaptığımda, Hesap Makinesi penceresinin çubuk oturumunda açık olduğunu görüyorum.

İşte denediğim şey işe yaramadı:

sudo -u bar /Applications/Calculator.app/Contents/MacOS/Calculator

Bu Calculator.app'ı çubuk olarak başlatır ancak pencere foo grafik oturumunda açılır.

sudo -u bar osascript -e "tell application \"Calculator\" to activate"

Aynı etki

sudo -u bar open "/Applications/Calculator.app"

Hesap makinesini çubuk değil foo olarak başlatır.

launchctl asuser [uid of bar] [any of the above commands]

Aynı etki

Bunu başarmanın bir yolu var mı? Bass komut dosyası yazma, AppleScript, Core Foundation veya Cocoa programı yazma, vb. Dahil olmak üzere her türlü olası çözümü eğlendirmek istiyorum. Benim durumumda, herhangi bir program veya script root dahil herhangi bir kullanıcı olarak çalıştırılabilir.

Not: Uzak Apple Etkinlikleri kullanmanın mümkün olduğunun farkındayım, ancak bunu kullanmaya çalıştığımdan beri "Uzak Elma Etkinlikleri" nin Paylaşım tercihlerinde etkinleştirileceğine dair hiçbir garantim yok.

Herhangi bir yardım çok takdir edilecektir!


1
openKomutu denedin SSHmi?
Matthieu Riegler

İşin garibi, uygulamanın dok simgesi foo oturumunda görünür, ancak uygulama penceresi çubuğun içinde görünür. Öyleyse bu işe yaramaz gibi geliyor, ama iyi bir öneri. Ne yazık ki, bir yükleyici için buna ihtiyacım olan durumda güvenli oturum açmanın etkinleştirileceği garantisi yoktur.
GuyGizmo

Bence bu bulmacanın bir parçası OS'nin bazı durumlarda eklediği -psn komut satırı argümanını içerebilir. Geçmişte bu sorunu bazı kodları OS X'e aktarırken çalışırken karşılaştım. Bu soruya ve başvurduğu Apple belgelerine bakın .
Ashley

Körük bsexec söz sonunda 10.10 itibariyle mükemmel çalışıyor
Hofi

Yanıtlar:


7

Ulaşmak istediğiniz şey mümkün ama zor. Uygulamayı uygun kullanıcı oturumu içinde başlatmanız gerekir. Güvenlik nedeniyle, kullanıcı oturumunun bölünmesini geçmek zordur.

İsteğinizi dinlemek ve uygulamayı sizin adınıza başlatmak için diğer kullanıcı oturumunda zaten çalışan bir işleme ihtiyacınız var.

lansman'ın bsexec

Neyse ki, launchdbu yeteneğin son sürümleri ; Her ne kadar Apple mühendisleri genel kullanımlarını tavsiye etmediler. Uygun kullanıcı oturumunu hedeflemek için launchctl'dekibsexec seçeneği kullanın :

 bslist [PID | ..] [-j]
          This prints out Mach bootstrap services and their respective states. While the namespace
          appears flat, it is in fact hierarchical, thus allowing for certain services to be only avail-
          able to a subset of processes. The three states a service can be in are active ("A"), inactive
          ("I") and on-demand ("D").

          If [PID] is specified, print the Mach bootstrap services available to that PID. If [..] is
          specified, print the Mach bootstrap services available in the parent of the current bootstrap.
          Note that in Mac OS X v10.6, the per-user Mach bootstrap namespace is flat, so you will only
          see a different set of services in a per-user bootstrap if you are in an explicitly-created
          bootstrap subset.

          If [-j] is specified, each service name will be followed by the name of the job which regis-
          tered it.

 bsexec PID command [args]
          This executes the given command in the same Mach bootstrap namespace hierachy as the given
          PID.

 bstree [-j]
          This prints a hierarchical view of the entire Mach bootstrap tree. If [-j] is specified, each
          service name will be followed by the name of the job which registered it.  Requires root priv-
          ileges.

Önerilen yaklaşım, başlatılan bir iş bileti yazmak ve Mac'i yeniden başlatmak - ya da kullanıcıdan çıkıp tekrar girmesini istemek.

Sorunların Sebebi

Sorunlar uygulamanın yanlış WindowServersürece bağlı olmasından kaynaklanıyor . Her kullanıcı oturumu ayrı bir WindowServer'a sahiptir; bu işlem kullanıcı arayüzünü idare eder. Daha önceki yöntemleriniz, işlemin sahipliğini doğru kullanıcı ile birlikte yerleştirir ancak kendi WindowServer işleminize bağlanır.

Bu sorun Apple'ın Daemons and Agents teknik notunda belirtilmiştir .

Deneyim

Bunu bizzat tecrübelerimden biliyorum. Power Manager için, her kullanıcı oturumunda var olma yolunda bir şeyler yazdım . pmuserdaemon'umuzu dinler ve kullanıcı başına başlatma ve komutları işleme koyar. Kök yetkisine sahip olan servetimize rağmen, yine de kullanıcı oturumlarında güvenilir bir şekilde çalışmak için kullanıcı başına bir sürece ihtiyaç duyduk.


TJ'nin oradaki cevabı gibi basit bir senaryo yazabilir misiniz? Yoksa böyle bir şey için çok mu karmaşık?
cregox

Doğru çözüm, kısa bir komut dosyası için çok karmaşık. İdeal olarak, hedef kullanıcı oturumunda ayrı bir trambolin benzeri işlem gereklidir. Power Manager için yapmamız gereken şey buydu : dssw.co.uk/powermanager Ne elde etmeyi umuyorsunuz?
Graham Miln

Başlığında tam olarak ne yazdığını umarak: başka bir kullanıcının oturumunda bir gui uygulaması başlatın . Diğer kullanıcının giriş yapması gerekmiyorsa veya programlı olarak giriş yapılabiliyorsa "Bonus Puan". Özellikle, birden çok google drive istiyorum. Basitçe manuel olarak giriş yaparsam ve o kullanıcının Sistem Tercihlerinde Giriş Öğeleri altındaysa çalışır . Trambolin işlemi bonus puanları getirmez, ancak tek yol buysa, Apple mühendislerinin buna karşı önerileri tam olarak nedir? Böyle basit kesmek betikleri yapmak için tam olarak olacağını düşündüm! : P
cregox

@Ca, lütfen bunu yeni bir soru olarak sordu ve nasıl başarılabileceğinden çok, birden fazla Google Sürücü isteme hedefine odaklanın. Odaktaki değişiklik, sorunun bir kopya olarak işaretlenmemesine yardımcı olacaktır.
Graham Miln

Yeterince adil ve bitti .
cregox

6

Yukarıdaki bsexec cevaplarının hiçbiri, portları kapatan Sistem Entegrasyon Koruması (SIP) nedeniyle El Capitan'da (10.11) çalışmaktadır. "launchctl asuser" çalışıyor, ancak root olarak çalıştırılması gerekiyor. Aşağıdaki komut El Capitan'da (ve en son işletim sistemlerinde) çalışır:

sudo launchctl asuser 501 open /Applications/Calculator.app

501'in diğer kullanıcı için kullanıcı kimliği olduğuna dikkat edin.


Bu benim bruno.medeiros@brunojcm-macbook:~ $ sudo launchctl asuser 501 open /Applications/Firefox.appLSOpenURLsWithRole() failed with error -600 for the file /Applications/Firefox.app
sonucum:,

@BrunoJCM, 501'yi açmak istediğiniz kullanıcının kullanıcı kimliği kodu olduğundan emin misiniz? Komut gibi bir şey olup olmadığı biraz daha açıktır: sudo launchctl asuser $(id -u <user_id_name>) <app>. Yani, posix_spawn(): 13: Permission deniedoturum açmış olduğum kullanıcı kimliğiyle (ve oturumun sahibi) sudo launchctl asuser $(id -u mtylutki) /Applications/Calculator.app
Marcus

2

Sonunda 10.10, kullanabileceğiniz doğru bir "launchctl bsexec" uygulaması sağlar:

sudo /bin/launchctl bsexec PID chroot -u UID -g GID / open /Applications/TextWrangler.app

adam diyor ki

Bu, verilen komutu, hedef PID'ye mümkün olduğunca benzer bir yürütme bağlamında yürütür.

Böylece PID param olarak uygun loginwindow işleminin pidini kullanabilirsiniz . UID, kullanıcının bu kullanıcı kimliği, o login penceresinin sahibidir ve GID de birincil gruptur.

Bu, herhangi bir komut için ve elbette ki yeni başlatılan işler (fe lagenerler) için de geçerlidir:

/bin/launchctl bsexec 104 chroot -u 501 -g 20 / /bin/launchctl load -S Aqua /Library/LaunchAgents/com.youragent.plist 2>&1

Bunun diğerleri için doğru olup olmadığından emin değilim, ancak bunun için task_for_pid(): 0x5PID’in doğru olduğunu doğruladığım bir hata alıyorum.
Marcus,

1

Finder'ı doğru izinler için ana bilgisayar olarak kullanabilirsiniz osascript -e "tell application \"Finder\" to open (\"${app}\" as POSIX file as alias)". Bu şekilde, hangi GUI içeriği Finder'ı başlattıysa başlatacak.


0

Bu ssh ile çalışır:

#!/bin/bash

PID=$(ps auxwww | egrep "^bar" |\
fgrep /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow |\
awk '{print $2}')

sudo launchctl bsexec "$PID" open -a TextEdit

ancak Terminal.app aracılığıyla denerseniz geçerli kullanıcının GUI'sinde TextEdit'i açar.

Etkin olduğundan emin sshdeğilseniz, belki de geçici olarak etkinleştirebilirsiniz.

sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

ve gerekirse tekrar devre dışı bırakın?

Aksi halde güdük oldum.

10.9'da test edildi.


İstediğiniz gibi uygulamayı açar, ancak diğer kullanıcı oturumunda istendiği gibi değil, geçerli kullanıcı oturumunda açar.
cregox

-1

Basit

sudo su Instagram Hesabındaki Resim ve Videoları name_of_user

sonra normal komutları yürütün.


Komutlar tarafından çalıştırılacak bar, ancak yine de foografik oturumunda çalıştırılacaktı .
John N,

Üzgünüz, evet soru hakkında kafam karıştı, foo grafik oturumda yürütülmez.
PandB Yazılım
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.