여분의 Mac을 Claude Code 전용 제어 환경으로 만드는 단계별 가이드

2 days ago 11
  • 개인 데이터가 없는 여분의 Mac에 Claude Code를 설치해, 주 Mac의 SSH와 휴대폰 Claude 앱에서 항상 접근 가능한 독립 실행 환경으로 구성함
  • 컨테이너보다 장비 격리 수준이 높고 Unity와 Mac 전용 GUI 앱도 사용할 수 있어, --dangerously-skip-permissions의 위험을 주 Mac과 분리할 수 있음
  • 새 로컬 관리자 계정, 암호 없는 sudo·SSH, 절전 방지, 클립보드 동기화와 Claude Code 설치를 거쳐 원격 작업 기반을 구축함
  • GUI 제어는 LaunchAgent가 GUI 세션 안에서 유지하는 tmux 서버로 구현하며, 화면 기록·손쉬운 사용·전체 디스크 접근 권한은 사람이 직접 허용해야 함
  • Remote Control, Claude in Chrome, Screen Sharing, Tailscale을 더하면 휴대폰 제어부터 브라우저 자동화와 외부 접속까지 가능하지만, 별도 인증과 macOS 권한 설정이 필요함

구성 목적과 기본 원칙

  • Claude Code가 독립적으로 제어할 환경을 만들어 연구·개발 작업을 주 Mac 밖에 위임함
  • --dangerously-skip-permissions를 사용하는 에이전트는 광범위한 권한을 가지므로, 개인 데이터와 Apple ID가 없는 별도 장비에서 실행해 접근 가능한 민감 정보를 줄임
  • 휴대폰 Claude 앱이나 주 Mac의 SSH를 통해 언제든 Claude Code에 접근할 수 있음
  • 기본 구성에는 같은 Wi-Fi에 연결된 여분의 대상 Mac과 일상적으로 사용하는 소스 Mac이 필요함

컨테이너나 OpenClaw 대신 여분의 Mac을 쓰는 이유

  • 컨테이너는 여전히 주 Mac에서 실행되며 네트워크 요청도 주 Mac을 통과하므로 완전한 장비 분리가 아님
  • Unity나 Mac 전용 앱을 실행하기 어렵고, 컴퓨터 사용 기능으로 클릭·드래그해야 하는 GUI 작업에도 제약이 있음
  • 여분의 Mac 구성은 최신 Claude Code 기능과 Claude 앱 제어, 보유 중인 Claude 구독 사용량을 그대로 활용함
  • 다음 원칙에 따라 환경을 분리함
    • 주 Mac이 아닌 오래된 여분의 Mac을 사용함
    • 개인 데이터와 Apple ID가 없는 새 로컬 계정을 만듦
    • 로컬 네트워크에서는 SSH, 휴대폰에서는 Claude 앱으로 제어함

1. 대상 Mac 초기화와 계정 격리

  • 기존 개인 데이터가 있다면 에이전트가 모두 접근할 수 있으므로 먼저 장비를 지움
    • 지원되는 Mac: System Settings → General → Transfer or Reset → Erase All Content and Settings
    • 구형 Intel Mac: 부팅 시 Cmd-R로 Recovery에 들어가 Disk Utility로 내부 드라이브를 지운 뒤 macOS를 재설치함
  • 필요하면 System Settings → General → Software Update에서 최신 macOS로 업데이트함
  • 로컬 사용자 계정을 만들고 Apple ID 로그인은 건너뜀
  • sudo를 사용할 수 있도록 계정에 관리자 권한을 부여함
    • System Settings → Users & Groups에서 Allow this user to administer this computer를 활성화함
    • 다른 관리자 계정에서 복구할 때는 sudo dseditgroup -o edit -a <user> -t user admin을 사용할 수 있음

2. SSH 원격 로그인 활성화

  • 대상 Mac에서 다음 명령으로 Remote Login을 활성화함
