我平時都是用 VSC 連到本地 WSL2 來撰寫程式碼,這樣一來想玩遊戲就玩,想開 Terminal 敲指令就敲,省得額外安裝一套系統做切換真的是蠻方便的。 (但是踩過坑 ㄏ) 過去想要在另一台主機上寫程式的話,我都是把程式碼丟到 Github 上的私人 Repo,再抓到另一台主機上接續著寫。 隨著寫的程式碼越來越多,最近發現有些程式碼,若是處於測試中或是半成品不想丟 Github 又想轉移戰地的話,遠端會是個比較方便的做法。 --- # 🐧 VS Code Remote WSL2 ![image](https://hackmd.io/_uploads/HkEbbglPp.png) 在 VSC 中,若想要連接本地 WSL,先安裝 WSL 套件,再點擊左下角的 ![image](https://hackmd.io/_uploads/HJ2KWeePT.png) 後,選擇「連線至 WSL」即可。 ==當然,得要有安裝 Windows Subsystem for Linux (WSL) 才行。== 若是想要連線至遠端 WSL,就要透過另一個套件: ![image](https://hackmd.io/_uploads/By09GeeDp.png) <br> ## ✏ ssh WSL 的前置作業 :::warning 在開始遠端連線之前,由於鏡像模式需要 WSL2 2.0 以上,需要先設定點東西: * 以管理員身分開啟 Powershell,並執行: ```powershell= wsl --update --pre-release ``` * 建立 `%UserProfile%/.wslconfig`,將以下 code 存成 bat 檔案後執行: ```bash= @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` 檔案: ```powershell= [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 ::: <br> ## 🔓 登入驗證 做完上面的工作後,就可以點擊 ![image](https://hackmd.io/_uploads/HJ2KWeePT.png) ,選擇「連線到主機」,再選擇「新增主機」,VSC 會要求你輸入 `ssh hello@microsoft.com -A` 格式的登入資料。 > 這邊的意思其實就是: > ssh <遠端使用者名稱>@<遠端裝置名稱> 或 <遠端主機 IP> > Windows 裝置名稱在 `設定 > 系統 > 關於` 可以找到 > IP 若是兩台在同個區網可以填虛擬 IP 接下來 VS Code 會要求輸入遠端機的密碼(如果有),若是資料正確就可以正常登入囉~ 但連上去時還只是在遠端機的 Windows 系統,再點擊一次 ![image](https://hackmd.io/_uploads/HJ2KWeePT.png) 選擇「連線至 WSL」,若有請求密碼就再次輸入即可。 --- ## 🔑 金鑰登入 每次登入都要輸入密碼實在是太麻煩了,有沒有什麼方法可以解決呢? 有的,可以透過在本地機生成公私鑰,將公鑰加入至遠端機的 `authorized_keys` 裡,實現金鑰登入。 :::info * 開啟 Powershell,生成一組公私鑰,基本上維持預設值,按 Enter 至完成即可。 產生的檔案副檔名為 `.pub` 的是公鑰,而***沒有附檔名的是私鑰***,記得保管好。 ```powershell= new-item -itemtype directory -path $env:UserProfile/.ssh cd $env:UserProfile/.ssh ssh-keygen ``` * 取出公鑰資料,透過 ssh 在遠端機將資料新增到遠端的 `authorized_keys` 檔案裡。 ```powershell= $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 ::: 如此一來,以後登入就不用再繁瑣的重複輸入密碼囉。