小花狸监控可以嵌入备份的脚本.
一旦本地备份完成,向集中监控服务器发送信息,
集中监控服务器将数据拉回,实现异地备份.
数据拉回采用了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
一旦本地备份完成,向集中监控服务器发送信息,
集中监控服务器将数据拉回,实现异地备份.
数据拉回采用了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博客 ” ,链接:http://blog.itpub.net/29254281/viewspace-1477709/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29254281/viewspace-1477709/