剛上線的服務器需要備份日志,要備份到另一台服務器上去,為了減少工作量,采用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下運行會報錯,盡量避免這個問題。
相關問題說明 http://www.myexception.cn/operating-system/1616889.html