# Buggy code
def join_shells(self, shells, timeout=None):
    """Wait for running commands to complete and close shells.

    :param shells: Shells to join on.
    :type shells: list(:py:class:`pssh.clients.base.single.InteractiveShell`)
    :param timeout: Seconds before waiting for shell commands to finish times out.
      Defaults to self.timeout if not provided.
    :type timeout: float

    :raises: :py:class:`pssh.exceptions.Timeout` on timeout requested and
      reached with commands still running.
    """
    _timeout = self.timeout if timeout is None else timeout
    cmds = [self.pool.spawn(shell.close) for shell in shells]
    finished = joinall(cmds, timeout=_timeout)
    if _timeout is None:
        return
    finished_shells = [g.get() for g in finished]
    unfinished_shells = list(set(shells).difference(set(finished_shells)))
    if len(unfinished_shells) > 0:
        raise Timeout(
            "Timeout of %s sec(s) reached with commands still running",
            timeout,
            finished_shells,
            unfinished_shells,
        )


# Traceback (pssh.exceptions.AuthenticationException)
(coba2) debian@debian-mon:~/coba2$ ssh root@10.90.200.55 -p 3322
Last login: Fri Sep 18 10:23:25 2020 from 10.90.200.57
[root@candibinangun ~]# exit
logout
Connection to 10.90.200.55 closed.

(coba2) debian@debian-mon:~/coba2$ python
Python 3.8.5 (default, Aug 28 2020, 06:44:01)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
from pssh.clients import SSHClient
sshObj=SSHClient('10.90.200.55', user='root', port=3322, num_retries=3, retry_delay=5, timeout=5)
Traceback (most recent call last):
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/base/single.py", line 93, in _auth_retry
self.auth()
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/native/single.py", line 179, in auth
self._identity_auth()
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/base/single.py", line 183, in _identity_auth
raise AuthenticationException("No authentication methods succeeded")
pssh.exceptions.AuthenticationException: No authentication methods succeeded

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/base/single.py", line 93, in _auth_retry
self.auth()
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/native/single.py", line 179, in auth
self._identity_auth()
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/base/single.py", line 183, in _identity_auth
raise AuthenticationException("No authentication methods succeeded")
pssh.exceptions.AuthenticationException: No authentication methods succeeded

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/base/single.py", line 93, in _auth_retry
self.auth()
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/native/single.py", line 179, in auth
self._identity_auth()
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/base/single.py", line 183, in _identity_auth
raise AuthenticationException("No authentication methods succeeded")
pssh.exceptions.AuthenticationException: No authentication methods succeeded

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/native/single.py", line 103, in __init__
super(SSHClient, self).__init__(
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/base/single.py", line 80, in __init__
self._init()
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/base/single.py", line 85, in _init
self._auth_retry()
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/base/single.py", line 97, in _auth_retry
return self._auth_retry(retries=retries+1)
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/base/single.py", line 97, in _auth_retry
return self._auth_retry(retries=retries+1)
File "/home/debian/.local/share/virtualenvs/coba2-gQE_YhKQ/lib/python3.8/site-packages/pssh/clients/base/single.py", line 99, in _auth_retry
raise AuthenticationException(msg, self.host, self.port, ex)
pssh.exceptions.AuthenticationException: ('Authentication error while connecting to %s:%s - %s', '10.90.200.55', 3322, AuthenticationException('No authentication methods succeeded'))

# Fixed code
def join_shells(self, shells, timeout=None):
    """Wait for running commands to complete and close shells.

    :param shells: Shells to join on.
    :type shells: list(:py:class:`pssh.clients.base.single.InteractiveShell`)
    :param timeout: Seconds before waiting for shell commands to finish times out.
      Defaults to self.timeout if not provided.
    :type timeout: float

    :raises: :py:class:`pssh.exceptions.Timeout` on timeout requested and
      reached with commands still running.
    """
    _timeout = self.timeout if timeout is None else timeout
    cmds = [self.pool.spawn(shell.close) for shell in shells]
    finished = joinall(cmds, timeout=_timeout)
    if _timeout is None:
        return
    finished_shells = [g.get() for g in finished]
    unfinished_shells = list(set(shells).difference(set(finished_shells)))
    if len(unfinished_shells) > 0:
        raise Timeout(
            "Timeout of %s sec(s) reached with commands still running",
            timeout,
            finished_shells,
            unfinished_shells,
        )