最近需要远程在实验室的服务器跑实验,看了一些文档,一番折腾后给大家分享一下配置。
服务器的操作系统是 Ubuntu,CentOS 可以对应的替换下命令,操作一致。
文章目录
SSH(服务器/主机对应的命令)
安装(服务器)
sudo apt-get update
sudo apt-get install openssh-server
创建密钥(主机)
cd ~/.ssh
ssh-keygen -t rsa -f id-rsa-ubuntu
将公钥复制到服务器(主机)
ssh-copy-id -i id-rsa-ubuntu.pub 用户名@服务器地址
如果你此时与服务器可以用内网通信,那么直接填写内网地址即可,如果不行,先跳过这段,看 cpolar
部分。
修改config内容(主机)
这一部分是为了简化登录流程。
touch ~/.ssh/config
vim ~/.ssh/config
config 参数:
- Host: 别名,可以直接用于 ssh 登录
- Hostname: ip 地址
- Port: SSH 端口号(如果做了内网穿透,则需要填写对应的端口号)
- 比如:下图对应的是 10387
- 比如:下图对应的是 10387
- User: 登录的用户名
- PreferredAuthentications: 指定客户端的认证方法为公钥
- IdentityFile: 当前指的是私钥路径
P.S: 具体的参数信息可以通过 man ssh_config
查看
下面是配置文件样例:
# 以下四种皆可,如果是内网推荐第 1 种,外网推荐第 4 种
# 1. 使用 ssh Ubuntu 登录(内网推荐)
Host Ubuntu
HostName x.x.x.x # 填写 ip(如果是外网登录内网,需要做内网穿透)
User xx # 远程主机的登录名
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_ubuntu
# 2. 使用 ssh x.x.x.x 或 ssh user@x.x.x.x 登录
Host x.x.x.x
User xx
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_ubuntu
# 3. 使用 ssh user@x.x.x.x 登录
Host x.x.x.x
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_ubuntu
# 4. 使用 ssh Ubuntu-Nat-DDNS 做了内网穿透后的主机(推荐)
Host Ubuntu-Nat-DDNS # 你可以改成你想要的名字
HostName x.x.x.x # 填写公网ip
Port xx # 公网 ip 对应的 端口号
User xx # 远程主机的登录名
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_ubuntu
如果 Host 指定了别名,则可以直接使用 ssh Host
登录,这是推荐的方式,非常的优雅。
比如 ssh Ubuntu-Nat-DDNS
直接登录到远程服务器,或者使用 ssh -L8888:localhost:8888 Ubuntu-Nat-DDNS
,在登录服务器的同时将本地的8888号端口映射到服务器,从而开始快乐的跑 Jupyter。
编辑完之后,使用 esc
进入命令模式,用 :wq
保存并退出。
设置命令别名简化操作(主机)
打一大串命令还是有点麻烦,可以设置命令别名来简化它,因为我需要远程在服务器上跑 jupyter notebook
,所以我设置的命令别名为:Ubuntu-Jupyter-Notebook-NATDDNS
,你可以自定义你的命令别名。
alias
指定一个命令别名执行 =
后面的操作,请同样自定义你的命令,然后使用 echo alias 命令别名="命令" >> 配置文件
来加入配置。
我的需求是远程连接到服务器后跑 jupyter notebook
,并且查看 Tensorboard
,所以需要映射主机的 8888
和 6006
端口到远程的 8888
和 6006
号端口上,当前服务器设置的 Host
为 Ubuntu-Nat-DDNS
(~/.ssh/config 中的设置)。
那么对应的命令就是 ssh -L8888:localhost:8888 -L6006:localhost:6006 Ubuntu-Nat-DDNS
。
下面给出 bash
和 zsh
别名的设置样例。
bash
使用下面的命令将命令别名添加到配置文件中,对应的命令需要自定义。
echo alias Ubuntu-Jupyter-Notebook-NATDDNS="ssh -L8888:localhost:8888 -L6006:localhost:6006 Ubuntu-NAT-DDNS" >> ~/.bashrc
source ~/.bashrc
zsh
echo alias Ubuntu-Jupyter-Notebook-NATDDNS="ssh -L8888:localhost:8888 -L6006:localhost:6006 Ubuntu-NAT-DDNS" >> ~/.zshrc
source ~/.zshrc
现在,你可以在命令行中直接运行 Ubuntu-Jupyter-Notebook-NATDDNS
来进行连接,同时,本地的 8888
和 6006
号端口将会被映射。
使用 cpolar 进行内网穿透
这项服务是免费的
此段部分搬运自官方文档
安装(服务器)
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
使用 cpolar version
查看是否安装成功
登录cpolar官网后台,点击左侧的
验证
,查看自己的认证 token,之后将 token 贴在命令行里
cpolar authtoken xxxxxxx
![20230111103532](https://i-blog.csdnimg.cn/blog_migrate/e24196b03a5f25c8bea1b2f2bba20d39.png)
开机自启动(服务器)
执行下列命令让其开机自动进行内网穿透,这样在远程服务器不慎重启时,本机依然可以连接。
sudo systemctl enable cpolar # 向系统添加服务
sudo systemctl start cpolar # 启动cpolar服务
sudo systemctl status cpolar # 查看服务状态
显示 active
表示成功。
查看公网地址和端口号(服务器/主机)
现在有两种方法可以看到你内网穿透后的状态:
- 服务器用浏览器访问127.0.0.1:9200,登录本地cpolar web-ui管理界面
- 主机直接访问 https://dashboard.cpolar.com/status,查看隧道名为
ssh
对应的 URL,以我当前的为例:tcp://3.tcp.vip.cpolar.cn:10387
,这表明我的公网地址为 3.tcp.vip.cpolar.cn,端口号是 10387。
对应到 ~/.ssh/config
文件中: HostName 3.tcp.vip.cpolar.cn
,Port 10387
。
你现在可以跳转回上面继续进行 ~/.ssh/config
的配置。
突然连不上(主机)
你需要重新访问 https://dashboard.cpolar.com/status 查看端口号。
因为免费是这样的 😃,你的端口号被重新分配了,没有什么大不了的,把这个网址收藏一下就行,一般来说几天才会重新分配一次,当然,也有可能是 ip 被重新分配了,但这个频率较低。
然后修改 config
中的 Port
项或者 HostName
项。
总是修改也有些麻烦,将打开 ssh config
修改的操作也进行简化:
bash
echo alias sshconfig="vim +/Port ~/.ssh/config" >> ~/.bashrc
source ~/.bashrc
zsh
echo alias sshconfig="vim +/Port ~/.ssh/config" >> ~/.zshrc
source ~/.zshrc
现在,你可以使用 sshconfig
直接进行编辑,+/Port
命令会让你直接跳转到 Port
对应的行,此时使用 shift + a
即可直接编辑,如果你有多个 Port
,那么用 n
跳转到对应的行即可。
编辑完之后,使用 esc
进入命令模式,用 :wq
保存并退出。
终极解决方法
升级套餐,固定域名和端口的套餐是专业版 149/年。
让实验不中断(服务器)
安装 screen
现在有一个问题,就是主机在断网的时候,实验会终止。
有一个解决方法是 screen
,而且其实你只需要 screen
。
sudo apt-get update
sudo apt-get install screen
执行命令
screen 命令
其他命令
对于我来说,我只需要远程服务器不间断的跑 jupyter notebook
,如果你和我一样,那么你只需要知道下面的操作:
- 需要执行其他命令,且不想再开一个终端: 使用
Ctrl+a d
或者Ctrl+ a Ctrl +d
分离当前的会话。 - 回到原来的
session
: 使用screen -ls
查看对应的进程,然后screen -r session_id
。 - 需要创建有名字的
session
:screen -S session_name 命令
,此时分离会话后可以直接使用screen -r session_name
重新连接。 - 分离会话后,直接杀死会话: 使用
screen -X -S session_id quit
或screen -X -S session_name quit
。
设置断电后通电自启动(微星主板)
因为担心实验室不小心断电,所以设置一下通电自启。
我的主板是微星,所以这里仅给出微星的示例(其他的主板大同小异,可以在网上自行查找):
- 重启电脑,一直重复按
Del
,直到进入 BIOS(可以设置成中文界面)。 - 点击
Advanced
,进入SETTINGS>Power Management Setup
然后找到Restore alter AC Power Loss
选项。 - 将该选项的值设置为
Power On
,然后按下 F10 保存更改并退出 BIOS 设置。
参考链接:
- ssh_config 手册(man ssh_config)
- cpolar 官方文档
- screen 手册(man screen)