본문 바로가기
C.W.K.
Stream
Lesson 01 of 04 · published

Mac 하나, 문 여러 개

~9 min · execution-envelope, capabilities, keychain, launchd

Level 0Lone Machine
0 XP0/37 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"넌 명령을 'Mac 에서' 돌리는 게 아냐. 문을 통해 돌리는 거고, 문마다 다른 열쇠 묶음을 건네."

기계 하나, 문 여러 개

Mac 을 고정된 힘 묶음을 가진 하나로 그리는 건 자연스러워. 할 수 있는 걸 할 수 있지. 근데 같은 기계가 아주 다른 여러 envelope 을 통해 닿아. 물리 화면의 interactive login, SSH session, launchd daemon, WebUI assistant, 위임된 coding agent. 각각이 같은 상자로 가는 문이고, 문마다 다른 열쇠고리를 건네.

문마다 뭐가 달라지나

차이가 딱 진짜 작업에 중요한 것들이야. login Keychain 을 읽을 수 있나. approval dialog 를 띄울 live GUI session 이 있나. non-interactive sudo 가 있나. 승인할 사람이 있나. 작업이 reboot 를 버티나. SSH session 은 GUI session 이 없어. launchd daemon 은 login Keychain 이 없고. interactive login 만 graphical prompt 를 띄워. 같은 Mac 인데 capability 는 천지 차이야.

이게 자꾸 발목 잡는 이유

고전적 실패가 이래. step 이 네가 Terminal 에서 돌릴 땐 완벽한데, launchd 아래 스케줄하거나 SSH 로 쏘면 실패해. 명령이 틀려서가 아냐. 새 envelope 이 그 명령이 조용히 기대던 credential 에 못 닿아서야. 명령은 안 바뀌었어. 문이 바뀌었지.

맞는 질문

그래서 이 기계는 X 할 수 있어? 는 틀린 질문이야. 단일 답이 없어. 맞는 질문은 이 기계의 이 envelope 은 X 할 수 있어? 야. capability 는 뒤의 상자가 아니라 네가 들어온 문이랑 같이 다니니까.

capability 는 기계가 아니라 문에 속해. 같은 Mac 도 어떻게 두드렸느냐에 따라 다른 힘 묶음이야.

Code

같은 기계, 문 다섯, 열쇠고리 다섯·python
ENVELOPES = {
    # 문                  login_keychain  gui_session  sudo_ni  human_present  reboot_survivable
    "interactive_login":  (True,          True,        True,    True,          False),
    "ssh_session":        (False,         False,       None,    False,         False),  # None = 상황따라
    "launchd_daemon":     (False,         False,       True,    False,         True),
    "webui_assistant":    (False,         False,       False,   True,          False),
    "delegated_agent":    (False,         False,       None,    False,         None),
}

# '이 Mac 은 login Keychain 을 읽을 수 있어?' 는 단일 답이 없어:
# 물리 login 으론 True, SSH 나 launchd 로는 False.
# 항상 ENVELOPE 를 물어, 기계만 묻지 말고.

External links

Exercise

기계에서 자동화하는 작업 하나 골라. 백업, deploy, sync 같은 거. 조용히 기대는 capability 를 나열해. 저장된 credential, GUI prompt, sudo, reboot 버티기. 그다음 확인해. 그걸 돌리는 문(cron, launchd, SSH, CI runner)이 실제로 그걸 다 가졌어? 널 발목 잡을 구멍을 하나 찾아.
Hint
gap 은 보통 화면에 로그인했을 땐 읽기 쉽고 headless job 엔 안 보이는 credential 이야. '손으로 돌리면 되는데' 가, interactive 문에만 살고 다른 데엔 없는 capability 의 딱 그 증상이지.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.