部署
1)配置 users.conf
规则:
ruby
<username>:<passwd>:<用户id>:<用户组id>:<用户子目录>
用户子目录说明:
假设用户名为:sftpUser
- 用户目录:/home/sftpUser 目录的权限默认所属为 root:root;并且其他用户以及用户组只有读和执行的权限
2)当使用 sftpUser 用户登录后;默认进入的目录是 /home/sftpUser;但是 atmoz/sftp 的 chroot 会把 /home/sftpUser
当作"虚拟根目录" /
3)所以当 / 目录下没有任何目录的时候,就会出现创建目录也创建不了
users.conf 示例:
ruby
# sftp 的用户名为:sftpUser; 密码为: 8ff$hk90NM4@oyF;
# 中间的 :: 点,没有写;就是让系统自己去分配
# 用户子目录为 upload
sftpUser:8ff$hk90NM4@oyF:::upload
sftpUser2:8ff$hk90NM4@oyF:::upload

2) 运行 sftp 容器
/app/docker/sftp/users.conf:这个 users.conf 是让 sftp 在初始化的时候创建用户
/app/docker/sftp/upload:这个是 映射的 sftp 的/home 的目录,sftp 存储都是在用户目录下,所以这里映射着所有上传的文件
bash
docker run \
-v /app/docker/sftp/conf/users.conf:/etc/sftp/users.conf:ro \
-v /app/docker/sftp/upload:/home \
-p 2222:22 -d atmoz/sftp

上传目录说明
sftpUser:8ff$hk90NM4@oyF:::upload 用户子目录为 upload ;实际目录为 /home/sftpUser/upload
那么程序上传的路径就要配置为 /upload
atmoz/sftp 的 chroot 会把 /home/sftpUser
当作"虚拟根目录" /
;使用 sftpUser 账号登录后当然只看到 /upload 目录
验证方式:
yaml
# sftpUser 为对应的用户名
sftp -P 2222 sftpUser@<host-ip>

测试上传
远程上传地址从 /upload 开始,因为 用户子目录为 upload(实际路径:/home/sftpUser/upload)
ini
import paramiko
def sftp_upload(local_path, remote_path, host, port, username, password):
# 创建SSH客户端
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
# 连接服务器
ssh.connect(hostname=host, port=port, username=username, password=password)
# 创建SFTP客户端
sftp = ssh.open_sftp()
# 上传文件
sftp.put(local_path, remote_path)
print(f"文件上传成功: {local_path} -> {remote_path}")
except Exception as e:
print(f"上传失败: {e}")
finally:
# 关闭连接
if 'sftp' in locals():
sftp.close()
ssh.close()
# 使用示例
if __name__ == "__main__":
# 配置信息
host = "你的ip"
port = 2222
username = "sftpUser"
password = "8ff$hk90NM4@oyF"
# 文件路径
local_file = "E://1.txt"
# sftp 存储位置
remote_file = "/upload/1.txt"
# 执行上传
sftp_upload(local_file, remote_file, host, port, username, password)
执行后:
