学习 Linux C / C++ 开发,安装了 Ubuntu Server 虚拟机,接下来记录两种方式的开发环境:1. Samba文件映射 + 任何一个IDE; 2. vscode remote 远程连接。两种方式都需要安装 ssh 来进行远程连接。
1 samba + any IDE
samba + any IDE 是为了写代码的环境,安装好 samba 并完成文件映射之后,在宿主机上使用熟悉的 IDE 打开共享文件夹,就可以写代码了。但是在宿主机上Linux 中的命令需要远程连接,使用命令行,因此首先还是需要安装 ssh
1.1 安装 ssh
SSH(Secure Shell)是一种网络协议,用于安全地访问和管理远程系统。SSH 通过加密连接提供了一种安全的方法来访问和控制远程计算机,特别是在不安全的网络环境中。开启 SSH 服务之后,我们可以在宿主机中使用终端登录到 Ubuntu。
- 查询是否安装 openssh
通过如下命令查询是否已安装 SSH,若出现openssh-client和openss-server,则说明系统已经安装 OpenSSH
dpkg --list | grep ssh
ii libssh-4:arm64 0.9.6-2ubuntu0.22.04.2 arm64 tiny C SSH library (OpenSSL flavor)
ii openssh-client 1:8.9p1-3ubuntu0.5 arm64 secure shell (SSH) client, for secure access to remote machines
ii openssh-server 1:8.9p1-3ubuntu0.5 arm64 secure shell (SSH) server, for secure access from remote machines
ii openssh-sftp-server 1:8.9p1-3ubuntu0.5 arm64 secure shell (SSH) sftp server module, for SFTP access from remote machines
ii ssh-import-id 5.11-0ubuntu1 all securely retrieve an SSH public key and install it locally
- 安装 openssh
如果没有安装,输入以下命令安装openssh
sudo apt-get install ssh
- 查看 ssh 服务是否启动
~$ ps -auxf | grep ssh
root 987 0.0 0.1 15168 8352 ? Ss Jan05 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 25972 0.0 0.1 18144 9512 ? Ss 12:00 0:00 \_ sshd: puyijun [priv]
puyijun 26073 0.0 0.0 18440 6524 ? S 12:00 0:00 \_ sshd: puyijun@pts/0
puyijun 26098 0.0 0.0 5892 2000 pts/0 S+ 12:07 0:00 \_ grep --color=auto ssh
- mac 终端连接虚拟机
首先在虚拟机中查看 IP 地址,使用命令 ifconfig
:
在终端中输入 ssh 命令:ssh username@IP,进行连接,没有配置密钥认证的情况下需要输入远端对应的用户名密码,配置密钥认证后则可以直接进行连接。ssh 密钥认证见 2.1
ssh username@IPaddress
1.2 安装 samba 与文件映射
Samba 是一款开源软件,主要用于实现 Windows 文件和打印服务的共享。它允许不同操作系统(如基于 Unix 的系统和 Windows)之间共享文件和打印机资源。Samba 使用了 SMB/CIFS(Server Message Block/Common Internet File System)协议,这是 Windows 系统中用于网络文件和打印服务的标准协议。Samba 也允许在 macOS 宿主机和 Ubuntu 虚拟机之间建立文件共享。
原理
在 Ubuntu 虚拟机上,Samba 作为服务器运行,它配置为提供某个文件夹的网络访问,这意味着这个文件夹会被“共享”出去,使得其他网络上的计算机可以访问。
macOS 宿主机使用 SMB 协议连接到 Ubuntu 虚拟机的 Samba 服务器。通过 Finder 中的 “连接服务器” 功能实现,输入 SMB 地址如
smb://<Ubuntu虚拟机的IP>/<共享名称>
。
- 安装 samba 服务器
sudo apt-get install samba
- 在 Ubuntu 中创建共享文件夹
mkdir share
sudo chmod 777 share/ -R //更改权限(-R)
- 修改 samba 配置文件
sudo vim /etc/samba/smb.conf
将下面的 share 内容添加在配置文件的末尾
- 添加 samba 账号和密码
- 在 Mac 中进行连接
在 finder 图标上右键,选择连接服务器,输入 SMB 地址 smb://<Ubuntu虚拟机的IP>
以及注册 samba 时的用户名和密码,即可连接成功
1.3 加载 Linux 内核
直接用 vscode 打开共享目录 share 中的一个项目文件夹,里面的代码会有红色波浪线的提醒,这是由于 IDE 中只有这一部分项目代码,没有 Linux 的完整内核代码,就无法从 include 的路径中寻找对应的函数,因此在写代码时,对应内核代码的结构体等也没有补全提醒
为了更舒服地写代码,可以将 Linux 对应版本的内核源码加载到项目中,这样写代码就不会出现红色波浪线,并且有自动补全功能
具体加载内核源码到项目的方法根据 IDE 自行查找即可
2 vscode remote
直接使用强大的 vscode 的远程连接功能连接到虚拟机,既有可以查看文件目录的 IDE,又有命令行,还不用加载内核源码,很方便
1.1 ssh 密钥认证
vscode 远程连接的连接时需要输入密码进行认证,连接后打开文件夹需要输入密码认证,后续如果关闭文件夹再次打开同样需要输入密码认证,很麻烦。可以选择使用 ssh 密钥认证的方式,不需要手动输入字符串的密钥,这种方法也更加的安全和便捷,GitHub 中拉代码也可以选择 ssh 协议,使用 ssh 密钥认证不需要手动输入字符串密钥
原理
- 密钥对的生成
- 当创建 SSH 密钥对时,生成了两个密钥:一个私钥和一个公钥。这两个密钥在数学上是相互关联的。
- 私钥保留在您的本地计算机上,必须保密。
- 公钥可以安全地分享,因为没有它无法解密通过私钥加密的信息。
- 复制公钥到服务器
- 将公钥复制到远程服务器的
~/.ssh/authorized_keys
文件中。这使得服务器知道“哪些公钥对应的私钥持有者被允许登录”。
- 身份验证过程
- 当尝试通过 SSH 连接到服务器时,服务器查看
~/.ssh/authorized_keys
文件,并使用文件中的公钥来验证您的身份。- 服务器使用存储的公钥加密一个随机生成的挑战消息(challenge message)并发送给客户端。
- 您的 SSH 客户端使用私钥解密这个消息。由于只有匹配的私钥才能解密由公钥加密的消息,这证明了您拥有相应的私钥。
- 解密后的消息被发送回服务器以验证身份。如果客户端成功解密并响应了服务器的挑战,身份验证就完成了。
具体步骤
- 宿主机(本机)生成密钥对
ssh-keygen -t rsa -b 2048
一路回车,不设置密码。这将生成一对密钥:默认情况下,私钥位于 ~/.ssh/id_rsa
,公钥位于 ~/.ssh/id_rsa.pub
。
- 将公钥拷贝到服务器上
ssh-copy-id -i ~/.ssh/id_rsa.pub username@remote_host
这个命令会将公钥添加到远程主机的 ~/.ssh/authorized_keys
文件中
接下来就可以直接使用 ssh username@hostip
进行连接,不需要密码
IP 变化后连接问题
比如虚拟机的网络连接方式从 NAT --> 桥接,IP 地址发生了变化,此时 ssh 命令会出现以下错误:
错误消息表明,SSH 客户端在连接远程主机时检测到主机密钥发生了变化,而且密钥不再匹配之前保存在 known_hosts
文件中的密钥。这可能是由于以下几种情况之一引起的:
- 虚拟机 IP 地址更改: 当你将虚拟机的网络连接方式从 NAT 更改为桥接时,虚拟机的网络配置可能会更改,导致其分配了一个新的 IP 地址。因此,SSH 客户端认为远程主机的身份已发生变化。
- 虚拟机或主机操作系统重装或更改: 如果虚拟机或主机的操作系统重新安装或更改了 SSH 密钥,也会导致主机密钥的变化。
为了解决这个问题,可以采取以下步骤:
- 更新
known_hosts
文件: 编辑known_hosts
文件,删除其中包含旧主机密钥的行。在你的情况下,Offending ED25519 key 的信息位于/Users/yijunpu/.ssh/known_hosts:19
,使用文本编辑器打开该文件,删除这一行。 - 删除旧密钥后,尝试再次连接到虚拟机。SSH 客户端会检测到新的主机密钥,并询问是否要添加新密钥。接受新密钥并建立连接。
1.2 vscode 远程连接
进行 ssh 密钥认证之后,可以愉快地使用 vscode remote 插件进行远程连接啦
- Vscode 插件中搜索并安装 Remote-SSH 插件
- connect to host
点击左下角的远程连接图标,选择 connect to host,接下来显示在已有的 ssh 配置文件中的 ssh 连接,可以选择 configure ssh hosts 来修改、增加、删除 ssh hosts,注意选择的是 个人用户 下面的配置文件
添加或者修改对应的虚拟机 host,Host
为这个连接的名字(不重要,只是标识符),HostName
为远程连接对应的 IP,User
为远程连接使用的用户名。这里由于我们使用的 ssh 密钥认证,就不需要密码。
- 打开目标文件夹
连接成功后,open folder 打开目标文件夹