Vscode SSH使用云服务器访问内网主机
云服务器在配置策略中开放使用到的端口号,比如250和251作为使用。
首先在内网主机上使用ssh-copy-id root@云服务器公网IP
,将内网主机的公钥放到服务器上
这一步必须完成,不然下面的命令无法成功建立隧道。
内网中主机使用,建立隧道
autossh -M 251 -fCNR 250:localhost:22 root@云服务器公网IP
vscode中ssh文件的配置如下:
Host aliyun
HostName 云服务器公网IP
User root
Host jetsonNano
HostName localhost
User jetson
Port 250
ProxyCommand ssh -A -q aliyun -W %h:%p
成功实现:使用aliyun作为跳板机来访问内网主机jetsonNano
设置开机自启动
方式一:rc.local (未验证!!)
linux中使用systemctl enable/diable xxx.service
来启用或者禁止某个开机服务。
推荐写一个服务使用systemctl来控制开机执行。
但是还有对System V的兼容实现——rc-local.service
在Ubuntu系统中/etc目录下面已经不存在rc.local文件了。为此我们使用touch 新建一个rc.local文件,文件内容为:
#!/bin/bash
autossh -M 251 -fCNR 250:localhost:22 root@云服务器公网IP
...
等等其他需要执行的脚本
执行chmod a+x rc.local
给rc.local文件增加可执行权限,系统将自动启用rc-local.service
执行systemctl daemon-reload
之后
使用systemctl list-dependencies multi-user.target | grep rc
可以验证服务每次开机启动之后将会被执行。
方式二:编写service文件 (验证可以!!)
创建/etc/systemd/system/NanoSshTunnel.service
文件,内容为:
[Unit]
Description=ssh tunnel author-shuiyihang
Wants=network-online.target
After=network-online.target
[Service]
Type=forking
ExecStart=/usr/bin/autossh -M 251 -fCNR 250:localhost:22 -o ServerAliveInterval=20 -o ServerAliveCountMax=3 root@云服务器IP
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
注意两点:
- Service如果没有设置
User=用户
,则默认使用root,需要提前在/home/root/.ssh目录下生成公钥私钥,并使用ssh-copy-id
把公钥放到服务器上。 - Type使用forking类型!!,如果为simple,服务运行之后,会产生一个SIGTERM信号把连接关闭,触发设置KillMode=process才行,但是这样做的话使用
sudo systemctl stop NanoSshTunnel.service
无法结束进程。反而使用forking,可以正常关闭,和正常开机自动打开
接下来执行:
sudo systemctl enable NanoSshTunnel.service
sudo systemctl daemon-reload
想要立马启动,执行
sudo systemctl start NanoSshTunnel.service
否则,下次重新开机也会自动执行
补充:辅助命令查看
systemctl status NanoSshTunnel.service
查看服务运行状态
journalctl -u NanoSshTunnel.service
查看服务日志,前提是使用journal
kill -l
列出所有信号值
systemctl kill -s 15 NanoSshTunnel.service
关闭服务
sudo systemctl start NanoSshTunnel.service
启动服务
sudo systemctl stop NanoSshTunnel.service
停止服务
sudo systemctl enable NanoSshTunnel.service
启用服务
机器A想不输入密码的访问B,需要把机器A的公钥放到机器B的authorized_keys里面