linux实现自动远程备份(scp+ssh)

2019-07-09 20:25:19

刚上线的服务器需要备份日志,要备份到另一台服务器上去,为了减少工作量,采用linux的定时任务去自动执行。因服务器都是linux的,因此采用linux的远程复制scp命令。但这里涉及到一个问题,就是scp命令执行时需要输入密码,在网上大概搜集了下有两种方法:①一种是采用except方法(会存储明文密码);②采用ssh生成密钥的方式。这里我采用第二种方式。耗时两天,中途遇到各种问题,不过总算解决了

 

备份方式:拷贝前一天的日志文件到备份服务器,再压缩后删除复制的本地文件。日志文件每天都会产生,格式都为access_20151214类似的文件名。

  #首先用变量保存前一天的日期:

  ngnix_day=$(date -d last-day +%Y%m%d)

  接着备份文件

  scp root@192.168.1.240:/logdata/access_$ngnix_day.log /logdata/nginxlog/ 

  (scp... 源文件  目标路径)

  将复制的日志文件压缩后再删除源文件(--remove-files)

  tar -czf access_$ngnix_day.tar.gz access_$ngnix_day.log --remove-files

到这里已经完成备份操作

 

下面是实现scp无密码登录

1、在 A 上运行 ssh-keygen -t rsa 在/root/.ssh 下生成id_rsa 和 id_rsa.pub 两个文件
在/root/.ssh下复制备份一份id_rsa.pub 命名为 id_rsa.pub.A

2. 在 B 上也同样运行 ssh-keygen -t rsa

3、在 B 的 /root/.ssh 下创建authorized_keys文件 把A 中 id_rsa.pub.A 文件 传到 B /root/.ssh 下
    通过 cat 命令 把id_rsa.pub.A 写到 authorized_keys 文件中

  scp ./id_rsa.pub.A  B的IP:/root/.ssh
   cat id_rsa.pub.A  >>  authorized_keys

测试:最终从B服务器拷贝文件到A上,就无需输入密码了

在生成密钥的过程中,一直Enter即可,否则还是需要输入设置的密码

=============================================================

下面是具体的源码,很简单的功能:

#!/bin/bash
ngnix_day=$(date -d last-day +%Y%m%d)
node_day=$(date -d yesterday +%Y-%m-%d)
#backup xx.172.129.xx node4
ssh root@xx.172.129.xx "sh /logdata/sh/node4_backup.sh"
sleep 1m
scp root@xx.172.129.xx:/logdata/access_$ngnix_day.tar.gz /logdata/nginxlog/node4-access_$ngnix_day.tar.gz
scp root@xx.172.129.xx:/logdata/node1-$node_day.log /logdata/nodelog/node4-node1-$node_day.log
scp root@xx.172.129.xx:/logdata/node2-$node_day.log /logdata/nodelog/node4-node2-$node_day.log
scp root@xx.172.129.xx:/logdata/node3-$node_day.log /logdata/nodelog/node4-node3-$node_day.log
date
sleep 1m
date
if [ -f /logdata/nodelog/node4-node1-$node_day.log ];
then ssh root@xx.172.129.xx "rm -f /logdata/node1-$node_day.log";
else
echo "The node4-node1-$node_day.log is not exists!" >>/logdata/sh/node.txt
fi
if [ -f /logdata/nodelog/node4-node2-$node_day.log ];
then ssh root@xx.172.129.xx "rm -f /logdata/node2-$node_day.log";
else
echo "The node4-node2-$node_day.log is not exists!" >>/logdata/sh/node.txt
fi
if [ -f /logdata/nodelog/node4-node3-$node_day.log ];
then ssh root@xx.72.129.xx "rm -f /logdata/node3-$node_day.log";
else
echo "The node4-node3-$node_day.log is not exists!" >>/logdata/sh/node.txt
fi

=============================================================

问题:

①、第一次执行scp的时候会出现warning,这时候要输入“yes”。所以脚本编写完一定要手动执行一遍,防止定时执行失败

②、在win下编写shell时,换行符为:\n\r,而在linux下为:\n ,因此在win下编写的脚本在linux下运行会报错,尽量避免这个问题。


  • 2019-12-19 00:04:44

    ffmpeg concat video and mix audio

    在ffmpeg中,官网给出两种连接媒体文件(音频、视频、etc..)的解决方案。 the concat "demuxer" the concat "protocol" 对比而言, demuxer更加灵活一些,需要媒体文件是属于相同的编解码器,但是可以属于不同的容器格式(mp3,wav, mp4, mov, etc..). 而protocol只适用于少数集中容器格式。

  • 2019-12-19 00:16:30

    android采用FFmpeg实现音频混合与拼接剪切

    接触FFmpeg有一段时间了,它是音视频开发的开源库,几乎其他所有播放器、直播平台都基于FFmpeg进行二次开发。本篇文章来总结下采用FFmpeg进行音频处理:音频混合、音频剪切、音频拼接与音频转码。

  • 2019-12-19 15:01:58

    spring boot 在Linux下服务启动报错Unable to find Java

    将 Spring boot 安装为 Linux 服务启动,后输入 service myapp start 报错 Unable to find Java ,但是使用 java -jar myapp.jar 启动成功。不知道为啥引起的,经过百度找到下面这个解决方法和我的情况一样,终于把问题解决

  • 2019-12-19 16:44:01

    根据条件配置多个npm仓库

    scope 是一种很好的包管理方式。统一的“命名空间”,清晰、好辨识;在 registry 中使用统一的 organization 管理,不必担心命名冲突和冒用等。 在实际使用中,一个常见的场景是公司的私有仓库。使用统一的 scope 定义在私有仓库中定义私有包,绝对是一个非常好的方式。 指定 scope 从指定仓库安装

  • 2019-12-20 13:24:58

    瓦片地图生成使用以及原理

    我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就必然需要一个转换过程,这个过程就叫做投影(Projection)。在地球上我们通过经纬度来描述某个位置,而经过投影之后的地图也有自己的坐标系统,本篇文章就来详细介绍在百度地图API中涉及的各种坐标体系。