【问题标题】:Python ftplib error 553Python ftplib 错误 553
【发布时间】:2015-10-15 06:41:14
【问题描述】:

我正在尝试使用 python 连接到服务器并将一些文件从我的本地目录上传到 /var/www/html 但每次我尝试这样做时都会收到此错误:

错误:ftplib.error_perm: 553 无法创建文件。

我已经对路径做了一个 chown 和一个 chmod -R 777 。我正在使用 vsftpd 并且已经设置了写入功能。有人有什么想法吗?

代码:

ftp = FTP('ipaddress')
ftp.login(user='user', passwd = 'user')
ftp.cwd('/var/www/html')
for root, dirs, files in os.walk(path):
    for fname in files:
        full_fname = os.path.join(root, fname)
        ftp.storbinary('STOR' + fname, open(full_fname, 'rb'))

【问题讨论】:

标签: python ftp


【解决方案1】:

path == '/var/www/html' 是吗?那是本地路径。您需要一个 FTP 路径。

本地路径/var/www/html 通常无法通过 FTP 访问。当您连接到 FTP 服务器时,呈现给您的文件系统开始通常位于用户的主目录 /home/user

因为听起来您正在远程机器上运行 ftp 服务器 (vsftpd),所以最简单的解决方案可能是这样的:

user@server:~$ ln -s /var/www/html /home/user/html

然后您可以调用ftp.cwd('html')ftp.nlst() 来获取远程目录列表,并从那里导航。

另外,不要忘记在'STOR' 字符串中添加一个空格字符(应该是'STOR ')。

祝你好运!

【讨论】:

  • 对不起,我在那里遗漏了一行。一旦我登录到服务器,我就会执行“ftp.cwd('/var/www/html')”以及 ftp.nlst(),所以我知道我在正确的路径中。我将尝试 ln -s 看看它是否有效。谢谢!
【解决方案2】:

我也遇到了类似的问题,也收到了错误553: Could not create file。什么(update:部分)为我解决了这个问题:

ftp.storbinary('STOR' + fname, open(full_fname, 'rb'))

到:

ftp.storbinary('STOR ' + '/' + fname, open(full_fname, 'rb'))

请注意,在“STOR”之后有一个 空格,我在文件名之前添加了一个正斜杠 ('/'),​​以表明我希望将文件存储在 FTP 中根目录

更新: [2016-06-03] 其实这只解决了部分问题。后来我意识到这是一个权限问题。 FTP 根目录允许 FTP 用户写入,但我使用另一个用户在此目录中手动创建了文件夹,因此新目录不允许 FTP 用户写入这些目录。

可能的解决方案:

  1. 更改目录的权限,使 FTP 用户是 这些目录的所有者,或者至少能够阅读和 写信给他们。
  2. 使用ftp.mkd(dir_name) 函数创建目录,然后使用ftp.cwd(dir_name) 函数更改目录并 然后使用适当的 STOR 函数(storlinesstorbinary) 将文件写入当前目录。

    • 就我的理解而言,STOR 命令似乎只将文件名作为参数(而不是文件路径),这就是为什么在使用 STOR 函数之前需要确保您位于正确的“工作目录”中的原因(记住 STOR 命令后的空格)

      ftp.storbinary('STOR ' + fname, open(full_fname, 'rb'))

【讨论】:

  • 我发现在尝试下载文件之前执行ftp.cwd('/path/to/files/') 有助于解决我在ftp.retrbinary 上收到此553 错误的问题
【解决方案3】:

我确信此时您已经找到了解决方案,但是我在寻找解决方案时偶然发现了这个线程。我最终使用了以下内容:

# Handles FTP transfer to server
def upload(ftp, dir, file):
    # Test if directory exists. If not, create it
    if dir.split('/')[-1] not in ftp.nlst('/'.join(dir.split('/')[:-1])):
        print("Creating directory: " + dir)
        ftp.mkd(dir)
    # Check if file extension is text format
    ext = path.splitext(file)[1]
    if ext.lower() in (".txt", ".htm", ".html"):
        ftp.storlines("STOR " + dir + '/' + file, open(dir + '/' + file, "rb"))
    else:
        ftp.storbinary("STOR " + dir + '/' + file, open(dir + '/' + file, "rb"), 1024)

【讨论】:

    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多