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:
Installation
-
Clone the repository:
git clone https://github.com/scottpeterman/UglierPTY
-
Navigate into the project directory:
cd UglierPTY
-
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:
- Keystroke in SSHTerminalWidget: The
keyPressEvent()function captures the keystroke and sends it to theSSHLibclass viawrite(data). - Sending to SSH Channel: The
write()method sends the data through an SSH channel, probably utilizingparamiko.SSHClient. This is done inCommunication.sendDataToSSH(). - SSH to Remote Host: The keystroke reaches the shell process running on the remote SSH host.
- Remote Host to pyte: Once the shell process echoes the output, it's read by
Communication.receiveDataFromSSH()and fed to pyte'sStreamobject viafeed()inSSHLib.read(). - pyte to GUI: The
Streamobject updates theScreenobject, which theSSHTerminalWidget.paintEvent()method uses to draw on the GUI, completing the round trip.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2b16199c8c71cd0d8dc416164094410308eb0eeae84681632966972e9f10e441
|
|
| MD5 |
bdb50e9b34bc62d4bf34a578496c1d65
|
|
| BLAKE2b-256 |
cb981ac7e0381cc5e3094ada6774ad2b71f89d84d4e6c6dd8744a49018caf8c9
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
55882db3a7bb27fd498a84795f6707e27e95e1b235b26df0b3fb947951653ae8
|
|
| MD5 |
f0756dcfde25aec03672179dfb6c35a3
|
|
| BLAKE2b-256 |
7c90641596a055ad4639588f956a7348e3ec158467faa01846d1a48865084999
|