提问者:小点点

派拉米科。ssh\u异常。即使提供了已知的\u主机文件,是否仍存在SSHException?


获取错误

帕拉米科。ssh\u异常。SSHException:没有主机目标的主机密钥。组织发现。

当使用pysftp(用于需要特定端口的连接)时,即使我提供的是最初用于连接到该位置的相同已知_hosts文件(在本文后面)。例如,你有。。。

[airflow@airflowetl reporting]$ sftp -oPort=15259 my_user@target.org
The authenticity of host '[target.org]:15259 ([205.172.2.88]:15259)' can't be established.
RSA key fingerprint is SHA256:UM6OflG0rkcYohes7qOlYoJZ4TIqVd0JQSh7HXYZQVA.
RSA key fingerprint is MD5:33:c2:30:22:57:5b:57:98:2f:11:07:4d:a3:4a:10:0f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[target.org]:15259,[205.172.2.88]:15259' (RSA) to the list of known hosts.
password
Enter password for my_user
Password:
Connected to target.org.
sftp> ls
csv_drop        test_results    
sftp> exit

然后复制了/home/me/。ssh/known_hosts到另一个位置

[airflow@airflowetl .ssh]$ ls -lha
total 8.0K
drwx------   2 airflow airflows   25 Oct 19 17:31 .
drwx------. 32 airflow airflows 4.0K Oct 19 17:31 ..
-rw-r--r--   1 airflow airflows  777 Oct 19 17:32 known_hosts
[airflow@airflowetl .ssh]$ ls -lha /home/airflow/projects/backups/reporting/configs/known_hosts 
-rw-r--r-- 1 airflow airflows 777 Oct 19 17:34 /home/airflow/projects/backups/reporting/configs/known_hosts

(注意,权限是原件和副本的名称)使用起来就像。。。


# connect to ftp location
assert os.path.isfile(os.path.join(PROJECT_HOME, "configs", "known_hosts"))
cnopts = pysftp.CnOpts(knownhosts=os.path.join(PROJECT_HOME, "configs", "known_hosts"))
#cnopts = pysftp.CnOpts(knownhosts="/home/airflow/.ssh/known_hosts")
HOSTNAME = "target.org"
PORT = 15259
sftp = pysftp.Connection(HOSTNAME,
                         port=PORT,
                         username=CREDS["sink"]["ftp_creds"]["username"],
                         password=CREDS["sink"]["ftp_creds"]["password"],
                         cnopts=cnopts)
print(sftp.pwd())
print(sftp.listdir())

sftp.cwd(CONF["reporting_configs"]["to"]["share_folder_path"])
print(sftp.pwd())
print(sftp.listdir())

然而,当运行脚本时,我得到一个错误,说它找不到主机密钥(请注意,即使使用原始known_hosts文件路径也会抛出相同的错误(无论使用主机名还是IP都会发生)。这是什么引起的?我可以尝试更多的调试步骤来获取更多信息吗?对这种事情没有太多经验。

在运行时查看调试器,我看到cnopt主机键条目似乎包含正确的主机键...

<HostKeyEntry ['[target.org]:15259', '[205.172.2.88]:15259']: <paramiko.rsakey.RSAKey object at 0x7f8d752d4208>>

请注意,主机密钥条目是[target.org]: 15259(即它正在组合指定的端口),即使作为连接函数的服务名称提供的名称只是target.org

完整的追溯看起来像...

Traceback (most recent call last):
  File "./source/local2ftp.2.py", line 52, in <module>
    cnopts=cnopts)
  File "/home/airflow/projects/backups/reporting/venv/lib/python3.6/site-packages/pysftp/__init__.py", line 132, in __init__
    self._tconnect['hostkey'] = self._cnopts.get_hostkey(host)
  File "/home/airflow/projects/backups/reporting/venv/lib/python3.6/site-packages/pysftp/__init__.py", line 71, in get_hostkey
    raise SSHException("No hostkey for host %s found." % host)
paramiko.ssh_exception.SSHException: No hostkey for host target.org found.
Exception ignored in: <bound method Connection.__del__ of <pysftp.Connection object at 0x7f1a61df6f98>>
Traceback (most recent call last):
  File "/home/airflow/projects/backups/reporting/venv/lib/python3.6/site-packages/pysftp/__init__.py", line 1013, in __del__
    self.close()
  File "/home/airflow/projects/backups/reporting/venv/lib/python3.6/site-packages/pysftp/__init__.py", line 784, in close
    if self._sftp_live:
AttributeError: 'Connection' object has no attribute '_sftp_live'

请注意,我最初用于通过命令行中的sftp进行连接并在pysftp脚本中使用的用户不是运行脚本的用户(我用于连接到sftp服务器的用户是用于连接的一组特殊凭据)。我不知道这是否相关。


共2个答案

匿名用户

PYSFP不支持带有端口的主机密钥项。

  • 跳过pysftp并直接使用Paramiko
  • 或者通过将[target.org]:15259替换为目标来破解它。组织位于已知主机文件中

匿名用户

TLDR:代码需要pystfp。连接主机名以匹配主机密钥文件(例如。~/. ssh/known_hosts),但是如果主机密钥文件条目中的rsa条目是用指定端口的连接创建的,从而导致known_hosts中的rsa条目以pysftp无法理解/处理的方式格式化,

喜欢

[airflow@airflowetl reporting]$ sftp -oPort=15259 my_user@target.org

创建的rsa条目看起来像...

'[target.org]:15259,[205.172.2.88]:15259 ssh-rsa AAAAB3HJGVJGCTCKHGVYTVKUH===...'

因此,当您将此主机密钥文件用于中的knownhosts时。。。

cnopts = pysftp.CnOpts(knownhosts=os.path.join(path, to, hostkey, or, known_hosts, file))
hostname = "target.org"
port = 15259
sftp = pysftp.Connection(hostname, port, username=user, password=pass, cnopts=cnopts)

代码最后检查hostkey文件中的条目

"target.org"

(您输入的主机名),但仅查找

"[target.org]:15259"

(hostkey/known_hosts文件中针对您连接的特定端口格式化的条目)因此引发错误。

还要注意的是,您不能只使用“[target.org]:15259”作为pysftp的hostname。Connection()函数,或者只是在pysftp代码执行此内部检查时使其匹配,因为它会说它无法识别服务名称,因为(显然)这不是有效的servicename表示(也就是说,它不只是知道如何将该字符串分为主机名端口组件)。

我要做的是。。。

  • 复制初始连接到目标时创建的已知_hosts文件。组织主机
'target.org,205.172.2.88 ssh-rsa AAAAB3HJGVJGCTCKHGVYTVKUH===...'

特别是在代码中,pysftp。连接()函数。。。

  1. 试图获取主机密钥
  2. 并使用基础的Paraminko模块尝试从cnoptarg
  3. 中给出的已知主机文件中查找主机密钥条目
  4. 它在这里使用函数来匹配来自host key文件的字符串文字条目与您作为pysftp输入的host name。连接arg(如果您连接到使用特定端口,则创建了一个rsa条目,当将其作为文字时,该条目的格式不像您在主机名arg中传递的那样,甚至不是有效的主机名),从而混淆了匹配逻辑,导致它找不到任何匹配
  5. 从而引发异常,回到pysftpcode