使用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
相关产品推荐
相关产品推荐

