Bash脚本执行SFTP批量下载bak*目录时进程提前终止问题求助
SFTP批量下载脚本提前终止解决方案
核心原因
- Expect默认超时等待时间为30秒,你执行
get -r bak*需要2小时才能完成,下载过程中sftp>提示符长时间不返回,超过Expect超时阈值后,程序会直接跳过当前等待,执行后续的send "bye\r"命令主动断开连接,这是进程提前终止的主要原因。 - 原有脚本退出逻辑存在错误:发送
bye命令后sftp会话已经直接关闭,不需要再等待sftp>提示符后发送exit命令,冗余逻辑也可能触发异常。 - 长时间无交互的sftp连接可能被远程服务器主动断开,导致下载中断。
修正后的完整脚本
#!/bin/bash data="$(date +\%Y\%m\%d)" PASSW="pippo" comando0="cd /remote/path" comando1="get -r bak*" # 增加路径合法性判断,避免目录不存在时报错 cd /local/path || exit 1 mkdir -p "$data" cd "/local/path/$data" || exit 1 /usr/bin/expect -c " # 设置超时为永不超时,也可设为3小时(10800秒)匹配预计下载时长 set timeout -1 # 增加心跳参数,每60秒发送一次保活包,避免服务器主动断开连接 spawn /usr/bin/sftp -o ServerAliveInterval=60 user@ip expect \"Password:\" send \"$PASSW\r\" expect \"sftp>\" send \"$comando0\r\" expect \"sftp>\" send \"$comando1\r\" # 等待下载完成后返回sftp提示符 expect \"sftp>\" send \"bye\r\" # 等待sftp进程正常退出 expect eof "
额外优化建议
- 所有路径变量都包裹双引号,避免路径包含空格、特殊字符时执行出错
- 如果担心异常卡死,可以将超时时间设置为大于预计下载时长的合理值,比如3小时对应
set timeout 10800,单位为秒 - 若脚本需要长期维护,建议将expect逻辑单独保存为
.exp后缀的独立脚本,避免嵌套在Bash中出现转义错误
内容的提问来源于stack exchange,提问作者Erasmo Vizzaccaro
相关产品推荐
相关产品推荐

