使命目标
- 完成SSH连接与端口映射并运行hello_world.py
- 将Linux基础命令在开发机上完成一遍
- 使用 VSCODE 长途连接开发机并创建一个conda情况
- 创建并运行test.sh文件
学习内容:
使命1
- 完成SSH连接与端口映射并运行hello_world.py
- 连接到开发机端口
- 输入暗码
- 输入hostname检察开发机名称,使用uname -a检察开发机内核信息,使用lsb_release -a检察开发机版本信息,使用nvidia-smi检察GPU的信息
2. 配置SSH密钥进行SSH长途连接
每次长途都输入暗码比较麻烦,我们可以设置SSH key来跳过输入暗码这一步调,在ssh命令中我们可以使用ssh-keygen命令来天生密钥
ssh-keygen支持RSA和DSA两种认证密钥。
常用参数包罗:
- -t:指定密钥类型,如dsa、ecdsa、ed25519、rsa。
- -b:指定密钥长度。
- -C:添加注释。
- -f:指定保存密钥的文件名。
- -i:读取未加密的ssh-v2兼容的私钥/公钥文件。
- 这里我们使用RSA算法天生密钥,命令为:
输入命令后一路回车就可以了,这里的密钥默认情况下是天生在~/.ssh/目次下的,~表现的是家目次,假如是windows就是C:\Users\{your_username}\。在powerShell中可以使用Get-Content命令检察天生的密钥,假如是linux操作系统可以使用cat命令。
然后我们回到开发机平台,在首页点击配置SSH Key,接着点击添加SSH公钥,将刚刚天生的密钥复制下来,粘贴到公钥框中,名称会被自动辨认到,最后点击立即添加,SSH Key就配置完成了。
完成SSH Key创建以后,重启终端进行长途连接,就会跳过暗码输入这一步了。
3. 使用VScode进行SSH长途连接
- 安装Remote-SSH插件
- 点击侧边栏的长途连接图标,在SSH中点击“+”按钮,添加开发机SSH连接的登录命令,最后回车,然后在右下角弹出来的提示窗口中点击“连接”就可以长途到开发机中了
- ssh -p xxxxx root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no
复制代码
5. 运行hello_world.py
- 首先安装相关库(VScode连接开发机进行操作)
- 再创建文件
进入文件内容编辑页面,按i再将必要写入的文件内容按Ctrl+Shift+v粘贴到当前文件中
输入ESC后,再按:wq保存内容退出编辑,命令行终端输入cat hello_world.py检察内容已经写入:
- 运行文件
命令行终端输入python hello_world.py:
可用看到已经运行成功,可以在之前完成端口映射的本地URLhttp://localhost:7860中看到界面:
使命2
- 将Linux基础命令在开发机上完成一遍
1.文件管理
- 创建文件:可以使用 touch 命令创建空文件。
- 创建目次:使用 mkdir 命令。
- 目次切换:使用cd命令。
- 表现所在目次:使用pwd命令。
-
- 检察文件内容:如使用 cat 直接表现文件全部内容,more 和 less 可以分页检察。
cat命令可以检察文件里面的内容,更多的使用命令可以使用--help命令检察:
- -a,--show-all等价于-vET
- -b,--number-non空白数非空输出行,覆盖-n
- -e, 等价于-vE
- -E,--show-结束显示$在每一行的末尾
- -n,--number编号所有输出行
- -s,--crick-空白抑制重复的空输出行
- -t等价于-vT
- -t,--show-tabs将制表符显示为^I
- -v,--show非打印使用^和M-表示法,LFD和TAB除外
复制代码
- 编辑文件:如 vi 或 vim 等编辑器。
进入编辑模式可以使用i,vim的方便之处就是可以在终端进行简单的文件修改。
- 复制文件:用 cp 命令。
复制文件:cp 源文件 目标文件
复制目次:cp -r 源目次 目标目次
但是假如我们是要使用模子的话,这种操作会占用大量的磁盘空间,所以我们一般使用ln命令,这个就和windows的快捷方式一样。
- 创建文件链接:用ln命令。
linux中链接分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特别的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
所以我们一般使用软连接,它的常用的使用方法如下:
ln [参数][源文件或目次][目标文件或目次]
参数如下:
- -s:创建软链接(符号链接)也是最常用的;
- -f:强制执行,覆盖已存在的目标文件;
- -i:交互模式,文件存在则提示用户是否覆盖;
- -n:把符号链接视为一般目录;
- -v:显示详细的处理过程。
复制代码
- 移动文件:通过 mv 命令。
mv命令和rm命令的使用方式很相似,但是mv是用来移动文件或者目次的,同时还可以进行重命名。rm命令则是用来删除文件或者目次的。
常用参数:
- -i:交互模式,覆盖前询问。
- -f:强制覆盖。
- -u:只在源文件比目标文件新时才进行移动。
复制代码 mv demo.py test将demo.py移到test目次中
mv demp.py test.py将文件demo.py重命名为test.py
- -i:交互模式,删除前询问。
- -f:强制删除,忽略不存在的文件,不提示确认。
- -r:递归删除目录及其内容。
复制代码 rm test.py 删除test目次下的test.py文件

