当前位置: 首页 > 面试题库 >

仅使用服务器指纹即可使用pysftp和Python 3连接到SFTP服务器

葛勇锐
2023-03-14
问题内容

我处于一种奇怪的情况下,我需要第一次连接到SFTP服务器,但似乎找不到找到访问该服务器的已知主机条目的方法。如果我可以连接很好说:

import pysftp
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
with pysftp.Connection('host', username='me', password='pass', cnopts=cnopts):

但显然,这会让您在中间攻击时对男人敞开怀抱。所以我尝试连接:

cnopts = pysftp.CnOpts(knownhosts='config/known_host')
cnopts.hostkeys = None

with pysftp.Connection(host, username=username, password=password, cnopts=cnopts) as sftp:

而且我得到各种错误消息。最近的是:

paramiko.hostkeys.InvalidHostKey

问题是我没有主机密钥,因为我是第一次连接。我试图从其他连接中获取密钥。我使用WinSCP,但是它将密钥存储在注册表文件中,并且格式与known_host不同。我试图使用ssh-
keyscan用PuTTY来获取它,但是服务器甚至不允许我启动终端会话。我们不是盒子的主人,托管服务提供商不太可能提供我们所需的东西。

我不走运吗?我应该继续绕过按键检查吗?


问题答案:

可以在Python中找到解决方案-pysftp / paramiko-
使用其指纹验证主机密钥,
但是我必须对其进行一些改动才能使用Python 3。

import hashlib as hl


def trim_fingerprint(fingerprint):
    #if fingerprint.startswith('ecdsa-sha2-nistp384 384 '):
        #return fingerprint[len('ecdsa-sha2-nistp384 384 '):]
    return fingerprint


def clean_fingerprint(fingerprint):
    #return trim_fingerprint(fingerprint).replace(':', '')
    return trim_fingerprint(fingerprint)

class FingerprintKey:

    def __init__(self, fingerprint):
        self.fingerprint = clean_fingerprint(fingerprint)

    def compare(self, other):
        if callable(getattr(other, "get_fingerprint", None)):
            return other.get_fingerprint() == self.fingerprint
        elif clean_fingerprint(other) == self.get_fingerprint():
            return True
        #elif hl.md5(other).digest().encode('hex') == self.fingerprint:
        #The line below is required for Python 3.  Above is Python 2.
        elif hl.md5(other).hexdigest() == self.fingerprint:
            return True
        else:
            return False

    def __cmp__(self, other):
        return self.compare(other)

    def __contains__(self, other):
        return self.compare(other)

    def __eq__(self, other):
        return self.compare(other)

    def __ne__(self, other):
        return not self.compare(other)

    def get_fingerprint(self):
        return self.fingerprint

    def get_name(self):
        return u'ecdsa-sha2-nistp384'

    def asbytes(self):
         # Note: This returns itself.
         #   That way when comparisons are done to asbytes return value,
         #   this class can handle the comparison.
        return self

我必须手动从指纹中删除任何“:”,因为它从未允许脚本执行此操作。

用法:

options = pysftp.CnOpts()
options.hostkeys.clear()
options.hostkeys.add('www.sample.com', u'ecdsa-sha2-nistp384 384 ', AuthOnFingerPrint.FingerprintKey(serverkey))

其中serverkey是指纹。



 类似资料:
  • 我遇到了一种奇怪的情况,第一次需要连接到SFTP服务器,但似乎找不到访问该服务器已知主机条目的方法。如果我说: 但显然这让你容易受到中间人的攻击。因此,我尝试连接: 我会收到各种各样的错误信息。最近的一次是: 我运气不好吗?我是不是应该绕过钥匙检查?

  • --状态:连接到10.10.10.04:21... 状态:连接已建立,正在等待欢迎消息... 状态:正在初始化TLS... 状态:正在验证证书... 状态:TLS连接已建立。 状态:已登录 状态:正在检索目录列表... 状态:“/”的目录列表成功

  • 在我的C#项目中,为了连接到SFTP服务器,我包含了。目前,我尝试实现一个简单的连接方法,如下所示: 已连接,但无法接收来自FTP服务器的问候语。 根据Chilkat的文件。 我错过了什么?我尝试连接到一个简单的ftp服务器测试(没有SSL/TLS),它连接正确,所以我想我错过了什么。当我尝试用Filezilla连接到SFTP服务器时,给出的凭据是正确的。谢谢你。 更新

  • 问题内容: 我编写了一个Python脚本,以使用密钥身份验证连接到SFTP服务器。它成功连接到服务器,但显示以下警告(请参阅下文)。这是什么意思以及如何删除它。必须对代码进行哪些更改? 我的代码: 警告: 问题答案: 我相信这是pysftp中的错误。您每次使用时都会得到此提示(尽管警告实际上建议您使用该提示)。 无论如何,您不应该使用,因为这样做会失去安全性。 有关正确的解决方案,请参阅使用pys

  • 本文向大家介绍使用phpMyAdmin连接到外部服务器,包括了使用phpMyAdmin连接到外部服务器的使用技巧和注意事项,需要的朋友参考一下 下面的代码行可以添加到底部的/etc/phpmyadmin/config.inc.php文件中- 它将显示“当前服务器:”,并同时下拉“ 127.0.0.1”和$cfg ['Servers'] [$i] ['host']提供的下拉列表。 用户可以在两个服务

  • 这是mysql连接php脚本。它不断地显示出它的错误 警告:mysqli_connect():(HY000/1045):用户'user'@'localhost'(使用密码:YES)在第6行的C:\xampp\htdocs\index.php访问被拒绝 注意:尝试在第7行连接成功的C:\xampp\htdocs\index.php中获取非对象的属性 我听不懂,请帮帮我好吗?