ficapy
9/14/2017 - 2:18 PM

Running commands with paramiko on remote hosts defined on ssh_config

Running commands with paramiko on remote hosts defined on ssh_config

#!/usr/bin/env python

import os
import paramiko
import argparse
import socket
import logging


def create_ssh_client(hostname):
    """Create a paramiko ssh_client object for a 'hostname' defined on
    the ~/.ssh/config file and public ssh key authentication used"""
    config = paramiko.config.SSHConfig()
    config.parse(open(os.path.expanduser('~/.ssh/config')))
    host = config.lookup(hostname)
    params = {}
    params["timeout"] = 5
    for key in host.keys():
        if key == "hostname":
            params[key] = host[key]
        elif key == "user":
            params["username"] = host[key]
        elif key == "port":
            params[key] = int(host[key])
        elif key == "identityfile":
            params["key_filename"] = host[key][0]
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.RejectPolicy())
    try:
        client.connect(**params)
    except socket.timeout:
        logging.error("Connection timed out for host '{0}'"
                      .format(hostname))
        return None
    except socket.gaierror:
        logging.exception("Connection error: if [Errno -2] the host '{0}'"
                          "is not found in ssh_config\n".format(hostname))
        return None
    except paramiko.SSHException as e:
        logging.exception("Connection error on '{0}': {1}".format(hostname, e))
        return None
    return client


if __name__ == '__main__':

    parser = argparse.ArgumentParser(
        description='This script will run a command in a remote host with \
            ssh access (login information to host must be defined in \
            ~/.ssh/config file and pubkey authentication setup)')
    parser.add_argument('host', type=str, help='remote host with ssh access')
    parser.add_argument('command', type=str, help='command to run')
    args = parser.parse_args()

    host = args.host
    command = args.command

    ssh = create_ssh_client(host)

    stdin, stdout, stderr = ssh.exec_command(command)
    err = stderr.readlines()
    out = stdout.readlines()
    if(len(err) > 0):
        for line in err:
            print(line.strip())
    else:
        for line in out:
            print(line.strip())

    ssh.close()