VirtualBox Ubuntu ssh 密鑰登錄
我之前進行嵌入式開發(fā)時,利用 VirtualBox Ubuntu 搭建過開發(fā)環(huán)境,但是在虛擬機里面閱讀代碼和寫代碼的體驗都不好,總是會有一種延遲的感覺。
于是我嘗試了使用 Ubuntu 橋接網(wǎng)絡(luò),ssh 密碼登錄的方式登錄虛擬機進行開發(fā),但這種開發(fā)方式也有兩個問題:
- 由于是橋接網(wǎng)絡(luò),Ubuntu 與物理機是在同一個局域網(wǎng),也就是說物理機如果處于不同的路由器下(比如公司和家里),它所屬的局域網(wǎng)也不一樣,因此 Ubuntu 利用 DHCP 會自動獲得一個新的 IP 地址,這就導(dǎo)致需要手動輸入 Ubuntu 的 IP 地址才能連上。在此應(yīng)用場景下將 Ubuntu 的 IP 地址設(shè)置為靜態(tài)地址也沒用。
- 每次登錄都需要輸入密碼,重新連接時也需要輸入密碼,尤其是利用 VSCode 連接 Ubuntu,一段時間沒有操作后,就需要你輸入密碼重新登錄,十分繁瑣。這里還不需要考慮密碼登錄的安全性問題,光是這些麻煩在實際應(yīng)用中就很頭痛了。
下面我介紹一種 Ubuntu 采用網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)上網(wǎng),同時在 VirtualBox 配置主機和 Ubuntu 的端口轉(zhuǎn)發(fā)規(guī)則,利用 ssh 密鑰方式登錄虛擬機。這能夠完美解決上述的兩個問題,算是對工具使用方式的改進吧,
VirtualBox NAT 設(shè)置
新添加一個網(wǎng)卡 2,“連接方式”設(shè)置為“網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)”,然后點擊“端口轉(zhuǎn)發(fā)”。

點擊右上角的 "+" ,創(chuàng)建一條新的端口轉(zhuǎn)發(fā)規(guī)則,協(xié)議使用 TCP,子系統(tǒng)端口選擇 22(ssh 登錄的默認端口),主機端口需要選擇一個未被使用的端口,我這里選擇 1111 。點擊 OK,就可以啟動 Ubuntu 了。

關(guān)于如何在 Win10 查找某一端口是否被占用,可以參考博客win10端口被占用如何查看。在命令行界面輸入 netstat -ano 查看所有被占用的端口,netstat -aon | findstr "8080" 查找某一端口是否被占用。
C:\Users\M2019>netstat -aon | findstr "1111"
TCP 0.0.0.0:1111 0.0.0.0:0 LISTENING 25840
Ubuntu ssh 配置
輸入 sudo vim /etc/ssh/sshd_config 編輯 ssh 的配置文件。
需要配置如下信息:
- 取消
Port 22的注釋。 - 取消
PubkeyAuthentication yes的注釋,并確保公鑰認證后面為 yes。 - 取消
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2的注釋。 - 取消
PasswordAuthentication no的注釋,并確保密碼認證后面為 no 。
保持退出編輯后,輸入 sudo /etc/init.d/ssh restart 重啟 ssh 服務(wù)。
ssh 密鑰生成并上傳
Win10 生成 ssh 密鑰可參考博客:Windows下生成SSH密鑰 。
利用 ssh-keygen 生成密鑰對(公鑰、私鑰)。我這里生成的私鑰名稱為 virtualbox_id_rsa,公鑰名稱為 virtualbox_id_rsa.pub 。
然后就需要上傳公鑰到服務(wù)器了,這樣我們就可以使用私鑰去連接服務(wù)器。
在 Ubuntu 服務(wù)器里,輸入
jackis@jackis-VirtualBox:~$ cd .ssh/
jackis@jackis-VirtualBox:~/.ssh$ vim virtualbox_id_rsa.pub
將之前生成的公鑰(virtualbox_id_rsa.pub)里的內(nèi)容復(fù)制到服務(wù)器里,保存并退出編輯。
輸入下述命令將該公鑰加入 ssh 的認證密鑰。
jackis@jackis-VirtualBox:~/.ssh$ cat virtualbox_id_rsa.pub >> authorized_keys
如此便完成了公鑰的安裝。為了確保連接成功,請保證以下文件權(quán)限正確:
jackis@jackis-VirtualBox:~/.ssh$ chmod 600 authorized_keys
jackis@jackis-VirtualBox:~/.ssh$ chmod 700 ~/.ssh
然后輸入 sudo /etc/init.d/ssh restart 重啟 ssh 服務(wù)。
私鑰登錄服務(wù)器
這是 Ubuntu 服務(wù)器端的 ssh 已經(jīng)配置好了,我們就可以利用私鑰去登錄 Ubuntu 了,此處記錄 XShell 和 VSCode 兩種登錄方式。
XShell
新建一個會話,在左側(cè)“連接”選項欄里,“名稱”可以隨意更改,我這里為虛擬機,“主機”里的內(nèi)容為 127.0.0.1,“端口號”為前面 VirtualBox 設(shè)置的端口轉(zhuǎn)發(fā)規(guī)則的端口號,我這里為 1111 。

點擊左側(cè)的“用戶身份驗證”,“方法”選擇 Public Key ,然后點擊“用戶密鑰”右側(cè)的“瀏覽”。

然后點擊“導(dǎo)入”,將之前生成的私鑰文件導(dǎo)入,導(dǎo)入成功就能夠在左側(cè)看到私鑰了。點擊“確定”。

在“用戶密鑰”這里選擇剛才導(dǎo)入的私鑰文件,“用戶名”這里輸入登錄的用戶賬戶,點擊確定。

此時就能夠正常通過私鑰連接服務(wù)器了。
VSCode
我這里使用 VSCode 的 Remote - SSH 插件連接虛擬機,需要配置一些內(nèi)容。
打開 VSCode Remote - SSH 插件配置文件,默認在 C:/Users/<username>/.ssh/config 。
添加下述內(nèi)容:
Host 虛擬機
HostName 127.0.0.1
Port 1111
User jackis
IdentityFile C:/Users/M2019/.ssh/virtualbox_id_rsa
- Host 是主機在插件處顯示的名稱。
- HostName 是主機的 IP 地址。
- Port 是主機的端口。
- User 是登錄賬戶。
- IdentityFile 是你的私鑰的完整路徑名。
配置完成后,即可正常連接虛擬機了。
如果配置過程中出現(xiàn)了錯誤,歡迎在下方留言一起交流。