PARA/03_Resources/R001_개발_레퍼런스(참고문서)/개발 환경과 도구/window + WSL + Mac + VS Code(Remote-SSH) 스크립트.md

window + WSL + Mac + VS Code(Remote-SSH) 스크립트

환경 개요

  • Windows 10/11 (호스트)

    • OpenSSH Server 사용
    • 사용자: Administrator
    • 내부 IP: 192.168.0.4
  • WSL2 / Ubuntu (윈도우 안 리눅스)

    • 사용자: doobuntu
    • SSH 서버 openssh-server 기동
  • Mac (클라이언트)

    • OpenSSH 9.9, VS Code + Remote-SSH
    • SSH 키: ~/.ssh/id_ed25519(.pub)

A) Windows에서 OpenSSH Server 구성

증상

  • ssh localhost 시 비밀번호 프롬프트, 빈 비번 불가
  • PowerShell에서 ssh-keygen 실행 시 Too many arguments 오류

원인

  • Windows는 빈(공백) 비번 계정의 네트워크 로그온을 차단
  • PowerShell 인자/따옴표 처리로 -N ""추가 인자로 해석됨

해결

  1. OpenSSH Server 설치/기동
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Set-Service sshd -StartupType Automatic
Start-Service sshd
  1. 키 생성 (PowerShell 인자 이슈 회피 → 대화식)
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\id_ed25519"
# 프롬프트에서 엔터 2번 → passphrase 없음
  1. 방화벽 허용
netsh advfirewall firewall add rule name="OpenSSH Server 22" dir=in action=allow protocol=TCP localport=22
  1. (중요) Administrator 계정의 공개키 파일 경로
  • 기본 ~/.ssh/authorized_keys가 아니라,
    C:\ProgramData\ssh\administrators_authorized_keys 사용 (기본 sshd_configMatch Group administrators 블록)
  1. administrators_authorized_keys에 키 등록 + ACL 정리
