解决Linux下Scp命令免密码远程复制

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/q2365921/article/details/54192366
今天需要备份Solr中的一张大表的Shard(估计几百G)到一块硬盘里,一共11个节点,如果挨个备份那就需要一定时间了,第一时间想到的办法是,用nohup后台Scp过去

下面是命令

nohup scp -r /solr/tableName* root@192.168.*.*:/mnt/usb1 > /dev/null &
1
可是在节点上执行出现了问题,看日志应该是*号匹配到的文件每个都需要输入一次密码.

唉这下估计是不行了,但想了想如果不加nohup这样敲又可以

scp -r /solr/shard* root@192.168.1.1:/mnt/usb
1
不过这样我就只能开着shell一直等到他全部备份了,那样需要很长时间,而且我是连着VPN操作的

不过我记得还有一个命令可以解决这种场景 
下面就是我的解决方案:将下面的命令保存为expect.sh脚本,并且安装expect环境,执行nohup sh expect.sh >/de v/null & 。 
注意:不要忘记添加 spawn bash -c 该命令解决Spawn 中通配符识别问题,如不添加则expect 将会把solr/tab* 识别为字符串,而不是多个路径 因为expect相当于一个独立环境,不回将*号识别为通配符

方案一

#!/bin/bash
#添加shell环境
/usr/bin/expect -c "
#设置超时时间-1为永不超时
set timeout -1
spawn bash -c  \"scp -r /solr/shard* root@192.168.1.1:/mnt/usb \"
expect  \"password:\" 
send \"123456\r\"
# 如果遇到了文件结束符(EOF),该程序就会停下来,然后expect返回
expect eof
1
2
3
4
5
6
7
8
9
10
方案二(方案一在一开始调试的时候有问题,后来在研究明白expect eof 后才完善方案一)

#!/bin/bash
#在bin/bash情况加添加循环逐个进行scp
for file in `ls /solr/ | grep shard`
do
/usr/bin/expect -c " 
set timeout -1
spawn bash -c  \"scp -r /solr/$file  root@192.168.1.1:/mnt/usb\"
expect {
 #exp_continue 继续执行后面的匹配
 \"(yes/no)?\" {send \"yes\r\";exp_continue}
 \"password:\" {send  \"123456\r\"}
}
expect eof
"
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
该解决方案思路是采用Except命令来解决交互性的,详细使用参考下文

http://www.cnblogs.com/lzrabbit/p/4298794.html 
http://www.myexception.cn/linux-unix/1772272.html
 ———————————————— 
版权声明:本文为CSDN博主「南烛」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/q2365921/article/details/54192366

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值