<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=Paramiko</id>
	<title>Paramiko - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=Paramiko"/>
	<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=Paramiko&amp;action=history"/>
	<updated>2026-04-05T19:22:17Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://tech.uvoo.io/index.php?title=Paramiko&amp;diff=4954&amp;oldid=prev</id>
		<title>Busk: Created page with &quot;Example  ``` # powershell commands will be encoded by default for many reasons. If you want logged turn on logging https://github.com/ansible/ansible/issues/50107#issuecomment...&quot;</title>
		<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=Paramiko&amp;diff=4954&amp;oldid=prev"/>
		<updated>2024-02-09T22:17:21Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;Example  ``` # powershell commands will be encoded by default for many reasons. If you want logged turn on logging https://github.com/ansible/ansible/issues/50107#issuecomment...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Example&lt;br /&gt;
&lt;br /&gt;
```&lt;br /&gt;
# powershell commands will be encoded by default for many reasons. If you want logged turn on logging https://github.com/ansible/ansible/issues/50107#issuecomment-448442954&lt;br /&gt;
# https://github.com/diyan/pywinrm&lt;br /&gt;
# Invoke-Expression ((New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1'))&lt;br /&gt;
&lt;br /&gt;
import logging&lt;br /&gt;
&lt;br /&gt;
import winrm&lt;br /&gt;
import paramiko&lt;br /&gt;
import socket&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
ssh_port = 22&lt;br /&gt;
winrm_port_http = 5985&lt;br /&gt;
winrm_port_https = 5986&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def get_os(host):&lt;br /&gt;
    if test_tcp_port_open(host, 5986) == 0:&lt;br /&gt;
        return &amp;quot;windows&amp;quot;&lt;br /&gt;
    elif test_tcp_port_open(host, 5985) == 0:&lt;br /&gt;
        return &amp;quot;windows&amp;quot;&lt;br /&gt;
    elif test_tcp_port_open(host, 22) == 0:&lt;br /&gt;
        return &amp;quot;linux&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        return &amp;quot;unknown&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def get_remoteshell_port(host):&lt;br /&gt;
    if test_tcp_port_open(host, 5986) == 0:&lt;br /&gt;
        return 5986, 'winrm'&lt;br /&gt;
    elif test_tcp_port_open(host, 5985) == 0:&lt;br /&gt;
        return 5985, 'winrm'&lt;br /&gt;
    elif test_tcp_port_open(host, 22) == 0:&lt;br /&gt;
        return 22, 'ssh'&lt;br /&gt;
    else:&lt;br /&gt;
        return &amp;quot;unknown&amp;quot;, 'unknown'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def test_is_valid_host_or_ipaddr(host):&lt;br /&gt;
    try:&lt;br /&gt;
        ipaddress.ip_address(host)&lt;br /&gt;
        return 0&lt;br /&gt;
    except:&lt;br /&gt;
        pass&lt;br /&gt;
    try:&lt;br /&gt;
        socket.gethostbyname(host)&lt;br /&gt;
        return 0&lt;br /&gt;
    except:&lt;br /&gt;
        print(f&amp;quot;E: {host} is not valid ip address or can't be resolved!&amp;quot;)&lt;br /&gt;
        return 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def test_tcp_port_open(host, port):&lt;br /&gt;
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
    s.settimeout(1)&lt;br /&gt;
    address = (host, port)&lt;br /&gt;
    try:&lt;br /&gt;
        # r = s.connect_ex(address)&lt;br /&gt;
        s.connect((host, int(port)))&lt;br /&gt;
        s.shutdown(socket.SHUT_RDWR)&lt;br /&gt;
        s.close()&lt;br /&gt;
        return 0&lt;br /&gt;
    # sock.settimeout(None)&lt;br /&gt;
    except:&lt;br /&gt;
        return 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RcmdClient:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Winrm and ssh wrapper class that currently uses pywinrm and paramiko&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def __init__(self, host, username, userpass, transport='ntlm', server_cert_validation='validate', rshport=None, rshproto=None):&lt;br /&gt;
        if rshport:&lt;br /&gt;
            self.rshport = rshport&lt;br /&gt;
            self.rshproto = rshproto&lt;br /&gt;
        else:&lt;br /&gt;
            self.rshport, self.shproto = get_remoteshell_port(host)&lt;br /&gt;
        if test_is_valid_host_or_ipaddr(host) != 0:&lt;br /&gt;
           print(&amp;quot;ERROR: host is not resolvable or invalid ip addr.&amp;quot;)&lt;br /&gt;
           return 1&lt;br /&gt;
&lt;br /&gt;
        if self.rshport == ssh_port:&lt;br /&gt;
            client = paramiko.SSHClient()&lt;br /&gt;
            client.load_system_host_keys()&lt;br /&gt;
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())&lt;br /&gt;
            client.connect(host, username=username, password=userpass)&lt;br /&gt;
            self.client = client&lt;br /&gt;
            self.username = username&lt;br /&gt;
            self.userpass = userpass&lt;br /&gt;
            self.host = host&lt;br /&gt;
        elif self.rshport == winrm_port_https or self.rshport == winrm_port_http:&lt;br /&gt;
            client = winrm.Session(host, auth=(username, userpass), transport=transport, server_cert_validation=server_cert_validation)&lt;br /&gt;
            self.client = client&lt;br /&gt;
            self.username = username&lt;br /&gt;
            self.userpass = userpass&lt;br /&gt;
            self.transport = transport&lt;br /&gt;
            self.server_cert_validation =  server_cert_validation&lt;br /&gt;
        else:&lt;br /&gt;
            # sys.exit('ERROR: Unsupported rsh port!')&lt;br /&gt;
            print('ERROR: Unsupported rsh port or host down!')&lt;br /&gt;
            # return 1&lt;br /&gt;
            # return None&lt;br /&gt;
        # return 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def close(self):&lt;br /&gt;
        if self.client is not None:&lt;br /&gt;
            self.client.close()&lt;br /&gt;
            self.client = None&lt;br /&gt;
&lt;br /&gt;
    def execute(self, cmd, log=True, logfile='./ssh.log'):&lt;br /&gt;
        global ssh_port&lt;br /&gt;
        global winrm_port_http&lt;br /&gt;
        global winrm_port_https&lt;br /&gt;
        if self.rshport == ssh_port:&lt;br /&gt;
            use_password = False&lt;br /&gt;
            sudo = cmd.strip().split()[0]&lt;br /&gt;
            if sudo == 'sudo' and self.user != &amp;quot;root&amp;quot;:&lt;br /&gt;
                # cmd = &amp;quot;sudo -S -p ' ' %s&amp;quot; % cmd&lt;br /&gt;
                cmd = f&amp;quot;sudo -S -p ' ' {cmd}&amp;quot;&lt;br /&gt;
                use_password = self.userpass is not None and len(self.userpass) &amp;gt; 0&lt;br /&gt;
            stdin, stdout, stderr = self.client.exec_command(cmd, get_pty=True)&lt;br /&gt;
            if use_password:&lt;br /&gt;
                stdin.write(self.userpass + &amp;quot;\n&amp;quot;)&lt;br /&gt;
                stdin.flush()&lt;br /&gt;
&lt;br /&gt;
            rsp = {&lt;br /&gt;
                'exit_status': stdout.channel.recv_exit_status(),&lt;br /&gt;
                'cmd': cmd,&lt;br /&gt;
                'out': bytes.decode(stdout.read()),&lt;br /&gt;
                'err': bytes.decode(stderr.read())&lt;br /&gt;
                }&lt;br /&gt;
            return rsp&lt;br /&gt;
        elif self.rshport == winrm_port_https or self.rshport == winrm_port_http:&lt;br /&gt;
            #logging.basicConfig(filename='/tmp/example.log', encoding='utf-8', level=logging.DEBUG)&lt;br /&gt;
            # Use &amp;quot;nohup&amp;quot; before cmds to keep shell scripts running after return.&lt;br /&gt;
            # rsp = self.client.run_ps(cmd)&lt;br /&gt;
            logging.basicConfig(handlers=[logging.FileHandler(filename=logfile,&lt;br /&gt;
                encoding='utf-8', mode='a+')],&lt;br /&gt;
                format=&amp;quot;%(asctime)s %(name)s:%(levelname)s:%(message)s&amp;quot;,&lt;br /&gt;
                datefmt=&amp;quot;%F %A %T&amp;quot;,&lt;br /&gt;
                level=logging.INFO)&lt;br /&gt;
            rsp = self.client.run_ps(cmd)&lt;br /&gt;
            exit_status = rsp.status_code&lt;br /&gt;
            out = rsp.std_out.decode()&lt;br /&gt;
            err = rsp.std_err.decode()&lt;br /&gt;
            if log:&lt;br /&gt;
                logging.info(cmd)&lt;br /&gt;
&lt;br /&gt;
            rsp = {&lt;br /&gt;
                'exit_status': exit_status,&lt;br /&gt;
                'cmd': cmd,&lt;br /&gt;
                'out': out,&lt;br /&gt;
                'err': err&lt;br /&gt;
                }&lt;br /&gt;
            return rsp&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# TRASH&lt;br /&gt;
def sshcmd_alt(host, cmd):&lt;br /&gt;
    USERNAME = config('LINUX_USERNAME')&lt;br /&gt;
    USERPASS = config('LINUX_USERPASS')&lt;br /&gt;
    TIMEOUT = 30&lt;br /&gt;
    PORT = 22&lt;br /&gt;
    ssh = Session()&lt;br /&gt;
&lt;br /&gt;
    try:&lt;br /&gt;
        ssh.connect(&lt;br /&gt;
            host=host,&lt;br /&gt;
            user=USERNAME,&lt;br /&gt;
            password=USERPASS,&lt;br /&gt;
            timeout=TIMEOUT,&lt;br /&gt;
            port=PORT,&lt;br /&gt;
        )&lt;br /&gt;
    except LibsshSessionException as ssh_exc:&lt;br /&gt;
        print(f'Failed to connect to {HOST}:{PORT} over SSH: {ssh_exc!s}')&lt;br /&gt;
&lt;br /&gt;
    print(f'{ssh.is_connected}')&lt;br /&gt;
&lt;br /&gt;
    ssh_channel = ssh.new_channel()&lt;br /&gt;
    cmd_resp = ssh_channel.write(b'ls')&lt;br /&gt;
    print(f'stdout:\n{cmd_resp.stdout}\n')&lt;br /&gt;
    print(f'stderr:\n{cmd_resp.stderr}\n')&lt;br /&gt;
    print(f'return code: {cmd_resp.returncode}\n')&lt;br /&gt;
    ssh_channel.close()&lt;br /&gt;
&lt;br /&gt;
    chan_shell = ssh.invoke_shell()&lt;br /&gt;
    # chan_shell.sendall(b'ls')&lt;br /&gt;
    chan_shell.sendall(cmd)&lt;br /&gt;
    data = chan_shell.read_bulk_response(timeout=2, retry=10)&lt;br /&gt;
    chan_shell.close()&lt;br /&gt;
    print(data)&lt;br /&gt;
&lt;br /&gt;
    ssh.close()&lt;br /&gt;
```&lt;/div&gt;</summary>
		<author><name>Busk</name></author>
	</entry>
</feed>