完成SSH连接与端口映射
1.SSH连接的三种方式
1.1 使用密码进行SSH远程连接
首先,我们先进入InternStudio开发机平台,进入开发机页面找到已经创建的开发机,点击SSH连接


将复制出来的登录命令粘贴到powerShell中回车执行,这里会要求输入密码,将密码复制粘贴后回车即可,密码不会在窗口展示。回车后出现如下界面为登录成功。

此处由于事先已经配置好SSH密钥已经能直接直接连接成功
1.2 使用SSH密钥进行SSH远程连接
第一种方式,每次连接都需要输入密码比较麻烦,现在我们尝试第一种使用SSH密钥的方式。
SSH密钥是一种安全便捷的登录认证方式,用于在SSH协议中进行身份验证和加密通信。
ssh-keygen支持RSA和DSA两种认证密钥。
常用参数包括:
- -t:指定密钥类型,如dsa、ecdsa、ed25519、rsa。
- -b:指定密钥长度。
- -C:添加注释。
- -f:指定保存密钥的文件名。
- -i:读取未加密的ssh-v2兼容的私钥/公钥文件。
这里我们使用RSA算法生成密钥,命令为:
ssh-keygen -t rsa输入命令后一路回车就可以了,这里的密钥默认情况下是生成在~/.ssh/目录下的,~表示的是家目录,如果是windows就是C:\Users\{your_username}\。在powerShell中可以使用Get-Content命令查看生成的密钥,如果是linux操作系统可以使用cat命令。

然后我们回到开发机平台,在首页点击配置SSH Key,接着点击添加SSH公钥,


将刚刚生成的密钥复制下来,粘贴到公钥框中,名称会被自动识别到,最后点击立即添加,SSH Key就配置完成了。

完成SSH Key创建以后,重启终端进行远程连接,就会跳过密码输入这一步了。
1.3 使用VSCODE进行SSH远程连接
如果要在VScode中进行远程连接,我们还需要安装一套插件,如何安装VScode大家可以网上搜索一下非常简单。

如果你已经安装好了VScode,可以在点击左侧的扩展页面,在搜索框中输入“SSH”,第一个就是我们要安装的插件,点开它“Install”就可以了。

安装完成插件以后,点击侧边栏的远程连接图标,在SSH中点击“+”按钮,添加开发机SSH连接的登录命令。
同样,将开发机的SSH连接复制出来黏贴到vscode,回车。

回车后会让你编辑配置,配置文件这一块默认就好,当然你也可以自定义,下面是配置文件的具体内容:(这里包括了你所有远程连接过的信息)
Host ssh.intern-ai.org.cn #主机ip也可以是域名
HostName ssh.intern-ai.org.cn #主机名
Port 42896 #主机的SSH端口
User root #登录SSH使用的用户
StrictHostKeyChecking no
UserKnownHostsFile /dev/null后面的一些配置选项,如果想要手动添加就需要按照上面的格式对相应部分进行修改。
如果将
StrictHostKeyCheckingno和UserKnownHostsFile/dev/null删除掉会跳出指纹验证的弹窗:
StrictHostKeyChecking no表示禁用严格的主机密钥检查。这意味着当连接到一个新的 SSH 服务器时,不会严格验证服务器的主机密钥,可能会带来一定的安全风险。
UserKnownHostsFile /dev/null则是将用户已知的主机密钥文件设置为 /dev/null ,这实质上是忽略了对已知主机密钥的记录和使用。但是在一般的安全实践中,不建议随意禁用严格的主机密钥检查。
然后在右下角弹出来的提示窗口中点击“连接”就可以远程到开发机中了。


远程连接完成以后,可以选择打开的文件夹,也可以称为工作目录,你可以选择开发机中的也可以选择本地的,开发机中的文件夹,就是我们前面提到的云盘。
当下一次进行远程连接的时候,就不需要输入登录命令等信息了,只需要打开vscode的远程连接就可以看到第一次连接的开发机信息,下面的root代表我们第一连接开发机时使用的是/root工作目录。

