Linux下如何在Rsync中执行命令实现远程文件查找并拷贝到本地
Rsync从远程筛选指定文件拷贝到本地的正确写法
错误原因
你原命令的核心问题是参数范围错误:-e参数仅用于定义远程连接使用的shell指令,你错误地将远程主机地址、远程筛选逻辑全部塞进了-e的参数值中,完全不符合rsync的语法规范。
原错误命令:
rsync -avzP -e "'ssh -i mykey.ppk' 'admin@myserver.com' 'cd /home/profile/logs && ls -1 *.log | grep localhost | tail -1'" /tmp/
推荐实现方案
方案1:两步执行(稳定性最高,适合日常使用)
先通过ssh远程筛选得到目标文件名,再调用rsync拉取:
- 远程查询最新的匹配
localhost的日志文件名
remote_file=$(ssh -i mykey.ppk admin@myserver.com "cd /home/profile/logs && ls -1 *.log | grep localhost | tail -1")
- 拉取文件到本地
/tmp目录
rsync -avzP -e "ssh -i mykey.ppk" admin@myserver.com:/home/profile/logs/$remote_file /tmp/
方案2:单行命令(适合脚本集成)
通过命令替换直接嵌套筛选逻辑,写为单行指令:
rsync -avzP -e "ssh -i mykey.ppk" admin@myserver.com:/home/profile/logs/$(ssh -i mykey.ppk admin@myserver.com "cd /home/profile/logs && ls -1 *.log | grep localhost | tail -1") /tmp/
注意事项
- 如果目标文件名可能包含空格、特殊字符,需要给路径变量包裹双引号避免解析错误,例如拉取时写为
"admin@myserver.com:/home/profile/logs/$remote_file" - 可以用
find命令替代ls+grep的筛选逻辑,兼容性更强,筛选部分可替换为:find /home/profile/logs -name "*localhost*.log" -type f | sort | tail -1 - 若当前环境的ssh客户端不支持ppk格式密钥,需要先用puttygen将ppk转换为openssh格式的私钥文件使用
内容的提问来源于stack exchange,提问作者Natasha
相关产品推荐
相关产品推荐

