| #!/usr/bin/env python |
| |
| import paramiko |
| from paramiko.ssh_exception import AuthenticationException, NoValidConnectionsError, SSHException |
| from paramiko.buffered_pipe import PipeTimeout as PipeTimeout |
| import scp |
| import socket |
| from socket import timeout as SocketTimeout |
| |
| |
| class SSHRemoteclient: |
| r""" |
| Class to create ssh connection to remote host |
| for remote host command execution and scp. |
| """ |
| |
| def __init__(self, hostname, username, password): |
| |
| r""" |
| Description of argument(s): |
| |
| hostname name/ip of the remote (targeting) host |
| username user on the remote host with access to FFCD files |
| password password for user on remote host |
| """ |
| |
| self.ssh_output = None |
| self.ssh_error = None |
| self.sshclient = None |
| self.scpclient = None |
| self.hostname = hostname |
| self.username = username |
| self.password = password |
| |
| def ssh_remoteclient_login(self): |
| |
| r""" |
| Method to create a ssh connection to remote host. |
| """ |
| |
| try: |
| # SSHClient to make connections to the remote server |
| self.sshclient = paramiko.SSHClient() |
| # setting set_missing_host_key_policy() to allow any host. |
| self.sshclient.set_missing_host_key_policy(paramiko.AutoAddPolicy()) |
| # Connect to the server |
| self.sshclient.connect(hostname=self.hostname, |
| username=self.username, |
| password=self.password) |
| |
| except AuthenticationException: |
| print("\n>>>>>\tERROR: Authentication failed, please verify your login credentials") |
| except SSHException: |
| print("\n>>>>>\tERROR: Failures in SSH2 protocol negotiation or logic errors.") |
| except NoValidConnectionsError: |
| print('\n>>>>>\tERROR: No Valid SSH Connection after multiple attempts.') |
| except socket.error: |
| print("\n>>>>>\tERROR: SSH Connection refused.") |
| except Exception: |
| raise Exception("\n>>>>>\tERROR: Unexpected Exception.") |
| |
| def ssh_remoteclient_disconnect(self): |
| |
| r""" |
| Clean up. |
| """ |
| |
| if self.sshclient: |
| self.sshclient.close() |
| |
| if self.scpclient: |
| self.scpclient.close() |
| |
| def execute_command(self, command): |
| """ |
| Execute command on the remote host. |
| |
| Description of argument(s): |
| command Command string sent to remote host |
| |
| """ |
| |
| try: |
| stdin, stdout, stderr = self.sshclient.exec_command(command) |
| stdout.channel.recv_exit_status() |
| response = stdout.readlines() |
| return response |
| except (paramiko.AuthenticationException, paramiko.SSHException, |
| paramiko.ChannelException) as ex: |
| print("\n>>>>>\tERROR: Remote command execution fails.") |
| |
| def scp_connection(self): |
| |
| r""" |
| Create a scp connection for file transfer. |
| """ |
| self.scpclient = scp.SCPClient(self.sshclient.get_transport()) |
| |
| def scp_file_from_remote(self, remote_file, local_file): |
| |
| r""" |
| scp file in remote system to local with date-prefixed filename. |
| |
| Description of argument(s): |
| remote_file Full path filename on the remote host |
| |
| local_file Full path filename on the local host |
| local filename = date-time_remote filename |
| |
| """ |
| |
| try: |
| self.scpclient.get(remote_file, local_file) |
| except scp.SCPException: |
| print("scp.SCPException scp %s from remotehost" % remote_file) |
| return False |
| except (SocketTimeout, PipeTimeout) as ex: |
| # Future enhancement: multiple retries on these exceptions due to bad ssh connection |
| print("Timeout scp %s from remotehost" % remote_file) |
| return False |
| |
| # Return True for file accounting |
| return True |