并且下图中的->表示进入开发机后需要重新选择工作目录:

而下图中的->表示进入上一次开发机选择的工作目录:

每次选择的工作目录都会在这个开发机信息下面显示:(这里就多了一个lagent的工作目录)

下面我们来介绍一下什么时端口映射。
2.端口映射
2.1 什么是端口映射
端口映射是一种网络技术,它可以将外网中的任意端口映射到内网中的相应端口,实现内网与外网之间的通信。通过端口映射,可以在外网访问内网中的服务或应用,实现跨越网络的便捷通信。
那么我们使用开发机为什么要进行端口映射呢?
因为在后续的课程中我们会进行模型web_demo的部署实践,那在这个过程中,很有可能遇到web ui加载不全的问题。这是因为开发机Web IDE中运行web_demo时,直接访问开发机内 http/https 服务可能会遇到代理问题,外网链接的ui资源没有被加载完全。
所以为了解决这个问题,我们需要对运行web_demo的连接进行端口映射,将外网链接映射到我们本地主机,我们使用本地连接访问,解决这个代理问题。下面让我们实践一下。
地主机,我们使用本地连接访问,解决这个代理问题。下面让我们实践一下。

我们先根据一个图了解一下开发机端口映射是如何工作的:
下面会有实践步骤这里先理解如何进行端口映射的
ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no上面是一个端口映射命令,在主机上运行该命令即可进行端口映射,下面用一个流程图了解端口映射的过程:
暂时无法在飞书文档外展示此内容
个人PC会远程连接到开发机唯一暴露在外的37367端口,(这个在SSH的时候提到过每个人的开发机暴露的端口都不一样),并设置隧道选项。暴露端口是作为中转站进行流量的转发。
-C:启用压缩,减少传输数据量。-N:不执行远程命令,只建立隧道。-g:允许远程主机连接到本地转发的端口。当在个人PC上执行这个SSH命令后,SSH客户端会在本地机器的7860端口上监听。
任何发送到本地7860端口的流量,都会被SSH隧道转发到远程服务器的127.0.0.1地址上的7860端口。
这意味着,即使开发机的这个端口没有直接暴露给外部网络,我们也可以通过这个隧道安全地访问远程服务器上的服务。。
2.2 如何进行端口映射
2.2.1 使用SSH命令进行端口映射
我们还是来到开发机界面,找到我们的开发机,点击自定义服务,复制第一条命令,

ssh -p 42896 root@ssh.intern-ai.org.cn -CNg -L {本地机器_PORT}:127.0.0.1:{开发机_PORT} -o StrictHostKeyChecking=no下面给他大家介绍一下命令各部分的含义:
-p42896:是指定 SSH 连接的端口为 42896,这个前面提到过。root@ssh.intern-ai.org.cn:表示要以root用户身份连接到ssh.intern-ai.org.cn这个主机。-CNg:-C通常用于启用压缩。-N表示不执行远程命令,仅建立连接用于端口转发等。-g允许远程主机连接到本地转发的端口。
-L {本地机器_PORT}:127.0.0.1:{开发机_PORT}:这是设置本地端口转发,将本地机器的指定端口(由{本地机器_PORT}表示)转发到远程主机(这里即ssh.intern-ai.org.cn)的127.0.0.1(即本地回环地址)和指定的开发机端口(由{开发机_PORT}表示)。-o StrictHostKeyChecking=no:关闭严格的主机密钥检查,这样可以避免第一次连接时因为未知主机密钥而产生的提示或错误。
当你运行一个web demo的时候,就可以使用这个命令进行端口映射,举个例子:
我们创建一个hello_world.py文件,在文件中填入以下内容:
import socket
import re
import gradio as gr
# 获取主机名
def get_hostname():
hostname = socket.gethostname()
match = re.search(r'-(\d+)$', hostname)
name = match.group(1)
return name
# 创建 Gradio 界面
with gr.Blocks(gr.themes.Soft()) as demo:
html_code = f"""
<p align="center">
<a href="https://intern-ai.org.cn/home">
<img src="https://intern-ai.org.cn/assets/headerLogo-4ea34f23.svg" alt="Logo" width="20%" style="border-radius: 5px;">
</a>
</p>
<h1 style="text-align: center;">☁️ Welcome {get_hostname()} user, welcome to the ShuSheng LLM Practical Camp Course!</h1>
<h2 style="text-align: center;">😀 Let’s go on a journey through ShuSheng Island together.</h2>
<p align="center">
<a href="https://github.com/InternLM/Tutorial/blob/camp3">
<img src="https://oss.lingkongstudy.com.cn/blog/202406301604074.jpg" alt="Logo" width="20%" style="border-radius: 5px;">
</a>
</p>
"""
gr.Markdown(html_code)
demo.launch()
在运行代码之前,需要先使用pip install gradio==4.29.0命令安装以下依赖包,然后在Web IDE的终端中运行了一个hello_world.py

