为了更好的阅读体验,点这里

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

[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两点一线,~~每个星期的星期八放假呢.~~有时候需要传一些文件回家,于是想出一下几个点子:

<!-- more --> 

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

#### 最后选择了sftp+端口映射

### 1.开启ssh服务:
manjaro linux 默认是没有ssh服务的,所以得手动启动,不过一个命令就可以搞定
 
```shell
sudo systemctl start sshd &&  sudo systemctl reenable sshd
```
//前者是启动ssh服务后者是开机自启动ssh服务
 
##### 然后测试一下
```shell
ssh ch66@127.0.0.1
```
如果输出不是:
```shell
ssh: connect to host 127.0.0.1: Connection refused
```
那就代表ssh服务启动成功了,如果有问题请输入yes
 
### 2.使用natfrp服务把主机22端口暴露在外网
 
一般人都没有公网ip的,所以为了在不同局域网之间相互访问需用用到[端口映射](https://www.baidu.com/s?ie=UTF-8&wd=%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84)技术

但是一般端口映射是需要一台公网服务器的,一些服务商提供付费的端口映射映射服务,如[花生壳](https://www.baidu.com/s?ie=UTF-8&wd=%E8%8A%B1%E7%94%9F%E5%A3%B3),不是我说,这东西真的垃圾,这里推荐一款免费好用的端口映射服务:[natftp](https://ch66.cf/2019/07/28/%E5%85%8D%E8%B4%B9%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84%E6%8E%A8%E8%8D%90-www-natfrp-org/)

官网地址:[https://www.natfrp.com/](https://www.natfrp.com/)

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

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

##### 然后测试一下:
```shell
ssh ch66@pc.ch66.cf -p 6514
```
//-p 后面是指定的端口号

### 3.使用filezilla工具测试sftp

ftp客户端多如牛毛,这里推荐一款免费好用跨平台的ftp客户端[filazilla](https://www.filezilla.cn)

中文官网: [https://www.filezilla.cn](https://www.filezilla.cn)

安装好之后打开是这个样子的:
![](https://cdn.luogu.com.cn/upload/pic/68731.png)
然后点击点击文件新建一个主机,填入域名和端口用户密码,
#### 注意这里的协议要用sftp
![](https://cdn.luogu.com.cn/upload/pic/68730.png)

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

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

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

#### 脚本维护大致分为三步: 

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

#### 而脚本主要分为两个:

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

##### 写一个wifi维护脚本:
```bash
#!/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

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

```bash
#/!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 &

重启,大功告成!

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