【问题标题】:Airflow Can't Connect to SFTP with SSH Private KeyAirflow 无法使用 SSH 私钥连接到 SFTP
【发布时间】:2020-10-28 22:48:08
【问题描述】:

我正在尝试使用带有 SSH 私钥而不是密码的 SFTP 操作员/挂钩。

我的连接有以下额外参数:{"key_file": "/home/airflow/key_files/some_key", "no_host_key_check": "true"}。我的 SSH 私钥如下所示:

-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

现在,当我尝试创建挂钩时,出现以下错误:

>>> from airflow.contrib.hooks.sftp_hook import SFTPHook
>>> s = SFTPHook(ftp_conn_id='my_sftp_connection')
[2020-07-08 13:40:25,449] {base_hook.py:84} INFO - Using connection to: id: my_sftp_connection. Host: my_sftp.com, Port: 22, Schema: None, Login: user, Password: None, extra: {'key_file': '/home/airflow/key_files/some_key', 'no_host_key_check': 'true'}
[2020-07-08 13:40:25,452] {base_hook.py:84} INFO - Using connection to: id: my_sftp_connection. Host: my_sftp.com, Port: 22, Schema: None, Login: user, Password: None, extra: {'key_file': '/home/airflow/key_files/some_key', 'no_host_key_check': 'true'}
>>> s.list_directory('/')
Traceback (most recent call last):
  File "/home/airflow/.local/lib/python3.6/site-packages/pysftp/__init__.py", line 167, in _set_authentication
    private_key_file, private_key_pass)
  File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/pkey.py", line 206, in from_private_key_file
    key = cls(filename=filename, password=password)
  File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/rsakey.py", line 55, in __init__
    self._from_private_key_file(filename, password)
  File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/rsakey.py", line 175, in _from_private_key_file
    data = self._read_private_key_file("RSA", filename, password)
  File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/pkey.py", line 279, in _read_private_key_file
    data = self._read_private_key(tag, f, password)
  File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/pkey.py", line 289, in _read_private_key
    raise SSHException("not a valid " + tag + " private key file")
paramiko.ssh_exception.SSHException: not a valid RSA private key file

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/airflow/.local/lib/python3.6/site-packages/airflow/contrib/hooks/sftp_hook.py", line 151, in list_directory
    conn = self.get_conn()
  File "/home/airflow/.local/lib/python3.6/site-packages/airflow/contrib/hooks/sftp_hook.py", line 114, in get_conn
    self.conn = pysftp.Connection(**conn_params)
  File "/home/airflow/.local/lib/python3.6/site-packages/pysftp/__init__.py", line 142, in __init__
    self._set_authentication(password, private_key, private_key_pass)
  File "/home/airflow/.local/lib/python3.6/site-packages/pysftp/__init__.py", line 171, in _set_authentication
    private_key_file, private_key_pass)
  File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/pkey.py", line 206, in from_private_key_file
    key = cls(filename=filename, password=password)
  File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/dsskey.py", line 65, in __init__
    self._from_private_key_file(filename, password)
  File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/dsskey.py", line 224, in _from_private_key_file
    data = self._read_private_key_file("DSA", filename, password)
  File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/pkey.py", line 279, in _read_private_key_file
    data = self._read_private_key(tag, f, password)
  File "/home/airflow/.local/lib/python3.6/site-packages/paramiko/pkey.py", line 289, in _read_private_key
    raise SSHException("not a valid " + tag + " private key file")
paramiko.ssh_exception.SSHException: not a valid DSA private key file

我在这里做错了什么?相同的 SSH 密钥适用于 WINSCP 和 bash 中的 SFTP 命令。

【问题讨论】:

    标签: python airflow sftp


    【解决方案1】:

    我想我明白了。我升级了那个 paramiko 库,现在它似乎正在工作。如果我做错了其他事情,会将此保留为未回答。

    【讨论】:

      【解决方案2】:

      我遇到了完全相同的问题,只是我使用的是 Composer,它是 Google Cloud 中基于 Airflow 的托管服务,并且我不使用 SFTP contrib 运算符。 相反,我使用 apache-airflow-backport-providers-sftp,它是从 Airflow 2.0 向后移植的,并且与我的 Airflow 环境(即 1.10.14)兼容。

      使用用户/密码可以正常工作,但使用 RSA 密钥失败。

      contrib 运算符和提供程序包是等效的,并且依赖于相同的 Python 模块:paramikopysftpsshtunnel

      我的pip freeze

      paramiko==2.7.2 (latest release)
      pysftp==0.2.9 (latest release)
      sshtunnel==0.1.5 (latest release is 0.4.0)
      

      据我了解,并按照您的描述,问题不在顶层模块(contrib 或 provider)中。您说问题出在paramiko,但对于我来说,使用 SSH 操作符和 RSA 密钥可以正常工作。所以,也许它在pysftp...

      我迷路了。

      【讨论】:

        猜你喜欢
        • 2015-03-31
        • 1970-01-01
        • 2021-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 2014-10-13
        • 2017-05-25
        相关资源
        最近更新 更多