使用VSCode進行遠程煉丹
- 2019 年 11 月 29 日
- 筆記
作者:韓冰https://zhuanlan.zhihu.com/p/89662757 本文已由作者授權,未經允許,不得二次轉載
本文分享一下我使用vscode作為我的煉丹爐的使用心得。在我們開發過程中,經常需要連接遠程的服務器進行煉丹。通常情況下,我們會使用Pycharm的遠程開發功能,同步服務器與本地的項目文件,使用遠程解釋器進行開發。但是使用過的同學都知道,重量級的Pycharm每次遠程同步、加載遠程解釋器都需要相當長的時間。如果我們想要隨時切換公司、學校、家裡的各個場景,pycharm的同步、加載就成了一場噩夢。特別是當我們的python環境安裝了很多依賴包,項目生成了大量文件的時候更是這樣。直到vscode推出了Remote Development開發包,便完全解決了這個問題。讓我可以在不同的場景快速切換,無需等待同步文件、環境。因為vscode遠程開發完全是運行在服務器上的,我們本地的vsocde只是一個前端界面,所以根本無需同步服務器上的文件、解釋器依賴庫就可以體驗到與本地開發完全相同的體驗。自從使用了vscode的Remote Development功能,我便完全拋棄了Pycharm。
下載安裝
官網下載vscode對應系統版本的安裝包。
https://code.visualstudio.com/
安裝遠程開發插件

安裝完成後,vscode左側多出了一個菜單欄,我們點擊配置按鈕配置遠程服務器的地址。

選擇當前用戶目錄下的ssh配置文件進行配置

每個服務器需要配置ip,用戶名,ssh端口等信息。配置完成後,點擊連接到遠程的按鈕

按照提示輸入登錄密碼後,如果左下角顯示了服務器的名稱,就說明連接成功了。

連接成功後,你便可以在遠程服務器上安裝各種插件

圖示的圖標說明插件已經在遠程安裝。此時你便可以打開遠程的任何文件夾進行項目開發,所有的編輯修改,運行代碼也都會在遠程進行執行。體驗過之後就會感覺超級方便。媽媽再也不用擔心我同步文件,切換開發機了。同時,vscode還會非常貼心地為我們記錄曾經打開過的文件夾,我們可以直接點擊,連接服務器打開文件夾一步到位。

設置免密登錄
上述配置完成後,還有一個小問題就是我們每次遠程連接都要輸入密碼,很麻煩。所以這裡我們設置一下ssh的免密登錄。
在本地pc生成ssh公鑰和私鑰
ssh-keygen -t rsa
這樣會在當前目錄生成名為id_rsa的私鑰文件和名為id_rsa.pub的公鑰文件,-t表示密鑰類型是rsa。 如果你只輸入ssh-keygen生成的RSA密鑰長度為2048,如果你對安全性要求比較高可以指定4096位的長度:
ssh-keygen -b 4096 -t rsa
這裡-b就是多少位,當你在生成SSHKEY的時候在命令行下會提示你Enter file in which to save the key,讓你確認密鑰文件保存的路徑,一般回車即可(一般默認會在當前用戶家目錄下的.ssh目錄下)。第二個提示是 Enter passphrase (empty for no passphrase) 讓你輸入一個密鑰的密碼,如果不輸入則留空;回車生成公私鑰完畢 。(這裡建議密碼留空)
手動上傳公鑰文件
將本地的公鑰文件上傳到服務器上,然後在服務器需要免密登錄的用戶家目錄下查看是否有 ~/.ssh/authorized_keys
這個文件, 如果沒有手動創建一個:
touch ~/.ssh/authorized_keys
然後我們將公鑰內容寫入到authorized_keys文件中,因為這個文件可能已經有內容了,所以你可以使用如下方式
cat -n ~/.ssh/rsa.pub ~/.ssh/authorized_keys
- 將.ssh目錄的權限為700
- 將authorized_keys目錄的權限為600
chmod 700 ~/.ssh/ chmode 600 ~/.ssh/authorized_keys
自動上傳本地公鑰
ssh-copy-id 複製公鑰
這個工具還蠻有用的,不過它會將我本地的所有公鑰都傳到服務器,使用方法:
ssh-copy-id -p 22 username@remote-server
windows中沒有ssh-copy-id可以使用以下命令代替
cat ~/.ssh/id_rsa.pub | ssh -p 22 username@remote-server "cat >> ~/.ssh/authorized_keys"
配置完成後,再次使用vscode遠程連接服務器就不用再輸入密碼了。
使用autossh進行內網穿透
設想這樣的場景,你在公司或者學校有一台用於煉丹的服務器,但是只能在內網訪問。我在家裡使用筆記本也想連接到遠程的服務器中,這時我們應該怎麼辦呢。
答案是我們需要一台具有公網ip的服務器作為中繼,使用autossh將公網服務器作為代理服務器。假設公網服務器為主機A,內網煉丹爐為主機B,我們的筆記本為C則
主機B上的操作
將主機B上的公鑰拷貝到公網主機C實現B對C的免密登錄(具體參考《ssh設置免密登錄》),在主機B上執行autossh命令(可以在screen環境下執行)
screen -S reverse_proxy autossh -M 5555 -NR 9999:127.0.0.1:22 -p 22 username@remote-server
-M是公網主機echo的地址,9999是公網服務器的轉發端口,第一個22是B主機ssh端口,-p 後面是外網主機ssh端口,最後一個參數是公網主機遠程登錄地址。使用該命令時保證公網主機5555, 9999端口都是空閑狀態。(這兩個端口可以改成任意空閑端口)
主機A上操作
主機A此時可以直接通過ssh訪問公網主機的9999端口訪問到B主機的終端,具體操作為
ssh -p 9999 username@remote-server
驗證登錄成功後,我們在vscode中配置A服務器的ip,和轉發端口後就可以連接我們的內網主機了。
功能展示
連接加載速度超快,與本地體驗完全相同的遠程調試。
無需配置,直接運行遠程的jupyter notebook。而且jupyter notebook還支持自動補全和調試功能,比原生的notebook更加強大。