如果不进行端口映射的话,使用本地IP是访问不了的

我可以使用下面的命令,将它输入到powerShell中:
ssh -p 42896 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
这样就代表成功了。(注意:这个命令不返回任何的内容,这样代表端口映射在运行了,然后在网页中打开连接就可以看到web ui的界面了)

2.2.3 使用vscode做端口映射
当然,如果我们运行不同的web ui的话,需要重复输入命令,这样很麻烦,这就需要用到VScode了。前面我们已经SSH远程连接了开发机,VScode提供了自动端口映射的功能,我们不需要手动配置,我们可以使用“Ctrl+Shift+~”快捷键唤醒终端,在终端的右侧可以找到端口选项:


使用 VSCODE 远程连接开发机并创建一个conda环境
conda环境的管理
1.1 使用conda创建一个python环境

创建完可以在.conda/envs目录下看到刚创建的环境

1.2 查看有哪些虚拟环境

1.3 激活与退出虚拟环境
// 切换到base
conda activate
// 切换到base
conda deactivate
// 切换到指定环境
conda activate name
1.4 删除与导出虚拟环境
如果想要删除某个虚拟环境可以使用conda remove --name name --all,如果只删除虚拟环境中的某个或者某些包可以使用conda remove --name name package_name
导出虚拟环境对于特定的环境是非常有必要的,因为有些软件包的依赖关系很复杂,如果自己重新进行创建和配置的话很麻烦,如果我们将配置好的环境导出,这样下次使用还原就行了,而且也可以把配置分享给其他人。
#获得环境中的所有配置
conda env export --name myenv > myenv.yml
#重新还原环境
conda env create -f myenv.yml
删除环境

从导出的文件中恢复环境

任务三:创建并运行test.sh文件
创建test.sh
#!/bin/bash
# 定义导出环境的函数
export_env() {
local env_name=$1
echo "正在导出环境: $env_name"
# 导出环境到当前目录下的env_name.yml文件
conda env export -n "$env_name" > "$env_name.yml"
echo "环境导出完成。"
}
# 定义还原环境的函数
restore_env() {
local env_name=$1
echo "正在还原环境: $env_name"
# 从当前目录下的env_name.yml文件还原环境
conda env create -n "$env_name" -f "$env_name.yml"
echo "环境还原完成。"
}
# 检查是否有足够的参数
if [ $# -ne 2 ]; then
echo "使用方法: $0 <操作> <环境名>"
echo "操作可以是 'export' 或 'restore'"
exit 1
fi
# 根据参数执行操作
case "$1" in
export)
export_env "$2"
;;
restore)
restore_env "$2"
;;
*)
echo "未知操作: $1"
exit 1
;;
esac










