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

使用sshpass+SFTP通过Crontab传输文件失败,命令行可正常执行

Crontab执行Python脚本失败的排查与解决建议

以下是针对你的问题的具体排查和修复步骤:

1. 修复所有相对路径问题

crontab执行时的工作目录默认是用户主目录(如/home/postgres),而非脚本所在目录,所有相对路径都会失效:

  • 修改Python脚本中的命令为绝对路径:
    cmd='/bin/bash /opt/bin/sftp_file.sh'
    c=os.system(cmd)
    
  • 修改sftp_file.sh中的批处理文件路径为绝对路径:
    export SSHPASS="<password>" && sshpass -e /usr/bin/sftp -o BatchMode=no -o StrictHostKeyChecking=no -b /opt/bin/sftp_batchfile.sh login1@hostipaddress
    
  • 修改sftp_batchfile.sh中的文件路径为绝对路径:
    cd dir1
    cd dir2
    put "/path/to/file1.csv"
    

2. 补全环境变量

crontab不会加载用户的.bashrc/.profile配置,导致环境变量缺失:

  • 在sftp_file.sh开头添加环境变量加载语句(如果postgres使用bash):
    source /home/postgres/.bashrc
    
  • 或者直接在crontab任务中指定完整PATH:
    25 * * * * postgres PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin python /opt/bin/script_file.py
    

3. 捕获错误日志

当前无报错信息无法定位问题,需强制输出日志:

  • 修改crontab任务,重定向所有输出到日志文件:
    25 * * * * postgres python /opt/bin/script_file.py >> /var/log/script_cron.log 2>&1
    
  • 改用Python的subprocess模块替代os.system,捕获更详细的执行信息:
    import subprocess
    import datetime
    
    cmd = '/bin/bash /opt/bin/sftp_file.sh'
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
    
    # 将日志写入文件
    with open('/var/log/sftp_script_detail.log', 'a') as log_file:
        log_file.write(f"执行时间: {datetime.datetime.now()}\n")
        log_file.write(f"标准输出: {result.stdout}\n")
        log_file.write(f"错误输出: {result.stderr}\n")
        log_file.write(f"返回码: {result.returncode}\n\n")
    
  • 在sftp_file.sh中重定向sftp的输出:
    export SSHPASS="<password>" && sshpass -e /usr/bin/sftp -o BatchMode=no -o StrictHostKeyChecking=no -b /opt/bin/sftp_batchfile.sh login1@hostipaddress >> /var/log/sftp_cron.log 2>&1
    

4. 检查权限与SSH上下文

  • 确保所有脚本文件有执行权限:
    sudo chmod +x /opt/bin/script_file.py /opt/bin/sftp_file.sh /opt/bin/sftp_batchfile.sh
    
  • 检查postgres用户的.ssh目录权限(若不存在则创建):
    sudo -u postgres mkdir -p /home/postgres/.ssh
    sudo -u postgres chmod 700 /home/postgres/.ssh
    
  • 确认sshpass和sftp的绝对路径正确,可通过which sshpass、which sftp验证后替换脚本中的路径。

5. 验证Crontab用户上下文

  • 确保任务是通过sudo -u postgres crontab -e编辑的,而非在root的crontab中强制指定postgres用户(两种方式均可行,但需确认上下文一致)。
  • 检查/etc/cron.allow和/etc/cron.deny,确保postgres用户被允许执行crontab任务。

内容的提问来源于stack exchange,提问作者SudipM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:29:10