rmdir test删除test文件夹

rm -r test递归地删除test文件夹

- 删除目次:rmdir(只能删除空目次)或 rm -r(可删除非空目次)。
- 查找文件:可以用 find 命令。
find命令是Linux系统中一个强大的文件搜索工具,它可以在指定的目次及其子目次中查找符合条件的文件或目次,并实行相应的操作。
以下是find命令的一些常见用法:
按文件名查找:使用-name选项按照文件名查找文件。例如,find /path/to/directory -name "file.txt"将在指定目次及其子目次中查找名为file.txt的文件。
按文件类型查找:使用-type选项按照文件类型查找文件。例如,find /path/to/directory -type f将查找指定目次及其子目次中的全部普通文件。
按文件巨细查找:使用-size选项按照文件巨细查找文件。例如,find /path/to/directory -size +100M将查找指定目次及其子目次中大于100MB的文件。
按修改时间查找:使用-mtime、-atime或-ctime选项按照文件的修改时间、访问时间或状态更改时间查找文件。例如,find /path/to/directory -mtime -7将查找指定目次及其子目次中在7天内修改过的文件。
atime(Access Time):文件近来被访问时间
mtime(Modify Time):文件近来内容修改时间
ctime(Change Time):文件近来权限和属性修改时间
按文件权限查找:使用-perm选项按照文件权限查找文件。例如,find /path/to/directory -perm 755将查找指定目次及其子目次中权限为755的文件。
- Linux 文件权限分类
Linux 文件权限是系统中用于控制对文件和目次访问的紧张概念。权限分为读(Read)、写(Write)、实行(Execute)三个部门,分别表现对文件的读取、修改和实行操作的权限。文件权限可以分为三类用户:
文件全部者(Owner):创建、拥有该文件的用户。
文件所属组(Group):该文件归属的用户组。
其他用户(Others):除了文件全部者和文件所属组之外的用户。
chown newuser filename修改文件全部者
chown newuser:newgroup filename修改文件全部者和组
chmod -R a+x directoryname
chown -R newuser:newgroup directoryname递归改变目次权限和全部者
- Linux 文件权限修改方法
Linux 系统中,可以使用 chmod 命令来修改文件或目次的权限。chmod 命令有两种用法:符号法和数字法。
符号法:
u 表现文件全部者
g 表现所属组
o 表现其他用户
r 表现读取权限
w 表现写入权限
x 表现实行权限
例如,要给文件全部者添加实行权限,可以使用 chmod u+x filename 命令。
数字法:
每个权限用一个数字表现:r=4,w=2,x=1
将它们加在一起表现权限组的数值
例如,要将文件权限设置为文件全部者具有读、写、实行权限(7),同组用户和其他用户具有读、实行权限(5),可以使用 chmod 755 filename 命令。
按用户或组查找:使用-user或-group选项按照文件的全部者或所属组查找文件。例如,find /path/to/directory -user username将查找指定目次及其子目次中属于用户username的文件。
实行操作:使用-exec选项可以对找到的文件实行相应的操作。例如,find /path/to/directory -name "*.txt" -exec rm {} \;将删除找到的全部以.txt结尾的文件。
- 检察文件或目次的详细信息:使用ls命令,如使用 ls -l检察目次下文件的详细信息。
常用参数及使用方法如下:
- -a:显示所有文件和目录,包括隐藏文件(以.开头的文件或目录)。
- -l:以长格式显示详细信息,包括文件权限、所有者、大小、修改时间等。
- -h:与-l结合使用,以人类可读的方式显示文件大小(如K、M、G等)。
- -R:递归列出子目录的内容。
- -t:按文件修改时间排序显示。
复制代码
- 处理文件:进行复杂的文件操作,可以使用sed命令。
sed命令是一种流编辑器,紧张用于文本处理,在处理复杂的文件操作时常常用到,在后续的课程中会使用到,sed命令常用参数及使用示例如下:
参数说明:
- -e<script> 或 --expression=<script>:直接在命令行中指定脚本进行文本处理。
- -f<script文件> 或 --file=<script文件>:从指定的脚本文件中读取脚本进行文本处理。
- -n 或 --quiet 或 --silent:仅打印经过脚本处理后的输出结果,不打印未匹配的行。
复制代码 动作说明:
- a:在当前行的下一行添加指定的文本字符串。
- c:用指定的文本字符串替换指定范围内的行。
- d:删除指定的行。
- i:在当前行的上一行添加指定的文本字符串。
- p:打印经过选择的行。通常与 -n 参数一起使用,只打印匹配的行。
- s:使用正则表达式进行文本替换。例如,s/old/new/g 将所有 "InternLM" 替换为 "InternLM yyds"。
复制代码 2. 进程管理
进程管理命令是进行系统监控和进程管理时的紧张工具,常用的进程管理命令有以下几种:
- ps:检察正在运行的进程
ps aux # 表现系统全部进程的详细信息
- top:动态表现正在运行的进程
top # 启动top命令,动态表现进程信息
- pstree:树状检察正在运行的进程
pstree # 表现进程树
- pgrep:用于查找进程
pgrep -u username # 查找特定用户的全部进程
- nice:更改进程的优先级。nice值越低,进程优先级越高。
nice -n 10 long-running-command # 以较低优先级运行一个长时间运行的命令
- jobs:表现进程的相关信息
jobs # 列出当前会话的后台作业
- bg 和 fg:将进程调入后台
bg # 将近来一个挂起的作业放到后台运行
fg # 将后台作业调到前台运行
- kill:杀死进程
kill PID # 杀死指定的进程ID
注意,kill 命令默认发送 SIGTERM 信号(SIGTERM(Signal Termination)信号是Unix和类Unix操作系统中用于请求进程停止的尺度信号。当系统或用户想要优雅地关闭一个进程时,通常会发送这个信号。与SIGKILL信号不同,SIGTERM信号可以被进程捕获并处理,从而允许进程在退出前进行清理工作。),假如进程没有相应,可以使用-9使用SIGKILL 信号强制杀死进程:
kill -9 PID # 强制杀死进程
- nvidia-smi:NVIDIA 系统管理接口(NVIDIA System Management Interface)的命令行工具,用于监控和管理 NVIDIA GPU 装备。它提供了一种快速检察 GPU 状态、使用情况、温度、内存使用情况、电源使用情况以及运行在 GPU 上的进程等信息的方法。
– 表现 GPU 状态的摘要信息
nvidia-smi
– 表现详细的 GPU 状态信息
nvidia-smi -l 1 # 这个命令会每1秒更新一次状态信息。
– 表现 GPU 的帮助信息
nvidia-smi -h
– 列出全部 GPU 并表现它们的 PID 和进程名称
nvidia-smi pmon
– 强制结束指定的 GPU 进程
nvidia-smi --id=0 --ex_pid=12345 # 这会强制结束 GPU ID 为 0 上的 PID 为 12345 的进程。
– 设置 GPU 性能模式
nvidia-smi -pm 1 # 全部 GPU 设置为性能模式
nvidia-smi -i 0 -pm 1 # 只针对 ID 为 0 的 GPU
– 重启 GPU
nvidia-smi --id=0 -r # 这会重启 ID 为 0 的 GPU
3. Tmux工具使用
- 会话和进程
命令行的典范使用方式是,打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命令。用户与盘算机的这种临时的交互,称为一次**“会话”(session)** 。
会话的一个紧张特点是,窗口与此中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之停止,不管有没有运行完。
一个典范的例子就是,SSH 登录长途盘算机,打开一个长途窗口实行命令。这时,网络突然断线,再次登录的时候,是找不回上一次实行的命令的。因为上一次 SSH 会话已经停止了,里面的进程也随之消散了。
为了办理这个题目,会话与窗口可以"解绑":窗口关闭时,会话并不停止,而是继续运行,等到以后必要的时候,再让会话"绑定"其他窗口。
- Tmux的作用
Tmux 就是会话与窗口的"解绑"工具,将它们彻底分离。
- (1)它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
- (2)它可以让新窗口"接入"已经存在的会话。
- (3)它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
- (4)它还支持窗口任意的垂直和水平拆分。
复制代码
- # Ubuntu 或 Debian
- $ sudo apt-get install tmux
- $ sudo apt install tmux
- # CentOS 或 Fedora
- $ sudo yum install tmux
- # Mac
- $ brew install tmux
复制代码 我们的系统是Ubuntu且是root用户所以用apt-get install tmux或apt install tmux都可以
apt-get和apt的区别:
apt-get是较早引入的工具,它的设计更加注重命令行参数和灵活性,适合必要详细控制和定制的用户或脚本。
apt尝试提供更简单、更直观的命令行界面,以减少用户输入的复杂性。
– 启动和退出
安装完成后,键入tmux命令,就进入了 Tmux 窗口。
上面命令会启动 Tmux 窗口,底部有一个状态栏。状态栏的左侧是窗口信息(编号和名称),右侧是系统信息。
按下Ctrl+d或者显式输入exit命令,就可以退出 Tmux 窗口。
– 前缀键
Tmux 窗口有大量的快捷键。全部快捷键都要通过前缀键唤起。默认的前缀键是Ctrl+b,即先按下Ctrl+b,快捷键才会见效。
举例来说,帮助命令的快捷键是Ctrl+b ?。它的用法是,在 Tmux 窗口中,先按下Ctrl+b,再按下?,就会表现帮助信息。
然后,按下 ESC 键或q键,就可以退出帮助。
- 会话管理
– 新建会话
第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话。
使用编号区分会话,不太直观,更好的方法是为会话起名。
- $ tmux
- new -s <session-name>
复制代码 – 分离会话
在 Tmux 窗口中,按下Ctrl+b d或者输入tmux detach命令,就会将当前会话与窗口分离。
上面命令实行后,就会退出当前 Tmux 窗口,但是会话和里面的进程仍然在后台运行。
tmux ls命令可以检察当前全部的 Tmux 会话。
- $ tmux
- ls# or$ tmux
- list-session
复制代码 – 接入会话
tmux attach命令用于重新接入某个已存在的会话。
- # 使用会话编号$ tmux
- attach -t 0# 使用会话名称$ tmux
- attach -t <session-name>$ tmux
- attach-session -t <session-name>
复制代码 – 杀死会话
tmux kill-session命令用于杀死某个会话。
- # 使用会话编号$ tmux
- kill-session -t 0# 使用会话名称$ tmux
- kill-session -t <session-name>
复制代码 – 切换会话
tmux switch命令用于切换会话。
- # 使用会话编号$ tmux
- switch -t 0# 使用会话名称$ tmux
- switch -t <session-name>
复制代码 – 重命名会话
tmux rename-session命令用于重命名会话。
- $ tmux
- rename-session -t 0 <new-name>
复制代码 – 会话快捷键
- Ctrl+b d:分离当前会话。
- Ctrl+b s:列出所有会话。
- Ctrl+b $:重命名当前会话。
复制代码
- 窗格操作
Tmux 可以将窗口分成多个窗格(pane),每个窗格运行不同的命令。以下命令都是在 Tmux 窗口中实行。
– 分别窗格
- # 分别上下两个窗格$ tmux
- split-window# 分别左右两个窗格$ tmux
- split-window -h
复制代码 – 移动光标
tmux select-pane命令用来移动光标位置。
- # 光标切换到上方窗格$ tmux
- select-pane -U# 光标切换到下方窗格$ tmux
- select-pane -D# 光标切换到左边窗格$ tmux
- select-pane -L# 光标切换到右边窗格$ tmux
- select-pane -R
复制代码 – 互换窗格位置
tmux swap-pane命令用来互换窗格位置。
- # 当前窗格上移$ tmux
- swap-pane -U# 当前窗格下移$ tmux
- swap-pane -D
复制代码 – 窗格快捷键
- Ctrl+b %:划分左右两个窗格。
- Ctrl+b ":划分上下两个窗格。
- Ctrl+b <arrow key>:光标切换到其他窗格。<arrow key>是指向要切换到的窗格的方向键,比如切换到下方窗格,就按方向键↓。
- Ctrl+b ;:光标切换到上一个窗格。
- Ctrl+b o:光标切换到下一个窗格。
- Ctrl+b {:当前窗格与上一个窗格交换位置。
- Ctrl+b }:当前窗格与下一个窗格交换位置。
- Ctrl+b Ctrl+o:所有窗格向前移动一个位置,第一个窗格变成最后一个窗格。
- Ctrl+b Alt+o:所有窗格向后移动一个位置,最后一个窗格变成第一个窗格。
- Ctrl+b x:关闭当前窗格。
- Ctrl+b !:将当前窗格拆分为一个独立窗口。
- Ctrl+b z:当前窗格全屏显示,再使用一次会变回原来大小。
- Ctrl+b Ctrl+<arrow key>:按箭头方向调整窗格大小。
- Ctrl+b q:显示窗格编号。
复制代码
- 窗口管理
除了将一个窗口分别成多个窗格,Tmux 也允许新建多个窗口。
– 新建窗口
tmux new-window命令用来创建新窗口。
- $ tmux
- new-window# 新建一个指定名称的窗口$ tmux
- new-window -n <window-name>
复制代码 – 切换窗口
tmux select-window命令用来切换窗口。
- # 切换到指定编号的窗口$ tmux
- select-window -t <window-number># 切换到指定名称的窗口$ tmux
- select-window -t <window-name>
复制代码 – 重命名窗口
tmux rename-window命令用于为当前窗口起名(或重命名)。
- $ tmux
- rename-window <new-name>
复制代码 – 重命名窗口
tmux rename-window命令用于为当前窗口起名(或重命名)。
- $ tmux
- rename-window <new-name>
复制代码 – 窗口快捷键
- Ctrl+b c:创建一个新窗口,状态栏会显示多个窗口的信息。
- Ctrl+b p:切换到上一个窗口(按照状态栏上的顺序)。
- Ctrl+b n:切换到下一个窗口。
- Ctrl+b <number>:切换到指定编号的窗口,其中的<number>是状态栏上的窗口编号。
- Ctrl+b w:从列表中选择窗口。
- Ctrl+b ,:窗口重命名。
复制代码
- # 列出全部快捷键,及其对应的 Tmux 命令$ tmux
- list-keys# 列出全部 Tmux 命令及其参数$ tmux
- list-commands# 列出当前全部 Tmux 会话的信息$ tmux
- info# 重新加载当前的 Tmux 配置$ tmux
- source-file ~/.tmux.conf
复制代码
使命3
- 使用 VSCODE 长途连接开发机并创建一个conda情况
- conda设置
conda --version来检察当前开发机中conda的版本信息
配置清华镜像提升安装速度
- #设置清华镜像
- conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
- conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
复制代码 看conda的配置信息可以使用conda config --show命令:
- conda情况管理
– 创建虚拟情况
可以使用conda create -n xxx python=3.10创建虚拟情况,这里表现创建了python版本为3.10、名字为xxx的虚拟情况。
创建虚拟情况的常用参数如下:
- -n 或 --name:指定要创建的环境名称。
- -c 或 --channel:指定额外的软件包通道。
- --clone:从现有的环境克隆来创建新环境。
- -p 或 --prefix:指定环境的安装路径(非默认位置)。
复制代码
创建后,可以在.conda目次下的envs目次下找到:
– 检察虚拟情况
- conda env list
- conda info -e
- conda info --envs
复制代码
– 激活与退出虚拟情况
当我们创建完虚拟情况后我们可以使用conda activate xxx命令来激活虚拟情况,如何检察是否切换成功呢?很简单,只必要看(base)是否酿成了创建的虚拟情况的名称。
假如想要退出虚拟情况的话可以使用conda deactivate
使用以下命令
conda activate
conda deactivate
都会回到base情况,因为base是conda的基础情况,假如仔细观察的话,base情况目次比其他的虚拟情况目次层级要高
– 删除与导出虚拟情况
假如想要删除某个虚拟情况可以使用conda remove --name name --all,假如只删除虚拟情况中的某个或者某些包可以使用conda remove --name name package_name
- #获得环境中的所有配置
- conda env export --name myenv > myenv.yml
- #重新还原环境
- conda env create -f myenv.yml
复制代码
- conda和pip
conda和pip的一些区别:
– conda可以管理非python包,pip只能管理python包。
– conda可以用来创建虚拟情况,pip不能,必要依赖virtualenv之类的包。
– conda安装的包是编译好的二进制文件,安装包文件过程中会自动安装依赖包;pip安装的包是wheel或源码,装过程中不会去支持python语言之外的依赖项。
– conda安装的包会统一下载到当前虚拟情况对应的目次下,下载一次多次安装。pip是直接下载到对应情况中。
Wheel 是一种 Python 安装包的格式。
它是一种预编译的二进制分发格式,雷同于 conda 中的已编译二进制文件。
Wheel 格式的紧张长处包罗:
– 安装速度快:因为已经进行了预编译,所以在安装时不必要像源码安装那样进行编译过程,节省了时间。
– 一致性:确保在不同的系统和情况中安装的结果是一致的。
例如,假如您要安装一个大型的 Python 库,使用 Wheel 格式可以避免在不同的呆板上因为编译情况的差异而导致的安装题目。而且,对于那些没有编译情况或者编译能力较弱的系统,Wheel 格式可以或许让安装过程更加顺畅。
使命4
- 创建并运行test.sh文件
- studio-conda使用与Shell
Shell 脚本 是一种包含一系列命令的文本文件,这些命令按照特定的次序分列,用于在 Unix/Linux 或雷同的操作系统情况中自动执使用命。
Shell 脚本通常使用 Shell 语言编写,常见的 Shell 语言如 Bash、Sh 等,就是我们前面所介绍了Linux基础命令,这就属于Shell语言。
它有以下几个紧张特点:
– 自动化:可以将一系列重复、复杂的操作编写为一个脚本,然后只需运行脚本即可自动完成这些操作,从而节省时间和减少错误。例如,每天定时备份紧张文件的脚本。
– 系统管理:用于管理系统配置、用户权限、进程控制等。比如,创建新用户并设置其权限的脚本。
– 批处理:可以或许同时处理多个文件或数据。例如,将一批图片文件从一种格式转换为另一种格式的脚本。
– 流程控制:像条件判断(if-else)、循环(for、while)等,使脚本可以或许根据不同的情况实行不同的操作。
> 只重定向尺度输出(stdout)。
&> 同时重定向尺度输出(stdout)和尺度错误输出(stderr)。
在工作目次下创建文件test.sh
将文件内容写入:
给文件赋予实行权限:
实行命令:
可以看到可以正常实行,只不过我们的工作目次下没有导出该情况文件,所以没有还原成功,但给出了提示信息。
心得体会
对Linux下的根本语法进行了查漏补缺,学习使用了新工具tmux,收获颇丰。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |