在 Linux 下自动化 SFTP 任务,常见且可靠的做法有几种,下面按推荐程度和使用场景说明。
sftp + 批处理脚本(最常用)sftp -b 批处理模式sftp 支持 -b 参数执行命令文件,无需交互。
# 1. 编写 sftp 命令文件
cat > sftp_cmds.txt <<EOF
cd /remote/upload
put localfile.txt
get remotefile.txt
bye
EOF
# 2. 执行
sftp -b sftp_cmds.txt user@host
✅ 适合:
否则每次都要输密码,无法自动化。
ssh-keygen -t rsa
ssh-copy-id user@host
验证:
sftp user@host
lftp(更强大,推荐进阶)lftp 支持 SFTP、脚本、断点续传。
yum install lftp # CentOS
apt install lftp # Ubuntu
lftp sftp://user@host <<EOF
cd /remote
put file.txt
mget *.log
bye
EOF
✅ 优点:
expect(不推荐但可用)适合无法使用密钥的 legacy 系统。
#!/usr/bin/expect
spawn sftp user@host
expect "password:"
send "yourpassword\r"
expect "sftp>"
send "put file.txt\r"
expect "sftp>"
send "bye\r"
⚠️ 缺点:
rsync over SSH(如果你能控制协议)虽然不是 SFTP,但常是最佳替代:
rsync -avz -e ssh file user@host:/path/
crontab -e
示例(每天 2 点):
0 2 * * * /home/user/sftp_upload.sh
#!/bin/bash
HOST=user@host
LOCAL=/data/file.txt
REMOTE=/upload/
sftp -b - $HOST <<EOF
put $LOCAL $REMOTE
bye
EOF
| 场景 | 推荐 |
|---|---|
| 简单上传下载 | sftp -b |
| 复杂/批量 | lftp |
| 无密钥环境 | expect(临时) |
| 可改协议 | rsync |
如果你愿意,可以告诉我:
我可以帮你写一份可直接用的脚本。