Python 2.7:从SFTP站点URL写入指定目录时遇权限错误
解决SFTP API写入文件时的权限错误问题
嘿,我来帮你排查这个权限错误的问题!从你给出的代码和描述来看,咱们可以从以下几个方向入手解决:
1. 先确认账号的API权限配置
首先要排除最基础的权限问题:你的username:password账号是否拥有目标目录Source_Directory的写入权限?很多SFTP类的API会给账号设置细粒度的目录权限,可能你的账号只能读取这个目录,没法写入。
你可以先用curl命令行快速测试一下写入操作,验证权限是否正常:
curl -u username:password -X PUT -T "你的本地测试文件.txt" "https://sftp.mmm.com:443/api/v1.1/files/Source_Directory/测试上传文件.txt"
如果命令行也返回权限错误,那直接联系站点管理员调整账号权限就好。
2. 检查代码的请求方式是否正确
看你当前的代码,其实只是用GET请求获取了目录的内容(没有设置上传相关的选项),并没有执行写入文件的操作。要上传文件,得调整pycurl的配置,匹配API要求的上传方式。
比如如果API支持PUT上传,你可以用这段代码试试:
import pycurl import os from io import BytesIO # 配置本地文件和远程路径 local_file = "/path/to/你的本地文件.txt" remote_upload_url = "https://sftp.mmm.com:443/api/v1.1/files/Source_Directory/上传后的文件名.txt" c = pycurl.Curl() try: # 打开本地文件用于读取 with open(local_file, 'rb') as file_obj: c.setopt(c.URL, remote_upload_url) c.setopt(c.USERPWD, "username:password") # 开启上传模式 c.setopt(c.UPLOAD, 1) # 指定要上传的文件对象 c.setopt(c.READDATA, file_obj) # 可选:设置文件大小,部分API需要这个参数 c.setopt(c.INFILESIZE, os.path.getsize(local_file)) c.perform() # 打印响应状态码,方便排查 print(f"上传请求完成,HTTP状态码: {c.getinfo(c.RESPONSE_CODE)}") except pycurl.error as e: print(f"上传失败,错误信息: {e}") finally: c.close()
注意:有些API可能要求用POST请求并以multipart/form-data格式上传,你需要对照该站点的API文档确认正确的上传方式。
3. 排查其他可能的问题
- 本地文件权限:确保运行代码的用户能读取你要上传的本地文件,虽然这是本地权限问题,但也可能导致上传失败。
- 远程路径正确性:确认
Source_Directory的路径拼写无误,有些API要求使用绝对路径(比如/files/完整路径/Source_Directory/),路径错误也可能返回类似权限错误的提示。
内容的提问来源于stack exchange,提问作者Matthew Mayo
相关产品推荐
相关产品推荐

