plinux


Nameplinux JSON
Version 2.1.3 PyPI version JSON
download
home_page
SummaryThe cross-platform SSH tool to execute bash commands remotely.
upload_time2023-10-31 14:02:33
maintainer
docs_urlNone
author
requires_python>=3.10
license
keywords ssh linux windows
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![PyPI version](https://badge.fury.io/py/plinux.svg)](https://badge.fury.io/py/plinux)
[![Python application](https://github.com/c-pher/plinux/actions/workflows/pythonapp.yml/badge.svg?branch=master)](https://github.com/c-pher/plinux/actions/workflows/pythonapp.yml)

# Plinux

Cross-platform tool to work with remote Linux OS.

Plinux based on paramiko project. It can establish ssh connection to a remote server, execute command as user or with sudo rights. Plinux returns object with exit code, sent command, stdout/sdtderr response.

## Installation
For most users, the recommended method to install is via pip:
```cmd
pip install plinux
```
## Import
```python
from plinux import Plinux
```
---
## Usage
#### The most recommended usage way:
```python
from plinux import Plinux

client = Plinux(host="172.16.0.124", username="bobby", password="qawsedrf")
response = client.run_cmd("hostname")
print(response.stdout)  # WebServer
print(response.ok)  # True
```
```python
from plinux import Plinux

client = Plinux()
response = client.run_cmd_local("hostname")
print(response.stdout)  # WebServer
print(response.ok)  # True
```

#### Command using sudo:
```python
from plinux import Plinux

client = Plinux(host="172.16.0.124", username="bobby", password="qawsedrf", logger_enabled=True)
response = client.run_cmd("systemctl stop myservicename.service", sudo=True)

print(response)  # SSHResponse(response=(0, None, None, "sudo -S -p '' -- sh -c 'systemctl stop myservicename.service'"))
print(response.command)  # sudo -S -p '' -- sh -c 'systemctl stop myservicename.service'
print(response.exited)  # 0
```

#### SFTP usage:
```python
from plinux import Plinux

tool = Plinux(host="ftp.test.local", username="bobby", password="qawsedrf")
sftp = tool.sftp
print(sftp.listdir())
```

#### SQLite3 usage:
```python
from plinux import Plinux

client = Plinux(host="cdn1.test.local", username="bobby", password="qawsedrf")

db_path = '/opt/ProductName/rxdb/StorageConfig.db'
sql = 'select Data from DtoDataContainer'
db = client.sqlite3(db_path, sql).json()
print(db)  # {"Settings1": 1, "Settings2": 2...,"Settings10": 10}
print(db['Setting1'])  # {"Settings1": 1}
```

#### Aliases

Some methods have "human commands" and aliases:

* client.run_cmd("cat /home/bobby/text")
* client.cat("/home/bobby/text")

Changelog
=========

.. contents::

UNRELEASED
----------

2.1.3
-----
- debug log updated
- package build config updated

2.1.2
-----
- cat_ini returns raw config

2.1.1
-----

- cat_ini: "raw" param added

2.1.0 (5.09.2023)
-----------------

- stdout and stderr will not be stripped

2.0.9 (24.3.2023)
-----------------

- run_cmd changes: timeout param renamed to the exec_timeout and fixed
- client creation params added to debug log

2.0.8.post1 (5.3.2023)
----------------------
- from now on, stdout will not return config
- cat_ini method added instead

2.0.8.post0 (1.3.2023)
----------------------
- reading empty .ini fixed

2.0.8 (28.2.2023)
----------------------
- .cat can read configs (.ini like)
- SSHResponse debug loger added

2.0.7a1 (26.12.2022)
----------------------
Breaking changes. High level methods removing

- cat
- ps
- ls
- cp
- date
- os
- netstat
- start
- stop
- status
- restart
- version
- rm
- chpasswd
- count
- stat
- md5
- ufw
- get_package_info
- get_ssl_serial
- get_ssl_fingerprint
- get_ssl_certificate
- get_ssl_md5
- validate_ssl_key
- kill_user_session
- get_user_id
- get_process_cmdline
- get_port_listeners_process_id
- get_dir_size
- get_disk_size
- get_free_space
- get_disk_usage
- change_password
- count_files
- list_dir
- create_directory
- shutdown
- reboot
- get_processes
- get_md5
- copy_file
- extract_files
- remove
- compare_files
- get_last_file
- delete_line_from_file
- change_line_in_file
- clear_file
- create_file
- get_prelogin
- get_netstat_info
- get_pid
- is_service_enabled
- disable
- enable
- list_active_services
- get_service_journal
- restart_service
- start_service
- kill_service
- stop_service
- is_service_active
- get_service
- get_time_date
- get_date
- get_package_info
- is_security_update_available
- is_package_upgradable
- get_installed_packages_versions
- get_package_version
- get_ufw_status
- get_hostname
- get_ip
- get_os_version

grep_line_in_file renamed to the "grep"

cat_file renamed to the "cat"

2.0.6 (17.11.2022)
----------------------

Methods will not raise exception from now

- reboot
- shutdown
- is_service_active
- is_enabled renamed to is_service_enabled also

get_service_status removed. Use is_service_active instead

2.0.5 (26.10.2022)
----------------------

Fixed methods:

- grep_line_in_file
- is_security_update_available

2.0.4 (26.10.2022)
----------------------

- exists() fixed

2.0.3 (06.10.2022)
----------------------

New method added:

- compare_files()

run_cmd() extended with the "ignore_errors=False" param
Added all other exceptions handler during connection
RemoteCommandExecutionError will rise directly

2.0.2 (06.10.2022)
----------------------

- get_json() removed
- cat_file() extended with pprint param
- get_dir_size() fixed

2.0.1 (06.10.2022)
----------------------

- stdout type hint extended
- get_ntp_servers() fixed to process different ways of data storing in /etc/systemd/timesyncd.conf

2.0.0 (05.10.2022)
----------------------

Breaking changes:

- response with expected exit code != 0 will be warned in log
- ResponseParser changed and renamed to the SSHResponse
- log level added
- log format changed to match another apps
- check_exists renamed to the .exists()
- get_prelogin() new method added to read MOTD
- stat_file() extended. "executable" and time of last access/birth/modification/satus
- get_directory_size refactored and renamed to get_dir_size()
- get_current_os_name() deprecated

Changed type of returned value:
str:

- get_service,
- get_service_status,
- get_service_journal,
- get_ssl_md5,
- get_ssl_certificate,

bool:

- stop_service/kill_service/start_service/restart_service,
- enable/disable,
- get_netstat_info,
- create_file,
- clear_file,
- remove,
- extract_files,
- copy_file,
- reboot,
- shutdown,
- create_directory,
- kill_user_session,

list:
- get_ntp_servers

1.3.8 (22.06.2022)
----------------------

- get_ufw_status() new method added
- change_hostname() obsolete
- get_file_permissions() changes: renamed to stat_file() and return dict now
- get_file_size() deprecated. use .stat_file()
- __sudo_cmd removed

1.3.7 (21.06.2022)
----------------------

- get_package_info(): new method added
- get_md5() returns md5 text only
- list_dir() returns list of files now
- get_free_space() returns string with free space
- get_disk_usage() returns dict with disk usage
- get_last_file() returns str with last file in directory
- cat_file() returns str with file content
- get_package_version() returns str with package version
- get_hostname() returns str with hostname
- get_os_version() returns dict with OS info
- get_ip() returns str with IP address

1.3.6 (07.06.2022)
----------------------

- get_ip_addresses_show() fixed to return info for specific interface

1.3.5 (06.06.2022)
----------------------

python-dateutil added as dependency.

New features:

- get_ntp_servers()
- get_time_date()
- to_known_type() auxiliary method to convert string to python known data type

1.3.4 (03.06.2022)
----------------------

- get_ip_addresses_show() new method added

1.3.3 (17.04.2022)
----------------------

- refactored to manage logger state

1.3.2 (4.04.2022)
----------------------

- exceptions moved to separate "exceptions" module. e.g.

.. code-block:: python

    from plinux.exceptions import PackageNotFoundError

    raise PackageNotFoundError


1.3.1 (4.04.2022)
----------------------

- logger replaced with the plogger package

1.3.0.post1 (22.03.2022)
------------------------

- code cleanup

1.2.9 (22.03.2022)
----------------------

New method added:

- .get_user_id()

1.2.8 (28.02.2022)
----------------------
- .sqlite3() extended with the timeout=1000 param

1.2.7 (22.02.2022)
----------------------
- PackageNotFoundError added

1.2.6 (18.02.2022)
----------------------
New methods added:

- .is_security_update_available()
- .get_disk_size()
- .get_directory_size()
- .get_port_listeners_process_id()
- .get_process_cmdline()

1.2.5 (07.02.2022)
----------------------
.get_json() extended to decode BOM

1.2.4 (21.01.2022)
----------------------
Created instance with local execution by default (host=127.0.0.1).
Python minimum version now is 3.9
New method added:
- get_installed_packages_versions: Get all installed packages and their versions. Returns dict.
Minor: added some methods description

1.2.3 (7.12.2021)
----------------------
New method added:
- get_ssl_fingerprint
- get_ssl_serial
- get_pid fixed to process list of pids

1.2.2 (7.12.2021)
----------------------
get_free_space fixed

- Now it executes command towards "/" and with -h param by default.
- method can accept different number of positional parameters as additional command argument ()
- Specify empty mount_point (the first param as '') to get all disk info

1.2.1 (22.11.2021)
----------------------
Added:

- get_package_version
- is_package_upgradable
- clear_file
- get_ssl_certificate
- validate_ssl_key
- get_ssl_md5

1.2.0 (14.10.2021)
----------------------
- logger added as attr for inheritance

1.1.9 (12.05.2021)
----------------------
- create_file, get_file_size, grep_line_in_file, change_line_in_file, delete_line_from_file, get_last_file, remove,
  extract_files, copy_file, get_md5, create_directory, list_dir to accept "sudo" param

1.1.8 (13.02.2021)
----------------------
- run_cmd_session method added. Can execute several commands one-by-one
- ResponseParser updated to work with run_cmd_session (NOTE: exit code always be 0 for the "run_cmd_session")

1.1.7 (21.12.2020)
----------------------
logger extended to catch destination host

1.1.6 (29.11.2020)
----------------------
sqlite3 method updated to accept external parameters like "-line -header"

1.1.5 (07.11.2020)
----------------------
sqlite3 method added

1.1.4 (06.11.2020)
----------------------
- added 'sftp' property explicitly
- 'cat', 'check_exists', 'get_json' now support sudo usage

1.1.3 (08.08.2020)
----------------------
get_pid method added

1.1.2 (25.04.2020)
----------------------
- send_cmd deprecated
- fix password prompt in stderr


1.1.1 (29.03.2020)
----------------------
get_md5 method added

1.1.0 (19.03.2020)
----------------------
ResponseParser extended with json()


1.0.9 (28.02.2020)
----------------------
Log filehandler writes in utf8 from now

1.0.8 (06.02.2020)
----------------------
get_file_permission extended:
- added faq
- added "human=False" param returns access rights in human readable form otherwise in in octal
- added alias "stat"

1.0.7 (30.01.2020)
----------------------
- ResponseParser methods notation changed.
    - stdout -> str
    - stderr -> str
    - exited -> int
    - ok -> bool
    - command -> str

1.0.6 (29.01.2020)
----------------------
- kill_user_session method added

1.0.5 (26.01.2020)
----------------------
- logging refactored to avoid multiple log entries

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "plinux",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": "",
    "keywords": "SSH,Linux,Windows",
    "author": "",
    "author_email": "Andrey Komissarov <a.komisssarov@gmail.com>",
    "download_url": "",
    "platform": null,
    "description": "[![PyPI version](https://badge.fury.io/py/plinux.svg)](https://badge.fury.io/py/plinux)\n[![Python application](https://github.com/c-pher/plinux/actions/workflows/pythonapp.yml/badge.svg?branch=master)](https://github.com/c-pher/plinux/actions/workflows/pythonapp.yml)\n\n# Plinux\n\nCross-platform tool to work with remote Linux OS.\n\nPlinux based on paramiko project. It can establish ssh connection to a remote server, execute command as user or with sudo rights. Plinux returns object with exit code, sent command, stdout/sdtderr response.\n\n## Installation\nFor most users, the recommended method to install is via pip:\n```cmd\npip install plinux\n```\n## Import\n```python\nfrom plinux import Plinux\n```\n---\n## Usage\n#### The most recommended usage way:\n```python\nfrom plinux import Plinux\n\nclient = Plinux(host=\"172.16.0.124\", username=\"bobby\", password=\"qawsedrf\")\nresponse = client.run_cmd(\"hostname\")\nprint(response.stdout)  # WebServer\nprint(response.ok)  # True\n```\n```python\nfrom plinux import Plinux\n\nclient = Plinux()\nresponse = client.run_cmd_local(\"hostname\")\nprint(response.stdout)  # WebServer\nprint(response.ok)  # True\n```\n\n#### Command using sudo:\n```python\nfrom plinux import Plinux\n\nclient = Plinux(host=\"172.16.0.124\", username=\"bobby\", password=\"qawsedrf\", logger_enabled=True)\nresponse = client.run_cmd(\"systemctl stop myservicename.service\", sudo=True)\n\nprint(response)  # SSHResponse(response=(0, None, None, \"sudo -S -p '' -- sh -c 'systemctl stop myservicename.service'\"))\nprint(response.command)  # sudo -S -p '' -- sh -c 'systemctl stop myservicename.service'\nprint(response.exited)  # 0\n```\n\n#### SFTP usage:\n```python\nfrom plinux import Plinux\n\ntool = Plinux(host=\"ftp.test.local\", username=\"bobby\", password=\"qawsedrf\")\nsftp = tool.sftp\nprint(sftp.listdir())\n```\n\n#### SQLite3 usage:\n```python\nfrom plinux import Plinux\n\nclient = Plinux(host=\"cdn1.test.local\", username=\"bobby\", password=\"qawsedrf\")\n\ndb_path = '/opt/ProductName/rxdb/StorageConfig.db'\nsql = 'select Data from DtoDataContainer'\ndb = client.sqlite3(db_path, sql).json()\nprint(db)  # {\"Settings1\": 1, \"Settings2\": 2...,\"Settings10\": 10}\nprint(db['Setting1'])  # {\"Settings1\": 1}\n```\n\n#### Aliases\n\nSome methods have \"human commands\" and aliases:\n\n* client.run_cmd(\"cat /home/bobby/text\")\n* client.cat(\"/home/bobby/text\")\n\nChangelog\n=========\n\n.. contents::\n\nUNRELEASED\n----------\n\n2.1.3\n-----\n- debug log updated\n- package build config updated\n\n2.1.2\n-----\n- cat_ini returns raw config\n\n2.1.1\n-----\n\n- cat_ini: \"raw\" param added\n\n2.1.0 (5.09.2023)\n-----------------\n\n- stdout and stderr will not be stripped\n\n2.0.9 (24.3.2023)\n-----------------\n\n- run_cmd changes: timeout param renamed to the exec_timeout and fixed\n- client creation params added to debug log\n\n2.0.8.post1 (5.3.2023)\n----------------------\n- from now on, stdout will not return config\n- cat_ini method added instead\n\n2.0.8.post0 (1.3.2023)\n----------------------\n- reading empty .ini fixed\n\n2.0.8 (28.2.2023)\n----------------------\n- .cat can read configs (.ini like)\n- SSHResponse debug loger added\n\n2.0.7a1 (26.12.2022)\n----------------------\nBreaking changes. High level methods removing\n\n- cat\n- ps\n- ls\n- cp\n- date\n- os\n- netstat\n- start\n- stop\n- status\n- restart\n- version\n- rm\n- chpasswd\n- count\n- stat\n- md5\n- ufw\n- get_package_info\n- get_ssl_serial\n- get_ssl_fingerprint\n- get_ssl_certificate\n- get_ssl_md5\n- validate_ssl_key\n- kill_user_session\n- get_user_id\n- get_process_cmdline\n- get_port_listeners_process_id\n- get_dir_size\n- get_disk_size\n- get_free_space\n- get_disk_usage\n- change_password\n- count_files\n- list_dir\n- create_directory\n- shutdown\n- reboot\n- get_processes\n- get_md5\n- copy_file\n- extract_files\n- remove\n- compare_files\n- get_last_file\n- delete_line_from_file\n- change_line_in_file\n- clear_file\n- create_file\n- get_prelogin\n- get_netstat_info\n- get_pid\n- is_service_enabled\n- disable\n- enable\n- list_active_services\n- get_service_journal\n- restart_service\n- start_service\n- kill_service\n- stop_service\n- is_service_active\n- get_service\n- get_time_date\n- get_date\n- get_package_info\n- is_security_update_available\n- is_package_upgradable\n- get_installed_packages_versions\n- get_package_version\n- get_ufw_status\n- get_hostname\n- get_ip\n- get_os_version\n\ngrep_line_in_file renamed to the \"grep\"\n\ncat_file renamed to the \"cat\"\n\n2.0.6 (17.11.2022)\n----------------------\n\nMethods will not raise exception from now\n\n- reboot\n- shutdown\n- is_service_active\n- is_enabled renamed to is_service_enabled also\n\nget_service_status removed. Use is_service_active instead\n\n2.0.5 (26.10.2022)\n----------------------\n\nFixed methods:\n\n- grep_line_in_file\n- is_security_update_available\n\n2.0.4 (26.10.2022)\n----------------------\n\n- exists() fixed\n\n2.0.3 (06.10.2022)\n----------------------\n\nNew method added:\n\n- compare_files()\n\nrun_cmd() extended with the \"ignore_errors=False\" param\nAdded all other exceptions handler during connection\nRemoteCommandExecutionError will rise directly\n\n2.0.2 (06.10.2022)\n----------------------\n\n- get_json() removed\n- cat_file() extended with pprint param\n- get_dir_size() fixed\n\n2.0.1 (06.10.2022)\n----------------------\n\n- stdout type hint extended\n- get_ntp_servers() fixed to process different ways of data storing in /etc/systemd/timesyncd.conf\n\n2.0.0 (05.10.2022)\n----------------------\n\nBreaking changes:\n\n- response with expected exit code != 0 will be warned in log\n- ResponseParser changed and renamed to the SSHResponse\n- log level added\n- log format changed to match another apps\n- check_exists renamed to the .exists()\n- get_prelogin() new method added to read MOTD\n- stat_file() extended. \"executable\" and time of last access/birth/modification/satus\n- get_directory_size refactored and renamed to get_dir_size()\n- get_current_os_name() deprecated\n\nChanged type of returned value:\nstr:\n\n- get_service,\n- get_service_status,\n- get_service_journal,\n- get_ssl_md5,\n- get_ssl_certificate,\n\nbool:\n\n- stop_service/kill_service/start_service/restart_service,\n- enable/disable,\n- get_netstat_info,\n- create_file,\n- clear_file,\n- remove,\n- extract_files,\n- copy_file,\n- reboot,\n- shutdown,\n- create_directory,\n- kill_user_session,\n\nlist:\n- get_ntp_servers\n\n1.3.8 (22.06.2022)\n----------------------\n\n- get_ufw_status() new method added\n- change_hostname() obsolete\n- get_file_permissions() changes: renamed to stat_file() and return dict now\n- get_file_size() deprecated. use .stat_file()\n- __sudo_cmd removed\n\n1.3.7 (21.06.2022)\n----------------------\n\n- get_package_info(): new method added\n- get_md5() returns md5 text only\n- list_dir() returns list of files now\n- get_free_space() returns string with free space\n- get_disk_usage() returns dict with disk usage\n- get_last_file() returns str with last file in directory\n- cat_file() returns str with file content\n- get_package_version() returns str with package version\n- get_hostname() returns str with hostname\n- get_os_version() returns dict with OS info\n- get_ip() returns str with IP address\n\n1.3.6 (07.06.2022)\n----------------------\n\n- get_ip_addresses_show() fixed to return info for specific interface\n\n1.3.5 (06.06.2022)\n----------------------\n\npython-dateutil added as dependency.\n\nNew features:\n\n- get_ntp_servers()\n- get_time_date()\n- to_known_type() auxiliary method to convert string to python known data type\n\n1.3.4 (03.06.2022)\n----------------------\n\n- get_ip_addresses_show() new method added\n\n1.3.3 (17.04.2022)\n----------------------\n\n- refactored to manage logger state\n\n1.3.2 (4.04.2022)\n----------------------\n\n- exceptions moved to separate \"exceptions\" module. e.g.\n\n.. code-block:: python\n\n    from plinux.exceptions import PackageNotFoundError\n\n    raise PackageNotFoundError\n\n\n1.3.1 (4.04.2022)\n----------------------\n\n- logger replaced with the plogger package\n\n1.3.0.post1 (22.03.2022)\n------------------------\n\n- code cleanup\n\n1.2.9 (22.03.2022)\n----------------------\n\nNew method added:\n\n- .get_user_id()\n\n1.2.8 (28.02.2022)\n----------------------\n- .sqlite3() extended with the timeout=1000 param\n\n1.2.7 (22.02.2022)\n----------------------\n- PackageNotFoundError added\n\n1.2.6 (18.02.2022)\n----------------------\nNew methods added:\n\n- .is_security_update_available()\n- .get_disk_size()\n- .get_directory_size()\n- .get_port_listeners_process_id()\n- .get_process_cmdline()\n\n1.2.5 (07.02.2022)\n----------------------\n.get_json() extended to decode BOM\n\n1.2.4 (21.01.2022)\n----------------------\nCreated instance with local execution by default (host=127.0.0.1).\nPython minimum version now is 3.9\nNew method added:\n- get_installed_packages_versions: Get all installed packages and their versions. Returns dict.\nMinor: added some methods description\n\n1.2.3 (7.12.2021)\n----------------------\nNew method added:\n- get_ssl_fingerprint\n- get_ssl_serial\n- get_pid fixed to process list of pids\n\n1.2.2 (7.12.2021)\n----------------------\nget_free_space fixed\n\n- Now it executes command towards \"/\" and with -h param by default.\n- method can accept different number of positional parameters as additional command argument ()\n- Specify empty mount_point (the first param as '') to get all disk info\n\n1.2.1 (22.11.2021)\n----------------------\nAdded:\n\n- get_package_version\n- is_package_upgradable\n- clear_file\n- get_ssl_certificate\n- validate_ssl_key\n- get_ssl_md5\n\n1.2.0 (14.10.2021)\n----------------------\n- logger added as attr for inheritance\n\n1.1.9 (12.05.2021)\n----------------------\n- create_file, get_file_size, grep_line_in_file, change_line_in_file, delete_line_from_file, get_last_file, remove,\n  extract_files, copy_file, get_md5, create_directory, list_dir to accept \"sudo\" param\n\n1.1.8 (13.02.2021)\n----------------------\n- run_cmd_session method added. Can execute several commands one-by-one\n- ResponseParser updated to work with run_cmd_session (NOTE: exit code always be 0 for the \"run_cmd_session\")\n\n1.1.7 (21.12.2020)\n----------------------\nlogger extended to catch destination host\n\n1.1.6 (29.11.2020)\n----------------------\nsqlite3 method updated to accept external parameters like \"-line -header\"\n\n1.1.5 (07.11.2020)\n----------------------\nsqlite3 method added\n\n1.1.4 (06.11.2020)\n----------------------\n- added 'sftp' property explicitly\n- 'cat', 'check_exists', 'get_json' now support sudo usage\n\n1.1.3 (08.08.2020)\n----------------------\nget_pid method added\n\n1.1.2 (25.04.2020)\n----------------------\n- send_cmd deprecated\n- fix password prompt in stderr\n\n\n1.1.1 (29.03.2020)\n----------------------\nget_md5 method added\n\n1.1.0 (19.03.2020)\n----------------------\nResponseParser extended with json()\n\n\n1.0.9 (28.02.2020)\n----------------------\nLog filehandler writes in utf8 from now\n\n1.0.8 (06.02.2020)\n----------------------\nget_file_permission extended:\n- added faq\n- added \"human=False\" param returns access rights in human readable form otherwise in in octal\n- added alias \"stat\"\n\n1.0.7 (30.01.2020)\n----------------------\n- ResponseParser methods notation changed.\n    - stdout -> str\n    - stderr -> str\n    - exited -> int\n    - ok -> bool\n    - command -> str\n\n1.0.6 (29.01.2020)\n----------------------\n- kill_user_session method added\n\n1.0.5 (26.01.2020)\n----------------------\n- logging refactored to avoid multiple log entries\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "The cross-platform SSH tool to execute bash commands remotely.",
    "version": "2.1.3",
    "project_urls": {
        "Homepage": "https://github.com/c-pher/plinux"
    },
    "split_keywords": [
        "ssh",
        "linux",
        "windows"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ac8084f274793c2f589c9684c902aaeca041a95018936f07fd64f676f30bab9b",
                "md5": "3b94645f2fa883dce44a87d3eb3f73bd",
                "sha256": "d2cf488096997d068a4b666943c18ff0d668b82993036fdc0bb144d1fcdb582b"
            },
            "downloads": -1,
            "filename": "plinux-2.1.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "3b94645f2fa883dce44a87d3eb3f73bd",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 24634,
            "upload_time": "2023-10-31T14:02:33",
            "upload_time_iso_8601": "2023-10-31T14:02:33.153751Z",
            "url": "https://files.pythonhosted.org/packages/ac/80/84f274793c2f589c9684c902aaeca041a95018936f07fd64f676f30bab9b/plinux-2.1.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-10-31 14:02:33",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "c-pher",
    "github_project": "plinux",
    "github_not_found": true,
    "lcname": "plinux"
}
        
Elapsed time: 1.48957s