免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2146 | 回复: 6
打印 上一主题 下一主题

[系统管理] 有两个while语句的sftp [复制链接]

论坛徽章:
2
摩羯座
日期:2013-10-20 18:04:032015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-30 19:02 |只看该作者 |倒序浏览

##########到指定的主机上去取要备份的目录,原来打算今天备份昨天的,但是不知道如何写程序,所以就取今天跟昨天的两天的目录,到时候备份的时候直接覆盖
##########原来想法是每次到各台主机上去取要备份的目录,但是不知道怎么去写循环程序,由于各主机的要备份的目录都相同,所以就直接取其中一台要备份的目录就行了
#########要备份的目录是以日期格式的目录如:20141129
sftp_getdirlog.exp
#!/usr/local/bin/expect -f

spawn ssh root@192.168.1.221
expect {
"yes/no" {send "yes\r";exp_continue}
"*assword:" {send "root123\r"}  
}
expect "*#"
send "cd /var/proclog/raw/archive/;ls -rt|tail -2 > /var/tmp/dirlog\r"  ####这个地方我能否通过ls -rt|tail -2 |grep -v “$date +%Y%m%d” 过滤掉今天的目录。
expect "*#"                                                              ####ls -rt列出来的目录名是这样的:20141129 20141128 20141127;我用虚拟机试了一下,好像不行
send "exit"                                                          ###是否“$date +%Y%m%d”这个输出的是数值跟目录名是不同类型的,所以不能过滤,还是我命令表示不对?!!
spawn sftp root@192.168.1.221
expect {
"yes/no" {send "yes\r";exp_continue}
"*assword:" {send "root123\r"}  
}
expect "sftp>"
send "lcd /opt/test\r"
expect "sftp>"
send "get /var/tmp/dirlog\r"
expect "sftp>"
send "exit"


############主程序。这里使用了两个while...do...done,不知道有没有问题其中dirname能被调用吗,能传参数到scp_hsslog.exp吗?
###########
###########
scp_hsslog.sh
#!/bin/bash
#find /opt/test/$hostip -type file -mtime +14 -exec rm {} \;
GETFILECFG=/opt/test/GETFILECFG.txt
sftp_getdirlog=/opt/sftp_getdirlog.exp
scp_hsslog=/opt/test/scp_hsslog.exp
LOG=/opt/test/dirlog
cat $GETFILECFG |while read line
do
hostip=`echo $line | awk '{print $1}'`
username=`echo $line | awk '{print $2}'`
password=`echo $line | awk '{print $3}'`
cat $LOG | while read line
do
dirname=`echo $line awk '{print $1}'`      ####把dirlog里边要备份的dir名称赋给dirname,到时候dirname作为参数被scp_hsslog.exp调用

done
$scp_hsslog $hostip $username $password $dirname
done

######################
GETFILECFG.txt
192.168.1.221 root root123
192.168.1.222 root root
192.168.1.223 root root123
192.168.1.224 root root123
192.168.1.225 root root
192.168.1.226 root root123
192.168.1.227 root root123
192.168.1.228 root root123


##########################调用expect 自动scp要备份的目录到本机指定的位置
scp_hsslog.exp
#!/usr/bin/expect -f
set hostip [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set dirname [lindex $argv 3]
spawn scp -r $username@$hostip:/var/proclog/raw/archive/$dirname /opt/test/$dirname
expect {
"yes/no" {send "yes\r";exp_continue}
"*assword:" {send "$password\r"}  
}


编写的思路:登录到多台服务器上,到指定的目录下通过读取该目录下要备份的目录,通过自动sftp的方式取到本机,然后本机根据取到要备份的目录,再通过scp方式,
将远程主机要备份的目录备份到本地,备份的时间一天备份一次,主要实现今天备份昨天的,不知道如何表示备份昨天的,只好备份两天,重复的直接覆盖掉。
现在我打算的做法是:把这些脚本订两个cronjob:a、b。先执行a(sftp_getdirlog.exp),先去要备份的目录;然后执行b(scp_hsslog.sh)去备份要备份的目录。
由于对shell脚本不熟悉,花了四天写这个小脚本,也找了些资料,但是感觉还是怪怪的,特别是两个while...do语句,能否成功执行,并被调用??!!

另外我想能否将sftp_getdirlog.exp跟scp_hsslog.sh整合起来成为一个脚本,先取要备份的目录,然后再根据这些目录去备份。该如何改进?

要备份的目录是日期格式的目录名,如:20141129 20141128
另外有另一想法:spawn scp -r $username@$hostip:/var/proclog/raw/archive/$dirname /opt/test/$dirname
这个地方dirname我能否直接通过调用date命令来做,例如dirname=date +%Y%m%d
如果这样就必须实现日期昨天的表示方法,因为是solaris系统,所以没有linux里边的 -d参数,查了资料有说可以通过改变时区来实现
yesterday=`TZ=$TZ+32 date +%Y%m%d`。是不是我可以dirname=`TZ=$TZ+32 date +%Y%m%d`,然后根据这个去取昨天的那个目录?

请高手指点一下!!!

非常感谢!!!

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
2 [报告]
发表于 2014-11-30 23:40 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
10
金牛座
日期:2014-09-16 19:02:48技术图书徽章
日期:2015-11-24 01:37:29操作系统版块每日发帖之星
日期:2015-11-18 06:20:002015年亚洲杯之沙特阿拉伯
日期:2015-04-13 17:33:462015年迎新春徽章
日期:2015-03-04 09:51:162015年辞旧岁徽章
日期:2015-03-03 16:54:15午马
日期:2014-12-04 19:33:55白羊座
日期:2014-09-17 19:34:42巨蟹座
日期:2014-09-16 21:09:4815-16赛季CBA联赛之同曦
日期:2016-06-27 23:23:07
3 [报告]
发表于 2014-11-30 23:52 |只看该作者
整那么麻烦,各服务器做ssh    key认证,把当前时间做个判断,得出昨天的日期时间,当做变量,然后直接rsync同步至本机备份,完事。至于这么点事情长篇大论的写那么多么?


论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
4 [报告]
发表于 2014-12-01 15:18 |只看该作者
如果这样就必须实现日期昨天的表示方法,因为是solaris系统,所以没有linux里边的 -d参数,查了资料有说可以通过改变时区来实现

日期计算可以用这个:
http://bbs.chinaunix.net/thread-1772999-1-1.html

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
5 [报告]
发表于 2014-12-01 15:19 |只看该作者
如果你没有强迫症的话,可以在Shell脚本里面调用Perl命令计算日期:
  1. perl -e '($a,$b,$c,$day,$mon,$year,$d,$e,$f) = localtime(time-86400);printf "%4d%02d%02d\n",$year+1900,$mon+1,$day'
复制代码

论坛徽章:
2
摩羯座
日期:2013-10-20 18:04:032015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2014-12-01 19:10 |只看该作者
回复 3# qq58945591
怎么怎么判断昨天啊?
就是不知道怎么做。


   

论坛徽章:
2
摩羯座
日期:2013-10-20 18:04:032015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2014-12-01 19:14 |只看该作者
回复 2# zooyo


ls -rt|tail -2 |grep -v “$date +%Y%m%d” 过滤掉今天的目录。
ls -rt列出来的目录名是这样的:20141129 20141128 20141127;我用虚拟机试了一下,好像不行
是否“$date +%Y%m%d”这个输出的是数值跟目录名是不同类型的,所以不能过滤,还是我命令表示不对?!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP