Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在paramiko尝试进行身份验证之前,在欢迎横幅中获取ftp返回代码530(未登录)_Python_Paramiko - Fatal编程技术网

Python 在paramiko尝试进行身份验证之前,在欢迎横幅中获取ftp返回代码530(未登录)

Python 在paramiko尝试进行身份验证之前,在欢迎横幅中获取ftp返回代码530(未登录),python,paramiko,Python,Paramiko,我正在编写一个python脚本,使用paramiko自动从远程ftp主机进行每日下载。脚本成功连接,但随后表示横幅不正确并退出。它在尝试验证之前断开连接 我得到了这个异常:“SSHException:读取SSH协议横幅时出错”,根据日志,横幅的最后一行是“530请使用用户登录并通过。”注意返回代码530,这意味着“未登录”。我想这就是帕拉米科所反对的 我确实使用了用户名和密码(见下面的代码),但主机似乎希望在paramiko拿出用户名和密码之前使用它们。问题出现在Transport.start\

我正在编写一个python脚本,使用paramiko自动从远程ftp主机进行每日下载。脚本成功连接,但随后表示横幅不正确并退出。它在尝试验证之前断开连接

我得到了这个异常:“SSHException:读取SSH协议横幅时出错”,根据日志,横幅的最后一行是“530请使用用户登录并通过。”注意返回代码530,这意味着“未登录”。我想这就是帕拉米科所反对的

我确实使用了用户名和密码(见下面的代码),但主机似乎希望在paramiko拿出用户名和密码之前使用它们。问题出现在
Transport.start\u client()
中,它位于
Transport.auth\u password()
内部
Transport.connect()
之前

当我从命令行手动连接时,我可以使用以下命令触发530消息:

ftp -nd ftp.server.com
(我认为是由于
-n
阻止了自动登录,而
-d
启用了调试,因此我可以看到它。)530行紧跟在横幅后面,但实际上不是横幅的一部分。我知道这一点,因为如果我删除
-n
,我将无法获得它,但会立即提示您输入凭据。因此,paramiko必须做一些类似于
-n
选项的事情

我怎么能

  • 首先阻止530线,或
  • 让paramiko接受/忽略该行
  • …这样就可以进行身份验证了?我想paramiko的更高级的功能可以处理类似的情况,但我不知所措

    细节 这是我的代码,我认为这是一个很好的例子:

    #! /usr/bin/python2.7
    
    import paramiko
    import logging
    
    logging.getLogger('paramiko').setLevel(logging.DEBUG)
    paramiko.util.log_to_file('paramiko_log')
    
    host = 'ftp.server.com'
    port = 21
    user = 'anonymous'
    password = 'me@email.com'
    # It is an anonymous server so I really am signing in with
    # username 'anonymous' and my email address for a password.
    
    t = paramiko.Transport((host, port))
    t.connect(username=user, password=password)
    ftp = paramiko.SFTPClient.from_transport(t)
    # if I could get this far, this is where I would download the file.
    ftp.close()
    t.close()
    
    以下是运行上述代码生成的日志:

    DEB [20180725-08:52:34.230] thr=1   paramiko.transport: starting thread (client mode): 0xb69bb090L
    DEB [20180725-08:52:34.231] thr=1   paramiko.transport: Local version/idstring: SSH-2.0-paramiko_2.4.1
    DEB [20180725-08:52:34.287] thr=1   paramiko.transport: Banner: 220-This system is for authorized users only.
    ...[several more 220 lines]...
    DEB [20180725-08:52:34.289] thr=1   paramiko.transport: Banner: 530 Please login with USER and PASS.
    ERR [20180725-08:52:36.293] thr=1   paramiko.transport: Exception: Error reading SSH protocol banner
    ERR [20180725-08:52:36.294] thr=1   paramiko.transport: Traceback (most recent call last):
    ERR [20180725-08:52:36.294] thr=1   paramiko.transport:   File "/usr/lib/python2.7/site-packages/paramiko/transport.py", line 1893, in run
    ERR [20180725-08:52:36.294] thr=1   paramiko.transport:     self._check_banner()
    ERR [20180725-08:52:36.294] thr=1   paramiko.transport:   File "/usr/lib/python2.7/site-packages/paramiko/transport.py", line 2049, in _check_banner
    ERR [20180725-08:52:36.294] thr=1   paramiko.transport:     'Error reading SSH protocol banner' + str(e)
    ERR [20180725-08:52:36.294] thr=1   paramiko.transport: SSHException: Error reading SSH protocol banner
    
    我试过

  • 增加Transport.banner_timeout(对于与此特定paramiko异常相关的问题的常见建议),但没有帮助,因为它没有超时
  • 拆分
    Transport.connect(…)
    Transport.start\u client()
    Transport.auth\u password(用户,密码)
    ,但它不会更改任何内容。问题出在
    start\u client()
    内部

  • ftp、ftps还是sftp?Paramiko用于SSH访问。标准ftp与SSH无关,您不会使用paramiko。如果是标准ftp,请查看名为ftplib的python标准库。请参阅@clockwatcher,这是一个使用错误工具进行作业的典型案例。我错误地认为ftp和sftp是相关的,帕拉米科可以同时做这两件事。新手移动。谢谢你帮我澄清。