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)이 실제로 그걸 다 가졌어? 널 물 gap 하나를 찾아.
Hint
gap 은 보통 화면에 로그인했을 땐 읽기 쉽고 headless job 엔 안 보이는 credential 이야. '손으로 돌리면 돼' 가 interactive 문에만 살고 다른 데엔 없는 capability 의 정확한 증상이야.

Progress

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

댓글 0

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

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