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下运行会报错,尽量避免这个问题。


  • 2017-08-03 21:16:46

    Node.js 里面那些遗失的 ES6 特性

    其实 Node.js 对 ES6 的很多特性都已经开始支持了。 在 Node.js 使用的 JS 引擎 V8 里面将不同状态 ES6 特性分成了 3 个等级:

  • 2017-08-08 11:17:17

    nginx 反向代理 取得真实IP和域名

    nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递到应用程序中。

  • 2017-08-09 15:14:52

    如何写好.babelrc?Babel的presets和plugins配置解析

    官网是这么说的,翻译一下就是下一代JavaScript 语法的编译器。 作为前端开发,由于浏览器的版本和兼容性问题,很多JavaScript的新的方法都不能使用,等到可以大胆使用的时候,可能已经过去了好几年。Babel就因此而生,它可以让你放心使用大部分的JavaScript的新的标准的方法,然后编译成兼容绝大多数的主流浏览器的代码。

  • 2017-08-15 17:44:21

    glob 介绍

    glob 最早是出现在类Unix系统的命令行中, 是用来匹配文件路径的。比如,lib/**/*.js 匹配 lib 目录下所有的 js 文件。 除了在命令行中,我们在程序中也会有匹配文件路径的需求。于是,很多编程语言有了对 glob 的实现 ,如 Python 中的 glob 模块; php 中的 glob 方法。

  • 2017-08-16 08:45:41

    nodejs中流(stream)的理解

    这种方式是把文件内容全部读入内存,然后再写入文件,对于小型的文本文件,这没有多大问题,比如grunt-file-copy就是这样实现的。但是对于体积较大的二进制文件,比如音频、视频文件,动辄几个GB大小,如果使用这种方法,很容易使内存“爆仓”。理想的方法应该是读一部分,写一部分,不管文件有多大,只要时间允许,总会处理完成,这里就需要用到流的概念。

  • 2017-08-17 17:58:48

    /usr、/home、/bin、/dev、/var、/etc中主要存放什么文件

    /usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录。其中包含: /usr/X11R6 存放X window的目录 /usr/bin 众多的应用程序 /usr/sbin 超级用户的一些管理程序 /usr/doc linux文档 /usr/include linux下开发和编译应用程序所需要的头文件 /usr/lib 常用的动态链接库和软件包的配置文件 /usr/man 帮助文档 /usr/src 源代码,linux内核的源代码就放在/usr/src/linux里 /usr/local/bin 本地增加的命令 /usr/local/lib 本地增加的库