Shell脚本调用sftp拉取文件遇不存在目录卡住的问题求解
问题解决方法
根因分析
sftp批处理模式下,默认遇到执行失败的命令就会中断后续操作。你现有脚本中仅给mget命令加了忽略错误的-前缀,cd命令未加,所以当目标目录不存在、cd执行失败时,整个sftp任务就会中断卡住,不会执行后续的拉取和退出逻辑。
修复方案
方案1:直接添加忽略错误前缀(最简改法)
给所有cd命令前也加上-前缀,单条命令失败后仍会继续执行后续命令,就不会出现卡住的问题:
sshpass -p 'password' sftp -oBatchMode=no -o StrictHostKeyChecking=no -b - user1@www.ftp.com 1>$currentdir/listfiles.log << ! -cd /Root/work/in/abc/ -mget *.* -cd /Root/work/in/def/ -mget *.* bye !
可选优化项
- 新增超时配置避免网络异常卡住:在sftp参数中添加
-o ConnectTimeout=15,设置15秒连接超时,避免网络不通时长时间无响应 - 替换明文密码:配置SSH密钥对实现免密登录,去掉脚本中的明文密码,提升安全性
- 前置目录校验:可以在执行sftp前先批量校验目标目录是否存在,过滤不存在的目录后再生成拉取脚本,减少无效错误日志
内容的提问来源于stack exchange,提问作者Amrendra Kumar
相关产品推荐
相关产品推荐

