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

来源:互联网 发布:股票下单软件 定制 编辑:程序博客网 时间:2024/05/10 04:38

今天需要备份Solr中的一张大表的Shard(估计几百G)到一块硬盘里,一共11个节点,如果挨个备份那就需要一定时间了,第一时间想到的办法是,用nohup后台Scp过去

下面是命令

nohup scp -r /solr/tableName* root@192.168.*.*:/mnt/usb1 > /dev/null &

可是在节点上执行出现了问题,看日志应该是*号匹配到的文件每个都需要输入一次密码.

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

scp -r /solr/shard* root@192.168.1.1:/mnt/usb

不过这样我就只能开着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 -1spawn bash -c  \"scp -r /solr/shard* root@192.168.1.1:/mnt/usb \"expect  \"password:\" send \"123456\r\"# 如果遇到了文件结束符(EOF),该程序就会停下来,然后expect返回expect eof

方案二(方案一在一开始调试的时候有问题,后来在研究明白expect eof 后才完善方案一)

#!/bin/bash#在bin/bash情况加添加循环逐个进行scpfor file in `ls /solr/ | grep shard`do/usr/bin/expect -c " set timeout -1spawn 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

该解决方案思路是采用Except命令来解决交互性的,详细使用参考下文

http://www.cnblogs.com/lzrabbit/p/4298794.html
http://www.myexception.cn/linux-unix/1772272.html

0 0
原创粉丝点击