sudo systemsetup -setremotelogin on
  • Turning Remote Login on or off requires Full Disk Access privileges 오류가 발생하면 Terminal에 Full Disk Access를 부여함
    • System Settings → Privacy & Security → Full Disk Access에서 Applications → Utilities → Terminal을 추가함
    • Terminal을 종료했다가 다시 열고 명령을 재실행함

3. 암호 없는 sudo 설정

  • 에이전트와 SSH 명령이 매번 암호를 요구하지 않도록 /etc/sudoers.d/에 계정별 규칙을 만듦
echo "<user> ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/<user>-nopasswd >/dev/null sudo chmod 440 /etc/sudoers.d/<user>-nopasswd sudo visudo -cf /etc/sudoers.d/<user>-nopasswd
  • 첫 명령은 규칙을 기록하고, 두 번째 명령은 sudo가 요구하는 읽기 전용 권한을 설정함
  • 마지막 검증에서는 반드시 parsed OK가 출력돼야 하며, 잘못된 sudoers 문법은 sudo 접근을 막을 수 있음
  • sudo -n true가 출력 없이 성공하면 암호 없는 sudo가 동작함

4. 대상 Mac 주소 확인

  • IP는 재부팅하거나 시간이 지나면 바뀔 수 있으므로 고정된 호스트 이름 사용을 권장함
scutil --get LocalHostName
  • 출력된 이름에 .local을 붙여 <target-host>.local로 사용함
  • 같은 네트워크에서 두 Mac의 .local 이름이 겹치면 잘못된 장비에 연결될 수 있으므로 고유한 이름을 지정함
sudo scutil --set LocalHostName newmacbook
  • IP가 필요하면 ipconfig getifaddr en0으로 확인할 수 있지만 변경될 수 있음
  • 이후 주소는 <user>@<target-host>.local 형식으로 사용함

5. 소스 Mac에서 암호 없는 SSH 구성

  • 기존 SSH 키가 없다면 소스 Mac에서 Ed25519 키를 생성함
ssh-keygen -t ed25519 ssh-copy-id <user>@<target-host>.local
  • 공개 키를 설치할 때 대상 계정 암호를 한 번 입력함
  • 다음 명령이 암호 입력 없이 대상 사용자 이름을 출력하면 설정이 완료됨
ssh <user>@<target-host>.local whoami

6. 절전과 자동 잠금 방지

  • macOS는 전원 연결 상태에서도 약 10분간 유휴 상태면 잠들어 네트워크에서 사라질 수 있으므로 절전을 비활성화함
sudo pmset -c sleep 0 sudo pmset -c disablesleep 1 sudo pmset -c displaysleep 0
  • 각 명령은 충전 중 시스템 절전 방지, 덮개를 닫은 상태의 절전 방지, 디스플레이 절전 방지를 적용함
  • pmset -g | grep -iE 'sleep' 출력에서 sleep 0, SleepDisabled 1, displaysleep 0을 확인함
  • 배터리에서도 적용하려면 -c 대신 -a를 쓰지만 배터리 소모가 늘어남
  • 화면 보호기로 인한 자동 잠금도 막음
defaults -currentHost write com.apple.screensaver idleTime 0

7. SSH 클립보드 동기화

  • macOS의 pbcopy와 pbpaste를 SSH로 연결하면 Apple ID나 외부 서비스 없이 암호화된 P2P 방식으로 텍스트를 전송할 수 있음
  • clip.sh는 이미지 전송까지 지원함
curl -fsSL https://raw.githubusercontent.com/ykdojo/claude-controls-mac/… -o ~/.local/bin/clip chmod +x ~/.local/bin/clip export IC_BOX="<user>@<target-host>.local"
  • IC_BOX 설정은 ~/.zshrc에 추가함
  • clip send는 소스 Mac의 텍스트나 이미지를 대상으로 보내며, 이미지는 대상의 Claude Code 세션에 Ctrl-V로 붙여넣을 수 있음
  • clip get은 대상 Mac의 클립보드를 소스 Mac으로 가져옴

