使用natfrp映射ssh服务 and 使用shell脚本实现:开机自启、掉线重连功能

ChenHacker

2019-08-03 23:07:53

Tech. & Eng.

markdown出问题了我也不知道为什么

点这里吧

ps:2022.2.2听说有人用ssh在省选赛场上作弊,本人对此表示强烈谴责,用低端技术作弊是非常可耻的!

注:本机使用的环境如下:

[ch66@ch66-pc ~]$ uname -a
Linux ch66-pc 5.3.0-1-MANJARO #1 SMP Mon Jul 22 10:35:15 UTC 2019 x86_64 GNU/Linux

背景:

暑假里基本都是机房和home两点一线,每个星期的星期八放假呢.有时候需要传一些文件回家,于是想出一下几个点子:

  1. U盘大法好(不想带)
  2. 百度网盘(垃圾玩意儿你给我限速我还嫌你不安全呢)
  3. ftp+端口映射(头一次在linux上使用vsftpd搭建ftp服务器就折腾了一中午,最后由于要端口映射所以服务端需要改成被动模式我又整不来,最后放弃)
  4. sftp+端口映射(这玩意儿不错,ssh是每个linux自带的并且sftp没有什么主动被动模式,用户都是用系统用户,简单方便)

最后选择了sftp+端口映射

1.开启ssh服务:

manjaro linux 默认是没有ssh服务的,所以得手动启动,不过一个命令就可以搞定

sudo systemctl start sshd &&  sudo systemctl reenable sshd

//前者是启动ssh服务后者是开机自启动ssh服务

然后测试一下
ssh [email protected]

如果输出不是:

ssh: connect to host 127.0.0.1: Connection refused

那就代表ssh服务启动成功了,如果有问题请输入yes

2.使用natfrp服务把主机22端口暴露在外网

一般人都没有公网ip的,所以为了在不同局域网之间相互访问需用用到端口映射技术

但是一般端口映射是需要一台公网服务器的,一些服务商提供付费的端口映射映射服务,如花生壳,不是我说,这东西真的垃圾,这里推荐一款免费好用的端口映射服务:natftp

官网地址:https://www.natfrp.com/

注册帐号并且登录,映射ssh端口,官网有教程这里就不在赘述了。

得到外网地址和端口,我这里是 pc.ch66.cf 和 6514端口

然后测试一下:
ssh [email protected] -p 6514

//-p 后面是指定的端口号

3.使用filezilla工具测试sftp

ftp客户端多如牛毛,这里推荐一款免费好用跨平台的ftp客户端filazilla

中文官网: https://www.filezilla.cn

安装好之后打开是这个样子的: 然后点击点击文件新建一个主机,填入域名和端口用户密码,

注意这里的协议要用sftp

4.编写shell脚本让服务器用不掉线

终于来到本文的重点了,由于在服务器运行的过程中总是会有一些莫名其妙的错误,比如timeout之类的,或者你想切换一个端口,这个时候natfrp的客户端就不会自动从新连接了,于是我们的文件就得在学校过夜了。

所以我们得用shell脚本来维护这个进程

脚本维护大致分为三步:

  1. 编写shell脚本
  2. 利用nohup工具使脚本在后台运行
  3. 让脚本开机启动

而脚本主要分为两个:

  1. 维护wifi的脚本(为什么要这个呢,因为我用的是笔记本wifi极少数时候会掉线,并且我的Linux开机不会自动连接wifi,需要我自己写脚本)
  2. 维护natfrp客户端的脚本
写一个wifi维护脚本:
#!/bin/bash

test_connect() {
        nc -v -z www.baidu.com 80
        return $?
}
# 这个函数用来测试互联网状态(使用baidu的服务器测试)
wifi_name=("我家的wifi名字" "隔壁的wifi名字")
wifi_password=("我家wifi密码" "隔壁的密码")
# 这里把隔壁的wifi添加到列表主要是防止我家的wifi出锅
cnt=2

try_wifi() {
        i=0
        while(($i<cnt)) 
        do
                nmcli device wifi connect ${wifi_name[$i]} password ${wifi_password[$i]}
                test_connect
                if test $? -eq 0
                        then break
                fi
                i=$i+1
        done
}
# 尝试连接wifi列表里的wifi

# 下面是主程序
while(true) 
do
        echo $(date "+%Y-%m-%d %H:%M:%S")
        test_connect
        if test $? -eq 1
        then
                try_wifi
        else 
                echo ok
        fi
        sleep 3
done

保存为~/sh/wifi.sh

再来一个主进程维护脚本:

#/!bin/bash

pd() {
        nc -v -z pc.ch66.cf 6514
        return $?
}

resetservice() {
        killall ./Sakura_frpc_linux_amd64
        ./Sakura_frpc_linux_amd64 --su=你的用户名 --sp=你的密码 --sid=10 & 
        sleep 5 
}

while(true)
do
        echo $(date "+%Y-%m-%d %H:%M:%S")
        pd
        if test $? -eq 1
        then
                resetservice
        fi
        sleep 2
done

保存为~/frp/keep_run.sh

以上两个脚本同学们可以自己测试一下

使用nohup把脚本放在后台运行(这同样适用于ssh)

安装nohup工具

debian:

sudo apt install nohup

Arch:

sudo pacman -S yay && yay -S nohup

nohup基本使用方法:

运行名为test.sh的shell脚本

nohup ./test.sh &

然后test.sh的输出保存在nohup.out文件里

最后把这两个脚本开机自启动:

在/etc/rc.local中加入:

/home/ch66/sh/wifi.sh > /home/ch66/sh/log/wifi.log &
/home/ch66/frp/run.sh > /home/ch66/frp/log.txt &

重启,大功告成!

到现在我们的所有工作就已经完成了,每天早上打开电脑自动启动服务,到学校直接传文件,脚本维护永不掉线,爽!