SSH 远程登录服务器跑实验(含内网穿透)

最近需要远程在实验室的服务器跑实验,看了一些文档,一番折腾后给大家分享一下配置。
服务器的操作系统是 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 端口号(如果做了内网穿透,则需要填写对应的端口号)
    • 比如:下图对应的是 10387image-20230320202439764
  • 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,所以需要映射主机的 88886006 端口到远程的 88886006 号端口上,当前服务器设置的 HostUbuntu-Nat-DDNS (~/.ssh/config 中的设置)。

那么对应的命令就是 ssh -L8888:localhost:8888 -L6006:localhost:6006 Ubuntu-Nat-DDNS

下面给出 bashzsh 别名的设置样例。

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 来进行连接,同时,本地的 88886006 号端口将会被映射。

使用 cpolar 进行内网穿透

这项服务是免费

此段部分搬运自官方文档

安装(服务器)

curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash

使用 cpolar version 查看是否安装成功

登录cpolar官网后台,点击左侧的验证,查看自己的认证 token,之后将 token 贴在命令行里

cpolar authtoken xxxxxxx
20230111103532

开机自启动(服务器)

执行下列命令让其开机自动进行内网穿透,这样在远程服务器不慎重启时,本机依然可以连接。

sudo systemctl enable cpolar	# 向系统添加服务
sudo systemctl start cpolar		# 启动cpolar服务
sudo systemctl status cpolar	# 查看服务状态

显示 active 表示成功。

查看公网地址和端口号(服务器/主机)

现在有两种方法可以看到你内网穿透后的状态:

  1. 服务器用浏览器访问127.0.0.1:9200,登录本地cpolar web-ui管理界面
  2. 主机直接访问 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.cnPort 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,如果你和我一样,那么你只需要知道下面的操作:

  1. 需要执行其他命令,且不想再开一个终端: 使用 Ctrl+a d 或者 Ctrl+ a Ctrl +d 分离当前的会话。
  2. 回到原来的 session: 使用 screen -ls 查看对应的进程,然后 screen -r session_id
  3. 需要创建有名字的 session: screen -S session_name 命令,此时分离会话后可以直接使用 screen -r session_name 重新连接。
  4. 分离会话后,直接杀死会话: 使用 screen -X -S session_id quitscreen -X -S session_name quit

设置断电后通电自启动(微星主板)

因为担心实验室不小心断电,所以设置一下通电自启。

我的主板是微星,所以这里仅给出微星的示例(其他的主板大同小异,可以在网上自行查找):

  1. 重启电脑,一直重复按 Del,直到进入 BIOS(可以设置成中文界面)。
  2. 点击 Advanced,进入 SETTINGS>Power Management Setup 然后找到 Restore alter AC Power Loss 选项。
  3. 将该选项的值设置为 Power On ,然后按下 F10 保存更改并退出 BIOS 设置。

参考链接:

  1. ssh_config 手册(man ssh_config)
  2. cpolar 官方文档
  3. screen 手册(man screen)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hoper.J

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值