8. Claude Code 설치

  • 소스 Mac에서 SSH를 통해 대상 Mac에 특정 Claude Code 버전을 설치함
ssh <user>@<target-host>.local 'curl -fsSL https://claude.ai/install.sh | bash -s -- 2.1.201'
  • 버전 2.1.201 대신 latest나 stable도 지정할 수 있음
  • ~/.local/bin PATH 경고가 나오면 모든 zsh에서 읽는 ~/.zshenv에 경로를 추가함
ssh <user>@<target-host>.local 'echo '\''export PATH="$HOME/.local/bin:$PATH"'\'' >> ~/.zshenv'

9. Claude Code 친화적 환경 선택 설치

  • 선택 사항인 setup-claude-env.sh는 셸 별칭, DX 플러그인, settings.json 조정, GitHub CLI와 선택형 Playwright MCP·yt-dlp를 설치함
  • 전체 구성 요소는 claude-env-components.md에서 확인할 수 있음
  • 대화형 실행에서는 기본 항목이 선택되고 선택 설치 항목은 해제된 체크리스트를 제공함
ssh -t <user>@<target-host>.local \ 'curl -fsSL https://raw.githubusercontent.com/ykdojo/claude-controls-mac/… -o setup-claude-env.sh && bash setup-claude-env.sh'
  • 비대화형 실행은 기본적으로 핵심 항목만 설치하며 --yt-dlp, --playwright, --all, --core 플래그를 지원함
  • 스크립트는 멱등성이 있어 다시 실행해도 됨

10. Claude와 GitHub 로그인

  • SSH로 대상 Mac에 접속해 claude를 실행하고, 주 Mac의 브라우저에서 완료할 수 있는 브라우저·장치 코드 흐름으로 Anthropic 계정에 로그인함
  • 저장소 작업을 위해 gh auth login으로 GitHub 로그인을 추가하는 방식을 권장함
  • 에이전트가 주 계정에 영향을 주지 않도록 별도 GitHub 계정을 사용하는 편이 안전함

