'Execute the specified command on the server
Note that this method is reading whole command outputs to memory, thus
shouldn\'t be used for large outputs.
:param str cmd: Command to run at remote server.
:param str encoding: Encoding for result from paramiko.
Result will not be decoded if None.
:returns: data read from standard output of the command.
:raises: SSHExecCommandFailed if command returns nonzero
status. The exception contains command status stderr content.
:raises: TimeoutException if cmd doesn\'t end when timeout expires.'

def exec_command(self, cmd, encoding='utf-8'):

    ssh = self._get_ssh_connection()
    transport = ssh.get_transport()
    with transport.open_session() as channel:
        channel.fileno()
        channel.exec_command(cmd)
        channel.shutdown_write()
        if self._can_system_poll():
            out_data_chunks = []
            err_data_chunks = []
            poll = select.poll()
            poll.register(channel, select.POLLIN)
            start_time = time.time()
            while True:
                ready = poll.poll(self.channel_timeout)
                if (not any(ready)):
                    if (not self._is_timed_out(start_time)):
                        continue
                    raise exceptions.TimeoutException("Command:    '{0}'    executed    on    host    '{1}'.".format(cmd, self.host))
                if (not ready[0]):
                    continue
                out_chunk = err_chunk = None
                if channel.recv_ready():
                    out_chunk = channel.recv(self.buf_size)
                    out_data_chunks += (out_chunk,)
                if channel.recv_stderr_ready():
                    err_chunk = channel.recv_stderr(self.buf_size)
                    err_data_chunks += (err_chunk,)
                if ((not err_chunk) and (not out_chunk)):
                    break
            out_data = ''.join(out_data_chunks)
            err_data = ''.join(err_data_chunks)
        else:
            out_file = channel.makefile('rb', self.buf_size)
            err_file = channel.makefile_stderr('rb', self.buf_size)
            out_data = out_file.read()
            err_data = err_file.read()
        if encoding:
            out_data = out_data.decode(encoding)
            err_data = err_data.decode(encoding)
        exit_status = channel.recv_exit_status()
        if (0 != exit_status):
            raise exceptions.SSHExecCommandFailed(command=cmd, exit_status=exit_status, stderr=err_data, stdout=out_data)
        return out_data
