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
文章图片


刚开始的时候我以为是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" ?
【rsync 匹配通配符 * 失败 link_stat failed: No such file or directory】因为在上面已经有"了,此处用\转义。

    推荐阅读