다른 사용자의 그래픽 세션에서 GUI 응용 프로그램을 시작하는 방법은 무엇입니까?


15

대화 형으로 로그인 한 다른 사용자로 GUI 응용 프로그램을 시작하는 방법을 그 사용자의 그래픽 세션에서 파악하려고합니다.

예를 들어, foo와 bar라는 두 명의 사용자가 있다고 가정하십시오. 둘 다 로그인되었지만 현재 대화 형 사용자는 foo입니다. 사용자 "bar"로 Calculator.app를 시작하고 싶습니다. 빠른 사용자가 bar로 전환 할 때 계산기 창이 bar 세션에서 열려있는 것을 알 수 있습니다.

내가 시도한 것이 작동하지 않습니다.

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

이렇게하면 Calculator.app가 막대로 시작되지만 foo의 그래픽 세션에서 창이 열립니다.

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

같은 효과.

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

계산기를 막대가 아닌 foo로 시작합니다.

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

같은 효과.

이것을 달성 할 수있는 방법이 있습니까? bash 스크립팅, AppleScript, Core Foundation 또는 Cocoa 프로그램 작성 등을 포함하여 가능한 모든 방법으로 솔루션을 기꺼이 즐기겠습니다. 내 상황에서는 모든 프로그램이나 스크립트가 root를 포함한 모든 사용자로 실행될 수 있습니다.

참고 : 원격 Apple 이벤트를 사용하는 것이 가능하다는 것을 알고 있지만이를 수행하려는 상황에서 공유 환경 설정에서 "원격 Apple 이벤트"가 활성화 될 것이라는 보장은 없습니다.

어떤 도움이라도 대단히 감사하겠습니다!


1
?를 open사용하여 명령 을 시도 했습니까 SSH?
Matthieu Riegler

이상하게도, 앱의 도크 아이콘은 foo의 세션에 나타나지만 앱 윈도우는 바에 나타납니다. 그래서 그것은 효과가 없지만 좋은 제안입니다. 불행히도, 이것이 필요한 상황에서 보안 로그인이 가능하다는 보장은 없습니다.
GuyGizmo

이 퍼즐의 한 부분은 -psn 명령 줄 인수와 관련이 있다고 생각합니다 .OS는 일부 상황에서 추가합니다. 과거에 일부 코드를 OS X로 이식 할 때이 문제가 발생했습니다. 이 질문 과 참조하는 Apple 설명서를 참조하십시오.
Ashley

마지막 10.10 현재, 아래 언급 된 bsexec가 완벽하게 작동합니다
Hofi

답변:


7

달성하고자하는 것은 가능하지만 어렵다. 적절한 사용자 세션 내에서 응용 프로그램을 시작해야합니다. 보안상의 이유로 사용자 세션 분할을 교차하는 것은 어렵습니다.

다른 사용자 세션에서 이미 실행중인 프로세스가 있어야 사용자의 요청을 듣고 사용자를 대신하여 응용 프로그램을 시작할 수 있습니다.

발사 된 bsexec

고맙게도 최신 버전 launchd에는이 기능이 있습니다. Apple 엔지니어는 일반적인 사용을 권장하지 않습니다. 적절한 사용자 세션을 대상으로하려면 launchctlbsexec옵션을 사용하십시오 .

 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.

권장되는 방법은 시작된 작업 티켓을 작성하고 Mac을 재시동하거나 사용자에게 로그 아웃했다가 다시 로그인하도록 요청하는 것입니다.

문제의 원인

응용 프로그램이 잘못된 WindowServer프로세스 에 연결되어 문제가 발생 합니다. 각 사용자 세션에는 별도의 WindowServer가 있습니다. 이 프로세스는 사용자 인터페이스를 처리합니다. 이전 방법은 프로세스의 소유권을 올바른 사용자에게 부여하지만 자신의 WindowServer 프로세스에 연결합니다.

이 문제는 Apple 의 데몬 및 에이전트 기술 노트에 언급되어 있습니다.

경험

나는 개인적인 경험에서 이것을 알고 있습니다. Power Manager의 경우 각 사용자 세션 내에 pmuser 가 존재하도록 썼습니다 . pmuser데몬을 듣고 사용자 별 실행 및 명령을 처리합니다. 데몬은 루트 권한을 가지고 있지만 사용자 세션 내에서 안정적으로 작동하려면 사용자 별 프로세스가 필요했습니다.


TJ의 답변과 같은 간단한 스크립트를 제공 할 수 있습니까? 아니면 그런 일에 너무 복잡합니까?
cregox

