You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:27:02