$admAuth = 'C:\ProgramData\ssh\administrators_authorized_keys'
$pub = (Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub" -Raw).Trim()
if (!(Test-Path $admAuth)) { New-Item -ItemType File -Path $admAuth | Out-Null }
if (-not (Select-String -Path $admAuth -Pattern ([regex]::Escape($pub)) -SimpleMatch -Quiet)) {
  Add-Content -Path $admAuth -Value "$pub`n"
}
icacls $admAuth /inheritance:r
icacls $admAuth /grant "Administrators:F" "SYSTEM:F"
icacls $admAuth /remove "Users" "Authenticated Users" "Everyone" 2>$null
takeown /F $admAuth | Out-Null
icacls $admAuth /setowner "Administrators"
 
Restart-Service sshd

검증

ssh -vvv localhost
# 'Offering public key' → 'Server accepts key' → 로그인

메모: .ssh 폴더 ACL을 icacls $sshDir /grant "$env:USERNAME:(OI)(CI)F" 처럼 줄 때 F에 괄호를 쓰면 안 됨.
`"(OI)(CI)(F)" 잘못, "(OI)(CI)F"가 올바름. (우리는 ProgramData 경로로 우회)


B) Mac → Windows 공개키 전달 (빈 비번 차단 이슈)

증상

  • ssh-copy-id/scpAdministrator 비밀번호를 요구

  • 빈 비번으로는 인증 실패

원인

  • Windows 정책: 빈 비번 네트워크 로그인 차단

해결 옵션

  • 옵션 A(간단): Administrator에 임시 비번 설정 → scp로 키 올림

  • 옵션 B(보수적): 임시 로컬 사용자 생성 → 그 계정으로 업로드 후 관리자 파일에 병합 → 임시 계정 삭제

(결국 administrators_authorized_keys 에 키만 들어가면, Mac에서 키 인증으로 비번 없이 접속 가능)


C) D 드라이브 접근/전송

  • SSH 세션에서:

    cd /d D:\
  • Mac에서 Windows D:로 업로드:

    scp file.txt Administrator@192.168.0.4:/D:/file.txt

    드라이브 경로는 /D:/... 형식 사용이 핵심.


D) WSL(우분투)에 직접 SSH 접속 구성

목표

Mac → 192.168.0.4:2222 → (Windows portproxy) → <WSL_IP>:22(WSL sshd)

1) WSL(Ubuntu)에서 sshd 설치/기동/검증

sudo apt update
sudo apt -y install openssh-server
sudo systemctl enable --now ssh
ss -tnlp | grep ':22'  # 리슨 확인

2) Windows에서 portproxy + 방화벽 (WSL IP는 매번 확인)

# WSL IP (첫 번째 주소)
$wslIp = (wsl.exe hostname -I).Trim().Split(' ')[0]
 
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=2222 2>$null
netsh interface portproxy add    v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=$wslIp connectport=22
 
netsh interface portproxy show v4tov4
netsh advfirewall firewall add rule name="WSL SSH 2222" dir=in action=allow protocol=TCP localport=2222

3) Mac SSH 설정 (~/.ssh/config)

Host wsl
  HostName 192.168.0.4
  Port 2222
  User doobuntu
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes

4) 연결 검증

nc -vz 192.168.0.4 2222   # succeeded
ssh -vvv wsl              # Offering public key → Server accepts key → 로그인

트러블슈팅 포인트

  • 타임아웃(Timeout):

    • WSL sshd 미기동 / portproxy 미설정 / 방화벽 미허용
  • Permission denied (publickey):

    • WSL ~/.ssh/authorized_keys 누락/권한 문제

    • 해결(WSL 내부, doobuntu 계정):

      mkdir -p ~/.ssh && chmod 700 ~/.ssh
      nano ~/.ssh/authorized_keys  # Mac 공개키 한 줄 붙여넣기
      chmod 600 ~/.ssh/authorized_keys
      chown -R doobuntu:doobuntu ~/.ssh
      sed -i 's/\r$//' ~/.ssh/authorized_keys
      sudo systemctl restart ssh

E) VS Code Remote-SSH 로그 분석 & 매핑

  • Permission denied (publickey) with doobuntu@192.168.0.4
    WSL 사용자 키 미설치/퍼미션 문제 (위 D-트러블슈팅으로 해결)

  • ssh: connect to host 192.168.0.4 port 2222: Operation timed out
    portproxy/방화벽/sshd 중 하나 미구성 (위 D-2/3/1 순서대로 재확인)

  • windows 사용자로 시도됨 (Administrator 키) vs WSL 사용자(doobuntu)
    → VS Code Host 설정을 wsl(Port 2222, User doobuntu) 로 분리


F) 접속 시 기본 디렉터리(/home/doobuntu/source)로 진입

(권장) 클라이언트 설정

Host wsl
  HostName 192.168.0.4
  Port 2222
  User doobuntu
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes
  RemoteCommand cd /home/doobuntu/source && exec bash -l
  RequestTTY yes

(대안) 서버 측 .bashrc

# ~/.bashrc (SSH 접속시에만 이동)
if [ -n "$SSH_TTY" ]; then
  cd /home/doobuntu/source
fi

G) “한 번에” 재현 가능한 골든 패스

  1. WSL sshd
sudo apt update
sudo apt -y install openssh-server
sudo systemctl enable --now ssh
  1. Windows portproxy + FW
$wslIp = (wsl.exe hostname -I).Trim().Split(' ')[0]
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=2222 2>$null
netsh interface portproxy add    v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=$wslIp connectport=22
netsh advfirewall firewall add rule name="WSL SSH 2222" dir=in action=allow protocol=TCP localport=2222
  1. WSL 사용자 키 설치
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo 'ssh-ed25519 AAAA...from-mac' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chown -R doobuntu:doobuntu ~/.ssh
sudo systemctl restart ssh
  1. Mac SSH config
Host wsl
  HostName 192.168.0.4
  Port 2222
  User doobuntu
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes
  RemoteCommand cd /home/doobuntu/source && exec bash -l
  RequestTTY yes
  1. 검증
nc -vz 192.168.0.4 2222
ssh -vvv wsl

H) 보안 & 편의 TIP

  • 외부 공개 시:

    • C:\ProgramData\ssh\sshd_config

      PubkeyAuthentication yes
      PasswordAuthentication no
      
    • 포트포워딩 시 임의 포트(예: 2222) 사용

  • WSL IP 변경 자동화(로그온 시 portproxy 재설정) 스크립트:

# C:\wsl\refresh-wsl-ssh.ps1
$wslIp = (wsl.exe hostname -I).Trim().Split(' ')[0]
if ($wslIp) {
  netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=2222 2>$null
  netsh interface portproxy add    v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=$wslIp connectport=22
}
  • 기본 로그인 쉘을 PowerShell로 (원하면):
New-Item -Path HKCU:\Software\OpenSSH -Name DefaultShell -Force | Out-Null
New-ItemProperty -Path HKCU:\Software\OpenSSH -Name DefaultShell `
  -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" `
  -PropertyType String -Force | Out-Null

I) 빠른 체크리스트

  • Windows(OpenSSH):

    • administrators_authorized_keys 에 키 있고 ACL OK?

    • Restart-Service sshdssh -vvv localhost 정상?

  • WSL:

    • openssh-server 기동(ss -tnlp | grep :22)

    • ~/.ssh/authorized_keys 권한/소유자 OK?

  • portproxy:

    • netsh interface portproxy show v4tov40.0.0.0:2222 -> <WSL_IP>:22
  • Mac:

    • nc -vz 192.168.0.4 2222 성공?

    • ssh -vvv wslServer accepts key 확인?

댓글

첫 번째 댓글을 남겨보세요.