올바른 해결책은 짧은 스크립트로는 너무 복잡합니다. 이상적으로는 대상 사용자 세션에 별도의 트램펄린 유사 프로세스가 필요합니다. 이것이 Power Manager를 위해해야 ​​할 일입니다. dssw.co.uk/powermanager 무엇을 성취하고 싶습니까?
Graham Miln

제목에 나와있는 내용을 정확하게 달성하기를 희망하는 경우 : 다른 사용자 세션에서 gui 응용 프로그램을 시작하십시오 . 다른 사용자가 로그인 할 필요가 없거나 프로그래밍 방식으로 로그인 할 수있는 경우 "보너스 포인트" 특히 여러 개의 Google 드라이브를 원합니다. 단순히 수동으로 로그인 하고 시스템 환경 설정 에서 해당 사용자의 로그인 항목 아래에 있으면 작동합니다 . 트램펄린 프로세스가 보너스 포인트를 가져 오지는 않지만 이것이 유일한 방법이라면 Apple 엔지니어가 권장하는 것은 무엇입니까? 나는 그런 간단한 핵 스크립트를 수행하는 것이 정확하다고 생각했습니다! : P
cregox

@Cawas는이 질문을 새로운 질문으로하여 여러 Google 드라이브를 원하는 목표가 아닌 달성하려는 목표에 중점을 두십시오. 초점이 바뀌면 질문이 중복으로 표시되지 않습니다.
Graham Miln

충분히 공정하고 완료했습니다 .
cregox

7

포트를 닫는 SIP (System Integration Protection)로 인해 위의 bsexec 답변 중 어느 것도 El Capitan (10.11)에서 작동하지 않습니다. "launchctl asuser"는 작동하지만 루트로 실행해야합니다. 아래 명령은 El Capitan (및 최신 OS)에서 작동합니다.

sudo launchctl asuser 501 open /Applications/Calculator.app

501은 다른 사용자의 사용자 ID입니다.


이것이 나의 결과입니다 : bruno.medeiros@brunojcm-macbook:~ $ sudo launchctl asuser 501 open /Applications/Firefox.app, 그리고LSOpenURLsWithRole() failed with error -600 for the file /Applications/Firefox.app
BrunoJCM

@BrunoJCM 501을 열려고하는 사용자의 사용자 ID 코드가 확실합니까? 명령이 다음과 같은 경우 좀 더 분명합니다 sudo launchctl asuser $(id -u <user_id_name>) <app>. 말했다, 나는 다른 오류 얻을 posix_spawn(): 13: Permission denied위해 내가이 함께 로그인 (세션을 소유)하고있어 것과 동일한 사용자 ID로 실행 되더라도을sudo launchctl asuser $(id -u mtylutki) /Applications/Calculator.app
마커스

2

마지막으로 10.10은 올바른 "launchctl bsexec"구현을 제공합니다.

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

남자는 말한다

이것은 주어진 명령을 대상 PID와 가능한 한 유사한 실행 컨텍스트에서 실행합니다.

따라서 PID 매개 변수로 적절한 로그인 창 프로세스 의 pid를 사용할 수 있습니다 . UID는 해당 사용자의 로그인 창을 소유하고 GID는 기본 그룹입니다.

이것은 모든 명령과 물론 시작된 작업 (fe launchagents)에도 효과적입니다.

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

이것이 다른 사람들에게 해당되는지 확실하지 않지만 task_for_pid(): 0x5PID에 대한 정확성을 확인한 지금 오류가 발생합니다.
Marcus

1

Finder를 올바른 권한의 호스트로 사용할 수 있습니다 osascript -e "tell application \"Finder\" to open (\"${app}\" as POSIX file as alias)". 그렇게하면 Finder를 시작한 GUI 컨텍스트를 통해 시작됩니다.


0

이것은 ssh를 통해 작동합니다.

#!/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

그러나 Terminal.app를 통해 시도하면 현재 사용자의 GUI에서 TextEdit이 열립니다.

ssh활성화되어 있는지 확실하지 않은 경우 일시적으로 활성화 할 수 있습니다.

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

필요한 경우 나중에 다시 비활성화 하시겠습니까?

그렇지 않으면 나는 혼란에 빠졌다.

10.9에서 테스트되었습니다.


당신이 말한대로 응용 프로그램을 열지 만 요청 된 다른 사용자의 세션이 아닌 현재 사용자 세션에서 응용 프로그램을 엽니 다.
cregox

-1

단순한

sudo su name_of_user

그런 다음 명령을 정상적으로 실행하십시오.


명령은에 의해 실행 bar되지만 여전히 foo그래픽 세션 에서 실행됩니다 .
John N

죄송합니다. 예, 질문에 대해 혼동을 주지만 foo 그래픽 세션에서 실행되지 않습니다.
PandB 소프트웨어
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.