canonical/pycloudlib

[Bug] Need to better handle erorr when pubkey auth fails but password auth is enabled

Opened this issue · 0 comments

The following happened to me on Oracle Cloud when using an existing instance with no ~/.ssh/authorized_keys BUT password authentication enabled:

Traceback (most recent call last):
  File "/home/a-dubs/work/pycloudlib/pycloudlib/instance.py", line 441, in _ssh_connect
    client.connect(
  File "/home/a-dubs/.virtualenvs/pycloudlib-lvxe/lib/python3.10/site-packages/paramiko/client.py", line 485, in connect
    self._auth(
  File "/home/a-dubs/.virtualenvs/pycloudlib-lvxe/lib/python3.10/site-packages/paramiko/client.py", line 818, in _auth
    raise saved_exception
  File "/home/a-dubs/.virtualenvs/pycloudlib-lvxe/lib/python3.10/site-packages/paramiko/client.py", line 788, in _auth
    key = self._key_from_filepath(
  File "/home/a-dubs/.virtualenvs/pycloudlib-lvxe/lib/python3.10/site-packages/paramiko/client.py", line 638, in _key_from_filepath
    key = klass.from_private_key_file(key_path, password)
  File "/home/a-dubs/.virtualenvs/pycloudlib-lvxe/lib/python3.10/site-packages/paramiko/pkey.py", line 421, in from_private_key_file
    key = cls(filename=filename, password=password)
  File "/home/a-dubs/.virtualenvs/pycloudlib-lvxe/lib/python3.10/site-packages/paramiko/ed25519key.py", line 65, in __init__
    signing_key = self._parse_signing_key_data(data, password)
  File "/home/a-dubs/.virtualenvs/pycloudlib-lvxe/lib/python3.10/site-packages/paramiko/ed25519key.py", line 114, in _parse_signing_key_data
    raise SSHException("Invalid key")
paramiko.ssh_exception.SSHException: Invalid key

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/a-dubs/work/pycloudlib/oracle-ipv6-automation.py", line 182, in <module>
    create_ipv6_snapshot_with_custom_cloud_init_code(
  File "/home/a-dubs/work/pycloudlib/oracle-ipv6-automation.py", line 87, in create_ipv6_snapshot_with_custom_cloud_init_code
    print(instance.execute("hostname"))
  File "/home/a-dubs/work/pycloudlib/pycloudlib/instance.py", line 276, in execute
    return self._run_command(command, stdin, **kwargs)
  File "/home/a-dubs/work/pycloudlib/pycloudlib/instance.py", line 233, in _run_command
    return self._ssh(list(command), stdin=stdin)
  File "/home/a-dubs/work/pycloudlib/pycloudlib/instance.py", line 391, in _ssh
    client = self._ssh_connect()
  File "/home/a-dubs/work/pycloudlib/pycloudlib/instance.py", line 457, in _ssh_connect
    raise SSHException from e
paramiko.ssh_exception.SSHException

This output is incredibly unhelpful and should definitely be intercepted better and a proper error message be displayed.

Adding my ssh key to the ~/.ssh/authorized_keys on the instance and then re-running my script made this issue go away.