11. SSH를 통한 컴퓨터 사용 기능

  • GUI 세션에 연결하는 방식

    • SSH 프로세스는 GUI 로그인 세션에 연결된 화면 기록과 손쉬운 사용 권한을 직접 사용할 수 없음
    • LaunchAgent가 GUI 세션 안의 고정 소켓에서 tmux 서버와 앵커 세션 cc를 유지함
    • 해당 서버 안에서 시작된 Claude Code는 GUI 세션을 상속해 스크린샷, 마우스와 키보드 제어에 접근함
  • 설치

    ssh -t <user>@<target-host>.local \ 'curl -fsSL https://raw.githubusercontent.com/ykdojo/claude-controls-mac/… -o setup-computer-use.sh && bash setup-computer-use.sh'
    • LaunchAgent와 tmux 앵커를 설치하고 ~/.claude.json에서 내장 computer-use 도구를 활성화함
    • tmux와 Claude Pro 또는 Max 플랜이 필요하며, 스크립트는 재실행할 수 있고 --uninstall로 제거 가능함
  • ic 명령으로 세션 관리

    • 소스 Mac에 ic.sh를 설치함
    curl -fsSL https://raw.githubusercontent.com/ykdojo/claude-controls-mac/… -o ~/.local/bin/ic chmod +x ~/.local/bin/ic echo 'export IC_BOX="<user>@<target-host>.local"' >> ~/.zshrc
    • 주요 명령은 다음과 같음
      • ic: 새 Claude 세션
      • ic -c, ic -r: 최근 대화 계속하기 또는 재개 선택기
      • ic --chrome: Claude in Chrome과 함께 실행
      • ic sh: 대상의 일반 셸
      • ic vnc: Screen Sharing 실행
      • ic rc: 휴대폰 Remote Control 서버
      • ic history, ic ls: 저장 대화와 실행 세션 확인
      • ic attach <id>, ic kill <id>, ic kill-all, ic kill-except: 세션 연결·종료 관리
    • 모든 ic 세션은 --dangerously-skip-permissions로 실행되며, ic rc는 --permission-mode bypassPermissions를 사용함
    • tmux 안에서는 Claude가 내보내는 OSC52 클립보드 시퀀스를 Terminal.app이 받지 못하므로, 화면 전체를 복사하려면 Cmd-A 후 Cmd-C를 사용함
  • 에이전트 간 위임

    • 소스 Mac의 Claude Code는 SSH와 tmux send-keys를 사용해 대상에서 실행 중인 Claude 세션에 프롬프트를 보낼 수 있음
    • 긴 프롬프트는 텍스트와 같은 전송 묶음에 포함된 Enter가 제출로 처리되지 않을 수 있어, 잠시 기다린 뒤 Enter를 한 번 더 보내야 함
    • tmux capture-pane과 tail로 응답을 읽고 작업이 끝날 때까지 반복 확인할 수 있음
  • 사람이 직접 부여해야 하는 권한

    • 화면 기록과 손쉬운 사용 권한은 macOS GUI에서 사람이 직접 승인해야 하며 합성 클릭으로 처리할 수 없음
    • 최초 캡처 때 나타나는 bypass the window picker 허용 요청도 승인해야 하며, 약 한 달마다 다시 나타날 수 있음
    • 권한 대상은 claude가 아니라 책임 프로세스인 tmux 바이너리
      • Intel 경로: /usr/local/bin/tmux
      • Apple Silicon 경로: /opt/homebrew/bin/tmux
    • 화면 기록은 스크린샷, 손쉬운 사용은 마우스·키보드 제어를 허용함
    • 권한 상태가 프로세스 시작 시 캐시되므로 부여 후 tmux -S /tmp/cc-tmux.sock kill-server로 서버를 재시작해야 함
    • 설정 목록에 tmux가 나타나지 않으면 ic에서 Claude에게 스크린샷을 요청해 권한 요청을 먼저 발생시킴
    • 최신 macOS에서 앱별 데이터 접근 요청을 반복하지 않으려면 tmux에 Full Disk Access를 부여하고 서버를 다시 시작함

12. VPN과 기타 GUI 앱 설치

  • 대상 Mac의 트래픽을 로컬 IP와 분리하기 위해 Proton VPN 같은 VPN을 설치할 수 있음
  • 컴퓨터 사용 기능을 설정했다면 ic에서 Claude에게 앱 설치를 요청할 수 있지만 다음 작업은 사람이 처리해야 함
    • 무료 요금제라도 로그인 자격 증명이 필요하며 암호는 clip send로 전달할 수 있음
    • 첫 연결의 VPN·네트워크 구성 권한과 Mac 암호 요청을 승인해야 함
    • GUI 전용 앱 제어에는 컴퓨터 사용 기능이 필요함
  • 로그인 이후에는 에이전트가 연결과 서버 전환을 수행할 수 있으며, 같은 흐름을 다른 애플리케이션에도 적용할 수 있음

13. 휴대폰에서 제어

  • 기존 세션에서 /remote-control 또는 /rc를 실행하면 Claude 앱으로 같은 세션을 이어서 제어할 수 있음
  • claude remote-control은 휴대폰에서 기존 세션 연결뿐 아니라 새 세션 생성도 지원함
  • ic rc로 시작하면 휴대폰에서 만든 세션도 대상 Mac의 컴퓨터 사용 기능에 접근할 수 있음

