Python Forum
Reading text from Putty window - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Reading text from Putty window (/thread-20068.html)



Reading text from Putty window - Nil - Jul-25-2019

Hi all,

Im new to Python (3.7)

I'm Trying to automate Putty for SSH/Telnet/Serial connection
it more comfortable to do it through Putty because the connection type changes.

i want it to read the output from putty, so if it asks for "username" it will "answer" correctly.

this is my script:

from pywinauto.application import Application
from pynput.keyboard import Key, Controller

print('Configuring')

app = Application().start(cmd_line=u'"C:\\...putty.exe" ')
puttyconfigbox = app.PuTTYConfigBox
puttyconfigbox.wait('ready')
listbox = puttyconfigbox.ListBox
listbox.select(u'COM5')
button = puttyconfigbox[u'&Load']
button.click()
button2 = puttyconfigbox[u'&Open']
button2.click()

keyboard = Controller()
keyboard.press(Key.enter)

keyboard.type('batm')
keyboard.press(Key.enter)
keyboard.type('enable\nconf t\n')
how can i do it?

Thanks in advance

[Image: E1qvXTm.png]


RE: Reading text from Putty window - fishhook - Jul-26-2019

There are many ways to get ssh connection via console in Windows. Eventually you can use bash in sygwin or WSL. It seems you chose the most difficult way to automate your routine.


RE: Reading text from Putty window - Nil - Jul-26-2019

I didn't succeed in other way.. telnetlib and such didn't react with the device. anyone has an idea how to read from a terminal window?


RE: Reading text from Putty window - ndc85430 - Jul-26-2019

Have you considered using Expect for this, rather than building your own thing?


RE: Reading text from Putty window - DeaD_EyE - Jul-26-2019

I guess you want to automate tasks.

You should use Libraries, which gives you direct access to SSH.
Putty is not the solution for it. I made a little example with Paramiko.
This library works on Windows and *nix.

import sys
import getpass
from pathlib import Path
from argparse import ArgumentParser
from paramiko.client import (
    SSHClient,
    MissingHostKeyPolicy,
)
from paramiko.ssh_exception import AuthenticationException


def ask_password():
    return getpass.getpass('Please enter password: ')


def connect(
    hostname,
    username=None,
    password=None,
    port=22,
    key=False,
    **kwargs,
    ):    
    client = SSHClient()
    client.set_missing_host_key_policy(MissingHostKeyPolicy)
    if key:
        # use only private keys for login,
        # if it was explicit requested
        client.load_system_host_keys()
    client.connect(hostname, port=port, username=username, password=password)
    return client


def command_executor(client, script):
    with script.open() as fd:
        for line in fd:
            print(f'Executing command: {line.rstrip()}')
            stdin, stdout, stderr = client.exec_command(line)
            stdout, stderr = stdout.read().decode(), stderr.read().decode()
            print(stdout, end='')


def main(**kwargs):
    if not kwargs['key']:
        kwargs['password'] = ask_password()
    client = connect(**kwargs)
    command_executor(client, kwargs['script'])
    client.close()


if __name__ == '__main__':
    parser = ArgumentParser()
    parser.add_argument('hostname', help='Hostname of the host you want to connect')
    parser.add_argument('username', type=str, help='User for login')
    parser.add_argument('script', type=Path, help='Path to script file, which should executed')
    parser.add_argument('--port', type=int, default=22, help='Port of SSH service')
    parser.add_argument('--key', action='store_true', help='Use only private key for login') 
    args = parser.parse_args()
    if not args.script.exists():
        print(f'The script {args.script} does not exist')
        sys.exit(1)
    try:
        main(**vars(args))
    except AuthenticationException:
        print('Problem with authentication', file=sys.stderr)
        sys.exit(2)
Hint: Storing passwords in source code is not a good idea.
If you want to store your password, then do it in a file and
read the file in the script to get the password.

Better is, if you crate a public/private key pair and put
the public key in .ssh/authorized_hosts
You should protect the private key with a passphrase and
the passphrase can be stored in a file.


RE: Reading text from Putty window - HritikaMehta - Jul-23-2020

Can we use Paramiko for Telnet Connection also?
If not then how can we achieve this?
I tried through Telnet lib but it gives error after connection and is not able to read from the main screen in putty.

Error:
" Unable to use your terminal.Check your PROTERMCAP'file(443)Could not find terminal type
unknown"