ITPub博客

首页 > 应用开发 > IT综合 > 小花狸监控之异地备份

小花狸监控之异地备份

原创 IT综合 作者:壹頁書 时间:2015-03-29 14:33:20 1 删除 编辑
小花狸监控可以嵌入备份的脚本.
一旦本地备份完成,向集中监控服务器发送信息,
集中监控服务器将数据拉回,实现异地备份.

数据拉回采用了expect脚本,模拟交互方式输入密码

/home/lihuilin/golang/src/backup.sh

#!/usr/bin/expect
##########################################################  
#     1.service ip  
#     2.User  
#     3.userPassword  
#     4.localPath  [本地路径]  
#     5.serverPath [server端路径]  
#返回值:  
#     0  成功  
#     1  参数个数不正确  
###########################################################  
 
proc usage {} {  
        regsub ".*/" $::argv0 "" name  
        send_user "Usage:\n"  
        send_user "$name serviceip  User userPassword serverPath localPath\n"  
        exit 1  
}  
    
## 判断参数个数  
if {[llength $argv] != 5} {  
        usage  
}  
 
 
#设置变量值  
set severip [lindex $argv 0]  
set User [lindex $argv 1]  
set userPassword [lindex $argv 2]  
set serverPath [lindex $argv 3]  
set localPath [lindex $argv 4]  
      
#定义变量标记rsync连接时是否输入yes确认  
set inputYes 0  
 
#rsync -avz /etc/ 192.168.15.234:/home/7_8  
spawn rsync -avz $User@$severip:$serverPath $localPath
    expect {  
    -nocase -re "yes/no" {  
        send -- "yes\r"   
            set inputYes 1     
    }  
    -nocase -re "assword: " {  
        send -- "$userPassword\r"  
                    interact  
    }  
    -nocase -re "Connection refused" {  
        send_error "Sftp services at ${ftpServerIp} is not active.\n"  
            exit 2  
    }  
    timeout {  
        send_error "Connect to sftp server ${ftpUser}@${ftpServerIp} timeout(10s).\n"  
            exit 8  
    }  
    eof
}  
 
 
#如果输入了yes确认,输入密码  
if {$inputYes==1} {  
        expect {  
            -nocase -re "assword: " {  
            send -- "$userPassword\r"  
            interact  
        }  
    }   
}  

expect eof

使用golang调用脚本 Backup.go
package main

import (
    "github.com/codeskyblue/go-sh"
    "log"
)

type BackupInfo struct {
    User      string
    Pwd       string
    Path      string
    LocalAddr string
}

func NewBackupInfo(localAddr, user, pwd, path string) *BackupInfo {
    backup := &BackupInfo{}
    backup.LocalAddr = localAddr
    backup.User = user
    backup.Pwd = pwd
    backup.Path = path
    return backup
}

func Backup(backupinfo *BackupInfo) {
    s := sh.NewSession()
    //s.ShowCMD = true
    s.SetEnv("/usr/bin", "/bin")
    cmd := s.Command("/usr/bin/expect", "/home/lihuilin/golang/src/backup.sh", backupinfo.LocalAddr, backupinfo.User, backupinfo.Pwd, backupinfo.Path, "/tmp")
    result, err := cmd.Output()
    if err != nil {
        log.Println(err.Error())
    }
    log.Println(string(result))

}

func main() {
    backupinfo := NewBackupInfo("192.168.1.70", "root", "root", "/tmp/data")
    Backup(backupinfo)
}



参考:
http://www.cnblogs.com/gylei/archive/2013/05/11/3072331.html

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1477709/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6340061