Skip to main content

UglierPTY - A Really Ugly PyQt6-based SSH Terminal

Project description

PyQt6 SSH Terminal Widget: UglierPTY

Overview

UglierPTY is a very functional proof-of-concept (POC) application created to construct a fully functional SSH Terminal Widget using PyQt6. This POC is inspired by its sister project, UglyPTY, a full-featured SSH client that utilizes xterm.js. The aim is to offer a similar, if not superior, feature set without relying on browser technologies or JavaScript, resulting in a more streamlined and resource-efficient solution.

This is a work in progress, but feel free to give it a try! REPO: https://github.com/scottpeterman/UglierPTY

A Note About UglyPTY

If your interested in the PyQt6/XTerm.js version of this application take a look here: https://github.com/scottpeterman/UglyPTY

Features

  • Fully functional SSH terminal built with PyQt6
  • Credentials manager for easy login
  • Portable session files in YAML (Compatible with UglyPTY)
  • Terminal history and screen ratio control via pyte
  • Terminal screen render via QPaint
  • Modular design for easy embedding into other PyQt6 projects
  • Pure Python - Free of Web technology (no xterm.js)

Architecture

  • Python 3.x
  • PyQt6
  • Paramiko
  • pyte
  • SQLAlchemy
  • PyYaml

Screenshots

Here are some snapshots of Uglier in action:

screen
screen
screen

Installation

  1. Clone the repository:

    git clone https://github.com/scottpeterman/UglierPTY
    
  2. Navigate into the project directory:

    cd UglierPTY
    
  3. Install the required Python packages:

    pip install -r requirements.txt
    

Usage

The primary entry point for this POC is the uglierpty.py script. To launch the application:

If you cloned the repo

python run_test.py

If you installed via PIP

python -m uglierpty
or 
pythonw -m uglierpty

SSH Terminal Flow

<title>SSH Terminal Flow</title>

SSH Terminal Flow

+--------------------+       +-------------------+       +-------------------+       +------------+       +------------------+
| SSHTerminalWidget  |       |    SSHLib Class   |       |  Communication    |       |    pyte    |       | Remote SSH Host  |
|                    |       |                   |       |                   |       |            |       |                  |
|  keyPressEvent()   |------>|     write(data)   |------>|   sendDataToSSH() |------>|            |------>|   Shell Process  |
|                    |       |                   |       |                   |       |            |       |                  |
+--------------------+       +-------------------+       +-------------------+       +------------+       +------------------+
                ^                                       ^                          ^                           ^                     
                |                                       |                          |                           |                             
                |                                       |                          |                           |
                |                                       |                          |                           |
                |                                       |                          |                           |      
+--------------------+       +-------------------+       +-------------------+       +------------+       +------------------+
| SSHTerminalWidget  |       |    SSHLib Class   |       |  Communication    |       |    pyte    |       | Remote SSH Host  |
|                    |       |                   |       |                   |       |            |       |                  |
|    paintEvent()    |<------|      read()       |<------|  receiveDataFromSSH() |<------|   feed()   |<------|   Shell Process  |
|                    |       |                   |       |                   |       | stream.attach(screen) |       |                  |
+--------------------+       +-------------------+       +-------------------+       +------------+       +------------------+

Step-by-Step Explanation:

  1. Keystroke in SSHTerminalWidget: The keyPressEvent() function captures the keystroke and sends it to the SSHLib class via write(data).
  2. Sending to SSH Channel: The write() method sends the data through an SSH channel, probably utilizing paramiko.SSHClient. This is done in Communication.sendDataToSSH().
  3. SSH to Remote Host: The keystroke reaches the shell process running on the remote SSH host.
  4. Remote Host to pyte: Once the shell process echoes the output, it's read by Communication.receiveDataFromSSH() and fed to pyte's Stream object via feed() in SSHLib.read().
  5. pyte to GUI: The Stream object updates the Screen object, which the SSHTerminalWidget.paintEvent() method uses to draw on the GUI, completing the round trip.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

uglierpty-0.3.tar.gz (26.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

uglierpty-0.3-py3-none-any.whl (29.6 kB view details)

Uploaded Python 3

File details

Details for the file uglierpty-0.3.tar.gz.

File metadata

  • Download URL: uglierpty-0.3.tar.gz
  • Upload date:
  • Size: 26.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.13

File hashes

Hashes for uglierpty-0.3.tar.gz
Algorithm Hash digest
SHA256 2b16199c8c71cd0d8dc416164094410308eb0eeae84681632966972e9f10e441
MD5 bdb50e9b34bc62d4bf34a578496c1d65
BLAKE2b-256 cb981ac7e0381cc5e3094ada6774ad2b71f89d84d4e6c6dd8744a49018caf8c9

See more details on using hashes here.

File details

Details for the file uglierpty-0.3-py3-none-any.whl.

File metadata

  • Download URL: uglierpty-0.3-py3-none-any.whl
  • Upload date:
  • Size: 29.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.13

File hashes

Hashes for uglierpty-0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 55882db3a7bb27fd498a84795f6707e27e95e1b235b26df0b3fb947951653ae8
MD5 f0756dcfde25aec03672179dfb6c35a3
BLAKE2b-256 7c90641596a055ad4639588f956a7348e3ec158467faa01846d1a48865084999

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page