14. Claude in Chrome 설정

  • 일반 컴퓨터 사용 기능은 브라우저 화면을 볼 수 있지만 클릭이나 입력에는 제약이 있음
  • Claude in Chrome 확장은 탐색, 클릭, 폼 입력, 콘솔 로그와 네트워크 요청 읽기를 지원함
  • Playwright MCP와 달리 대상 Mac의 일반 Chrome 프로필을 사용하므로 이미 로그인한 상태를 활용할 수 있음
  • 대상 Mac에 Chrome과 Anthropic Pro, Max, Team 또는 Enterprise 직접 구독이 필요함
  • 다음 작업은 사람이 직접 처리해야 함
    • Chrome Web Store에서 Add to Chrome을 클릭함
    • 확장 프로그램에서 Claude 계정에 로그인하며, 자격 증명은 clip send로 전달할 수 있음
  • Claude Code에서 /chrome을 실행해 기본 활성화하거나, 세션별로 claude --chrome 또는 ic --chrome을 사용함
  • 연결되지 않으면 Chrome을 한 번 재시작함
  • 9단계 환경 스크립트는 좌표 대신 접근성 트리의 요소 참조를 사용하고, 요청하지 않은 스크린샷을 피하도록 ~/.claude/CLAUDE.md에 지침을 추가함
  • 소스와 대상 Chrome이 같은 계정의 확장을 동시에 실행하면 선택 요청이 나타나며, 로컬 장비 판별이 잘못될 수 있는 이슈 #74667이 있음
    • 소스 Mac의 확장을 일시 삭제하거나 소스의 Chrome을 종료해 회피할 수 있음
  • 휴대폰에서 생성한 세션에는 현재 브라우저 도구가 제공되지 않는 이슈 #74671이 있음
    • 터미널에서 세션을 시작한 뒤 /rc로 휴대폰을 연결함

15. macOS Screen Sharing

  • 내장 Screen Sharing으로 소스 Mac에서 대상 화면을 실시간 확인하고 마우스·키보드를 직접 제어할 수 있음
  • macOS 12.1부터는 명령줄로 활성화할 수 없으므로 대상 GUI에서 설정해야 함
  • System Settings → General → Sharing에서 Screen Sharing을 켬
    • Remote Management가 켜져 있어 토글이 보이지 않으면 먼저 끔
  • 소스 Mac에서 다음 명령으로 연결함
open vnc://<user>@<target-host>.local
  • 대상 계정 암호로 로그인하고 Keychain 암호 저장을 선택할 수 있음

16. Tailscale을 통한 외부 네트워크 접속

  • .local 주소는 LAN에서만 동작하지만 Tailscale은 P2P 종단 간 암호화 WireGuard 터널을 통해 SSH, ic, clip, Screen Sharing을 외부 네트워크에서도 사용할 수 있게 함
  • 공개 인터넷에 서비스를 노출하지 않으며, 홈 네트워크에서는 직접 LAN 경로를 사용함
  • Tailscale 네트워크 가입은 장비 간 도달 가능성만 제공하므로 SSH 키나 Screen Sharing 암호는 계속 필요함
  • 대상 Mac에 헤드리스 방식으로 설치하고 출력되는 URL에서 로그인함
ssh <user>@<target-host>.local 'brew install tailscale' ssh <user>@<target-host>.local 'sudo brew services start tailscale' ssh <user>@<target-host>.local 'sudo tailscale up --operator=<user>'
  • 소스 Mac에도 설치하고 대상과 같은 Tailscale 계정으로 로그인함
brew install --cask tailscale-app
  • 기본 활성화된 MagicDNS를 사용하면 .local을 뺀 호스트 이름으로 어디서나 접근할 수 있음
export IC_BOX="<user>@<target-host>" # export IC_BOX="<user>@<target-host>.local"
  • Screen Sharing 주소도 open vnc://<user>@<target-host>로 변경함
  • 관리자 콘솔에서 다음 보안·가용성 설정을 권장함
    • 탈취된 로그인만으로 새 장비가 가입하지 못하도록 device approval을 활성화함
    • 대상 장비가 약 180일 뒤 키 만료로 연결 해제되지 않도록 key expiry를 비활성화함
  • 실제 원격 접속은 소스 Mac을 휴대폰 핫스폿 같은 다른 네트워크에 연결한 뒤 ic ls로 확인함
Read Entire Article