Try   HackMD

我平時都是用 VSC 連到本地 WSL2 來撰寫程式碼,這樣一來想玩遊戲就玩,想開 Terminal 敲指令就敲,省得額外安裝一套系統做切換真的是蠻方便的。
(但是踩過坑 ㄏ)

過去想要在另一台主機上寫程式的話,我都是把程式碼丟到 Github 上的私人 Repo,再抓到另一台主機上接續著寫。
隨著寫的程式碼越來越多,最近發現有些程式碼,若是處於測試中或是半成品不想丟 Github 又想轉移戰地的話,遠端會是個比較方便的做法。


🐧 VS Code Remote WSL2

image

在 VSC 中,若想要連接本地 WSL,先安裝 WSL 套件,再點擊左下角的

image 後,選擇「連線至 WSL」即可。
當然,得要有安裝 Windows Subsystem for Linux (WSL) 才行。

若是想要連線至遠端 WSL,就要透過另一個套件:

image


✏ ssh WSL 的前置作業

在開始遠端連線之前,由於鏡像模式需要 WSL2 2.0 以上,需要先設定點東西:

  • 以管理員身分開啟 Powershell,並執行:
wsl --update --pre-release
  • 建立 %UserProfile%/.wslconfig,將以下 code 存成 bat 檔案後執行:
@echo off IF EXIST %UserProfile%/.wslconfig (cd %UserProfile%& ren .wslconfig .wslconfig.bak) (echo [wsl2] echo processors=4 echo memory=8GB echo swap=2GB echo [experimental] echo networkingMode=mirrored echo autoMemoryReclaim=gradual echo dnsTunneling=true echo autoProxy=true echo firewall=true echo sparseVhd=true)>%UserProfile%/.wslconfig& exit

或是自行在 %UserProfile% 建立一個 .wslconfig 檔案:

[wsl2] # CPU核心上限 processors=4 # 記憶體大小 memory=8GB # 虛擬記憶體大小 swap=2GB #[實驗性功能] [experimental] # 設定網路模式: 鏡像 networkingMode=mirrored # 自動釋放RAM: 緩慢 autoMemoryReclaim=gradual # 變更 WSL 代理方式 dnsTunneling=true autoProxy=true firewall=true sparseVhd=true

詳細請參考 https://learn.microsoft.com/zh-tw/windows/wsl/wsl-config


🔓 登入驗證

做完上面的工作後,就可以點擊

image ,選擇「連線到主機」,再選擇「新增主機」,VSC 會要求你輸入 ssh hello@microsoft.com -A 格式的登入資料。

這邊的意思其實就是:
ssh <遠端使用者名稱>@<遠端裝置名稱> 或 <遠端主機 IP>
Windows 裝置名稱在 設定 > 系統 > 關於 可以找到
IP 若是兩台在同個區網可以填虛擬 IP

接下來 VS Code 會要求輸入遠端機的密碼(如果有),若是資料正確就可以正常登入囉~
但連上去時還只是在遠端機的 Windows 系統,再點擊一次

image 選擇「連線至 WSL」,若有請求密碼就再次輸入即可。


🔑 金鑰登入

每次登入都要輸入密碼實在是太麻煩了,有沒有什麼方法可以解決呢?
有的,可以透過在本地機生成公私鑰,將公鑰加入至遠端機的 authorized_keys 裡,實現金鑰登入。

  • 開啟 Powershell,生成一組公私鑰,基本上維持預設值,按 Enter 至完成即可。
    產生的檔案副檔名為 .pub 的是公鑰,而沒有附檔名的是私鑰,記得保管好。
new-item -itemtype directory -path $env:UserProfile/.ssh cd $env:UserProfile/.ssh ssh-keygen
  • 取出公鑰資料,透過 ssh 在遠端機將資料新增到遠端的 authorized_keys 檔案裡。
$content = get-content -path $env:UserProfile/.ssh/id_rsa.pub $key = "powershell cd $env:UserProfile; new-item -itemtype directory -path ./.ssh; add-content -path ./.ssh/authorized_keys -value '$content';" ssh <遠端名稱>@<遠端主機 IP> $key

題外話, sftp 也可以傳送檔案到遠端機,格式則跟前面的 ssh 指令一樣;
但要小心,是否會蓋過遠端機資料。

sftp <遠端名稱>@<遠端主機 IP>

傳送格式:

put <本地檔案位置> <遠端目標位置>

詳細請參考 https://learn.microsoft.com/zh-tw/windows-server/administration/openssh/openssh_keymanagement

如此一來,以後登入就不用再繁瑣的重複輸入密碼囉。