Python Forum

Full Version: Reading text from Putty window
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
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]
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.
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?
Have you considered using Expect for this, rather than building your own thing?
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.
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"