rsync 匹配通配符 * 失败 link_stat failed: No such file or directory

rsync -avP /home/map/mongodb2.4.6/data/road140403* map@hz12:/home/map/users/wangxin/script/tmp

上面的命令执行的时候不会报任何错误,并正常的同步数据,此时会弹出交互界面,并提示要输入

hz12服务器的密码,但如果这种操作放在脚本里就要expect来支持,如果放在expect里面的话会报

如下错误:

rsync: link_stat "/home/map/mongodb/data/road140403*" failed: No such file or directory (2)

具体情况如下:

rsync 匹配通配符 * 失败 link_stat failed: No such file or directory_第1张图片

刚开始的时候我以为是rsync无法匹配通配符*才导致的。

后来发现不是该问题,是由于expect里面无法匹配 * 才导致的。

解决办法:

在spawn 后面加上 bash -c "command"

这样expect就认出了通配符*。

脚本如下:

#!/bin/bash
function func_expect {
ExpEnv=`which expect`
$ExpEnv -c "
set timeout -1;
spawn bash -c \"$1\";
expect {
\"(yes/no)?\" {send \"yes\n\";expect \"assword:\";send \"$2\n\"}
\"assword:\" {send \"$2\n\"}
eof {exit 0;}
}
expect eof"
}
{
/home/map/mongodb2.4.6/bin/mongod --shutdown --dbpath=/home/map/mongodb2.4.6/data
pwd="******"
cmd1="rsync -avP /home/map/mongodb2.4.6/data/road140403* map@hz12:/home/map/users/wangxin/script/tmp"
func_expect "$cmd1" "$pwd"

PS:为什么在spawn处用\" $1\" 而不是"$1" ?

      因为在上面已经有"了,此处用  \  转义。

你可能感兴趣的:(Linux)