{ "info": { "author": "Carl Montanari", "author_email": "carl.r.montanari@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8" ], "description": "![](https://github.com/carlmontanari/ssh2net/workflows/build/badge.svg)\n[![PyPI version](https://badge.fury.io/py/ssh2net.svg)](https://badge.fury.io/py/ssh2net)\n[![Python 3.6](https://img.shields.io/badge/python-3.6-blue.svg)](https://www.python.org/downloads/release/python-360/)\n[![Python 3.7](https://img.shields.io/badge/python-3.7-blue.svg)](https://www.python.org/downloads/release/python-370/)\n[![Python 3.8](https://img.shields.io/badge/python-3.8-blue.svg)](https://www.python.org/downloads/release/python-380/)\n[![Code Style](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)\n\nssh2net\n=======\n\nLibrary focusing on connecting to and communicating with network devices via SSH. Built on [ssh2-python](https://github.com/ParallelSSH/ssh2-python) which provides bindings to libssh2.\n\nssh2net is focused on being lightweight and pluggable so that it *should* be flexible enough to be adapted to handle connecting to, sending commands, and reading output from most network devices.\n\n\n# Documentation\n\nDocumentation is auto-generated [using pdoc3](https://github.com/pdoc3/pdoc). Documentation is linted (see Linting and Testing section) via [pydocstyle](https://github.com/PyCQA/pydocstyle/) and [darglint](https://github.com/terrencepreilly/darglint).\n\nDocumentation is hosted via GitHub Pages and can be found [here.](https://carlmontanari.github.io/ssh2net/docs/ssh2net/index.html) You can also view the readme as a web page [here.](https://carlmontanari.github.io/ssh2net/)\n\nTo regenerate documentation locally, use the following make command:\n\n```\nmake docs\n```\n\n\n# Platforms\n\nIn theory ssh2net should be able to connect to lots of different network devices. At the moment the following devices are included in the \"functional\" tests and should be pretty reliable:\n\n- Cisco IOS-XE (tested on: 16.04.01)\n- Cisco NX-OS (tested on: 9.2.4)\n- Juniper JunOS (tested on: 17.3R2.10)\n- Cisco IOS-XR (tested on: 6.5.3)\n\nI would like to add functional tests for:\n\n- Arista EOS (currently blocked - at least for password based auth via keyboard_interactive)\n\nAny additional platforms would likely not be included in the \"core\" platform (and therefore functional testing). Additional platforms could be considered, however a pre-requisite for additional platforms would be the capability to create vrnetlab containers for that platform.\n\nAs for platforms to *run* ssh2net on -- it has and will be tested on MacOS and Ubuntu regularly and should work on any POSIX system. It has had minimal testing on Windows, however I have no plans on supporting Windows as I don't have access or desire to do so. In general I believe everything other than the TextFSM support should work though!\n\n\n## Platform Drivers\n\nSSH2Net supports \"core\" and \"community\" platform drivers. This is similar to a \"device_type\" in Netmiko, for example. The intent of a \"driver\" is to handle device specific operations, to include privilege escalation and deescalation. The \"core\" drivers will support Cisco IOS-XE, NX-OS and IOS-XR, Juniper JunOS, and hopefully/eventually Arista EOS. Community drivers can be merged in for other platforms but will not be tested or supported officially.\n\nExample IOS-XE driver setup:\n\n```\nfrom ssh2net import SSH2Net\nfrom ssh2net.core.cisco_iosxe.driver import IOSXEDriver\n\nmy_device = {\"setup_host\": \"1.2.3.4\", \"auth_user\": \"person\", \"auth_password\": \"password\"}\nwith SSH2Net(**my_device) as conn:\n driver = IOSXEDriver(conn)\n```\n\nOnce the driver is setup, \"netmiko-like\" operations are supported:\n\n```\n version = driver.send_command(\"show version\")\n print(version[0])\n results = driver.send_config_set(\"[\"interface loopback123\", \"description ssh2net was here\"])\n print(results)\n```\n\nThe major caveat here is that SSH2Net returns a LIST of results (hence the \"version[0]\" above) as all operations support passing lists of commands.\n\n\n## Platform Regex\n\nThe `comms_prompt_regex` is perhaps the most important argument to getting SSH2Net working.\n\nThe \"base\" pattern is:\n\n`\"^[a-z0-9.\\-@()/:]{1,20}[#>$]$\"`\n\nThis pattern works for (tested on show commands only, but should work on config commands for at least IOS-XE, and NX-OS) IOS-XE, NX-OS, JunOS, and IOS-XR.\n\nIf you do not wish to match cisco \"config\" level prompts you can use:\n\n`\"^[a-z0-9.-@]{1,20}[#>$]$\"`\n\nIf you use a platform driver, the base prompt is set in the driver so you don't really need to worry about this!\n\n\n# Installation\n\n\nYou should be able to pip install it \"normally\":\n\n```\npip install ssh2net\n```\n\nTo install from this repositories master branch:\n\n```\npip install git+https://github.com/carlmontanari/ssh2net\n```\n\nTo install from source:\n\n```\ngit clone https://github.com/carlmontanari/ssh2net\ncd ssh2net\npython setup.py install\n```\n\n# Examples\n\n- [Basic \"native\" SSH2Net operations](/examples/basic_usage/basic_usage_ssh2net_native_style.py)\n- [Basic \"driver\" SSH2Net operations](/examples/basic_usage/basic_usage_ssh2net_driver_style.py)\n- [Basic \"ConnectHandler\" (i.e. Netmiko) SSH2Net operations](/examples/basic_usage/basic_usage_ssh2net_connecthandler_style.py)\n- [Setting session and channel logging](/examples/logging/session_and_channel_log_diff_files.py)\n- [Using SSH Key for authentication](/examples/ssh_keys/ssh_key_basic.py)\n\n\n# FAQ\n\n- Question: Why build this? Netmiko exists, Paramiko exists, Ansible exists, etc...?\n - Answer: To learn and build hopefully a really cool thing!\n- Question: Is this better than Netmiko/Paramiko/Ansible?\n - Answer: Nope! It is different though! The main focus is just to be stupid fast. It is very much that. It *should* be super reliable too as the timeouts are very easy/obvious to control, but that said it for sure has not been tested thoroughly with latent devices.\n- Question: Is this easy to use?\n - Answer: Yep! The \"native\" usage is pretty straight forward -- the thing to remember is that it doesn't do \"things\" for you like Netmiko does for example, so its a lot more like Paramiko in that regard. That said you can use one of the available drivers to have a more Netmiko-like experience -OR- write your own driver as this has been built with the thought of being easily extended.\n- Other questions? Ask away!\n\n\n# Linting and Testing\n\n## Linting\n\nThis project uses [black](https://github.com/psf/black) for auto-formatting. In addition to black, tox will execute [pylama](https://github.com/klen/pylama), and [pydocstyle](https://github.com/PyCQA/pydocstyle) for linting purposes. I have began playing with adding type hinting and testing this with [mypy](https://github.com/python/mypy), however I've not added this to tox at this point. I've also added docstring linting with [darglint](https://github.com/terrencepreilly/darglint) which has been quite handy!\n\nAll commits to this repository will trigger a GitHub action which runs tox, but of course its nicer to just run that before making a commit to ensure that it will pass all tests!\n\n\n## Testing\n\nI broke testing into two main categories -- unit and functional. Unit is what you would expect -- unit testing the code. Functional testing connects to virtual devices in order to more accurately test the code.\n\n### Unit Tests\n\nUnit tests can be executed via pytest or using the following make command:\n\n```\nmake test_unit\n```\n\nThis will also print out a coverage report as well as create an html coverage report. The long term goal would be >=75% coverage with unit tests, and more if possible of course! Right now that number is more like >=50%.\n\n### Setting up Functional Test Environment\n\n\nExecuting the functional tests is a bit more complicated! First, thank you to Kristian Larsson for his great tool [vrnetlab](https://github.com/plajjan/vrnetlab)! All functional tests are built on this awesome platform that allows for easy creation of containerized network devices.\n\nBasic functional tests exist for all \"core\" platform types (IOSXE, NXOS, IOSXR, EOS, Junos). Vrnetlab currently only supports the older emulation style NX-OS devices, and *not* the newer VM image n9kv. I have made some very minor tweaks to vrnetlab locally in order to get the n9kv image running -- I have raised a PR to add this to vrnetlab proper. Minus the n9kv tweaks, getting going with vrnetlab is fairly straightforward -- simply follow Kristian's great readme docs. For the Arista EOS image -- prior to creating the container you should boot the device and enter the `zerotouch disable` command. This allows for the config to actually be saved and prevents the interfaces from cycling through interface types in the container (I'm not clear why it does that but executing this command before building the container \"fixes\" this!). After creating the image(s) that you wish to test, rename the image to the following format:\n\n```\nssh2net[PLATFORM]\n```\n\nThe docker-compose file here will be looking for the container images matching this pattern, so this is an important bit! The container image names should be:\n\n```\nssh2netiosxe\nssh2netnxos\nssh2netiosxr\nssh2netjunos\n```\n\nYou can tag the image names on creation (following the vrnetlab readme docs), or create a new tag once the image is built:\n\n```\ndocker tag [TAG OF IMAGE CREATED] ssh2netnxos\n```\n\nOnce you have created the images, you can start the containers with a make command:\n\n```\nmake start_dev_env\n```\n\nConversely you can terminate the containers:\n\n```\nmake stop_dev_env\n```\n\nTo start a specific platform container:\n\n```\nmake start_dev_env_iosxe\n```\n\nSubstitute \"iosxe\" for the platform type you want to start.\n\nMost of the containers don't take too long to fire up, maybe a few minutes (running on my old macmini with Ubuntu, so not exactly a powerhouse!). That said, the IOS-XR device takes about 15 minutes to go to \"healthy\" status. Once booted up you can connect to their console or via SSH:\n\n| Device | Local IP |\n| --------------|---------------|\n| iosxe | 172.18.0.11 |\n| nxos | 172.18.0.12 |\n| iosxr | 172.18.0.13 |\n| eos (future)| 172.18.0.14 |\n| junos | 172.18.0.15 |\n\nThe console port for all devices is 5000, so to connect to the console of the iosxe device you can simply telnet to that port locally:\n\n```\ntelnet 172.18.0.11 5000\n```\n\nCredentials for all devices use the default vrnetlab credentials:\n\nUsername: vrnetlab\n\nPassword: VR-netlab9\n\nOnce the container(s) are ready, you can use the make commands to execute tests as needed:\n\n- `test_functional` will execute all currently implemented functional tests\n- `test_all` will execute all currently implemented functional tests as well as the unit tests\n- `test_iosxe` will execute all unit tests and iosxe functional tests\n- `test_nxos` will execute all unit tests and nxos functional tests\n- `test_iosxr` will execute all unit tests and iosxr functional tests\n- `test_junos` will execute all unit tests and junos functional tests\n\n**Note** - the functional tests test the \"native\" SSH2Net functionality, but as of now do *not* test the \"driver\" functionality (i.e. it does not test anything in ssh2net/core/). \n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/carlmontanari/ssh2net", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "ssh2net", "package_url": "https://pypi.org/project/ssh2net/", "platform": "", "project_url": "https://pypi.org/project/ssh2net/", "project_urls": { "Homepage": "https://github.com/carlmontanari/ssh2net" }, "release_url": "https://pypi.org/project/ssh2net/2020.1.10/", "requires_dist": [ "ssh2-python (>=0.18.0-1)", "paramiko (>=2.6.0) ; extra == 'paramiko'", "textfsm (>=1.1.0) ; extra == 'textfsm'", "ntc-templates (>=1.1.0) ; extra == 'textfsm'" ], "requires_python": ">=3.6", "summary": "SSH client for network devices built on ssh2-python", "version": "2020.1.10", "yanked": false, "yanked_reason": null }, "last_serial": 6434617, "releases": { "2019.10.12": [ { "comment_text": "", "digests": { "md5": "4e21e040d2415d2497726a5938accfd3", "sha256": "425deac78c1109f93b0206228d615893fe4b8b81ee8cb352eeef35e31832c597" }, "downloads": -1, "filename": "ssh2net-2019.10.12-py3-none-any.whl", "has_sig": false, "md5_digest": "4e21e040d2415d2497726a5938accfd3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 35313, "upload_time": "2019-10-12T22:32:13", "upload_time_iso_8601": "2019-10-12T22:32:13.805222Z", "url": "https://files.pythonhosted.org/packages/c8/5c/9c60688348a130c2dedfbc940197ef042f11515568696ef90b16727ed61d/ssh2net-2019.10.12-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "354d263447b665b712566f9424e36c58", "sha256": "e2e34fb70a64cd03f5827d93fc0a62452d42ebf8accebf79899ebf1de1572273" }, "downloads": -1, "filename": "ssh2net-2019.10.12.tar.gz", "has_sig": false, "md5_digest": "354d263447b665b712566f9424e36c58", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 29853, "upload_time": "2019-10-12T22:32:15", "upload_time_iso_8601": "2019-10-12T22:32:15.652411Z", "url": "https://files.pythonhosted.org/packages/95/b5/ba2312343bb52e7463df373e8cfdda8bcf4a7e9365eb5a18ec41beb759db/ssh2net-2019.10.12.tar.gz", "yanked": false, "yanked_reason": null } ], "2019.10.27": [ { "comment_text": "", "digests": { "md5": "7c6db90e0a33342fc5f8998066d985cd", "sha256": "7718e44791cb61bc36f09b49042d4963e1af3abe08bdf2c7624005190683d168" }, "downloads": -1, "filename": "ssh2net-2019.10.27-py3-none-any.whl", "has_sig": false, "md5_digest": "7c6db90e0a33342fc5f8998066d985cd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 44995, "upload_time": "2019-10-27T19:11:09", "upload_time_iso_8601": "2019-10-27T19:11:09.259200Z", "url": "https://files.pythonhosted.org/packages/e6/3f/c97f49e089a83c47408db8934711a040e628f152357c198c4b0428153c84/ssh2net-2019.10.27-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1519cabcefdc5f51ddd360f70c9312f4", "sha256": "394e5bb944f09284fa6c6febd218a9adbb404200daa7b2b8c9352321e083cc33" }, "downloads": -1, "filename": "ssh2net-2019.10.27.tar.gz", "has_sig": false, "md5_digest": "1519cabcefdc5f51ddd360f70c9312f4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 34748, "upload_time": "2019-10-27T19:11:10", "upload_time_iso_8601": "2019-10-27T19:11:10.960319Z", "url": "https://files.pythonhosted.org/packages/07/95/0d5f9f0ae9d2a326a58c8634c8f655c4a61a48b58156d4d9be7cf2dc4b77/ssh2net-2019.10.27.tar.gz", "yanked": false, "yanked_reason": null } ], "2019.10.7": [ { "comment_text": "", "digests": { "md5": "c121178af4af24b9b2c5e9390e18ac59", "sha256": "7fadc32170a0347c016986393cf8dd2df006e0879ce283d56da1ee488e414a6c" }, "downloads": -1, "filename": "ssh2net-2019.10.7-py3-none-any.whl", "has_sig": false, "md5_digest": "c121178af4af24b9b2c5e9390e18ac59", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 33890, "upload_time": "2019-10-08T02:13:07", "upload_time_iso_8601": "2019-10-08T02:13:07.794584Z", "url": "https://files.pythonhosted.org/packages/74/fe/fca0d85b1b0cbacae209704d0e57465a663b645f95d14648e9c2e7e7c58f/ssh2net-2019.10.7-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b492551322d023a10ed9adc78d6055d8", "sha256": "053fb8bc64b011c29e91b838a06ddfc71de02ad0435246c61a2949077012a3d6" }, "downloads": -1, "filename": "ssh2net-2019.10.7.tar.gz", "has_sig": false, "md5_digest": "b492551322d023a10ed9adc78d6055d8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 28515, "upload_time": "2019-10-08T02:13:09", "upload_time_iso_8601": "2019-10-08T02:13:09.574884Z", "url": "https://files.pythonhosted.org/packages/87/11/93b61cb42082749ac766705a5c5b27491d17be4caed7da1ba3873f5c8326/ssh2net-2019.10.7.tar.gz", "yanked": false, "yanked_reason": null } ], "2019.9.10": [ { "comment_text": "", "digests": { "md5": "91904b1c7c110ed8272d8ab0c1946bcb", "sha256": "52cca460a6293f73e91b98f6522cbaf635db02b23293dbf57e565cfdfd916778" }, "downloads": -1, "filename": "ssh2net-2019.9.10-py3-none-any.whl", "has_sig": false, "md5_digest": "91904b1c7c110ed8272d8ab0c1946bcb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 22214, "upload_time": "2019-09-10T23:56:03", "upload_time_iso_8601": "2019-09-10T23:56:03.597974Z", "url": "https://files.pythonhosted.org/packages/cb/c6/38a1a15253b582037fa08f2a1b14958589fa07380a8bb8f4325222b97e2f/ssh2net-2019.9.10-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "37184f3e275960b0efb417f1c6388d56", "sha256": "eee2bc2db2220f2089fa07f0dce0f9c1ec008a4ab9f39dddcc40456d2f175c6d" }, "downloads": -1, "filename": "ssh2net-2019.9.10.tar.gz", "has_sig": false, "md5_digest": "37184f3e275960b0efb417f1c6388d56", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 20817, "upload_time": "2019-09-10T23:56:04", "upload_time_iso_8601": "2019-09-10T23:56:04.725792Z", "url": "https://files.pythonhosted.org/packages/88/38/4e0d1f86d0c2518ebc0019dfb5fc98b436a61ae176fc13a6c09c5ae87f7b/ssh2net-2019.9.10.tar.gz", "yanked": false, "yanked_reason": null } ], "2019.9.2": [ { "comment_text": "", "digests": { "md5": "f5d39027343859102d1aee7a757cb697", "sha256": "bd550a1c3c660f54a637f66c6ddf5eaa3ec132ec7c7b8afc5f20de071b5cf714" }, "downloads": -1, "filename": "ssh2net-2019.9.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f5d39027343859102d1aee7a757cb697", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 15452, "upload_time": "2019-09-03T01:27:45", "upload_time_iso_8601": "2019-09-03T01:27:45.746346Z", "url": "https://files.pythonhosted.org/packages/0e/8e/b5665789bda664974d9576b2d60c954d3653e213f01ec946b6c561162f00/ssh2net-2019.9.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "48fa110906a2bb2ea04dc6a35c684d70", "sha256": "958ab24816667177d642c0ca8b9acba8f8e72d4a53d1042c1b2f98c52ddf12cf" }, "downloads": -1, "filename": "ssh2net-2019.9.2.tar.gz", "has_sig": false, "md5_digest": "48fa110906a2bb2ea04dc6a35c684d70", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 15721, "upload_time": "2019-09-03T01:27:47", "upload_time_iso_8601": "2019-09-03T01:27:47.483705Z", "url": "https://files.pythonhosted.org/packages/86/18/8c4cc5571bf50e19c60abbc281f0b70bd63a9f9418ec3feea9f793ec9e2e/ssh2net-2019.9.2.tar.gz", "yanked": false, "yanked_reason": null } ], "2019.9.21": [ { "comment_text": "", "digests": { "md5": "549bdc36f9bb5c0d72137062505686e9", "sha256": "f03c9857611377cd12137644e48bfe00113a5f83cfa3765843275f3009277553" }, "downloads": -1, "filename": "ssh2net-2019.9.21-py3-none-any.whl", "has_sig": false, "md5_digest": "549bdc36f9bb5c0d72137062505686e9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 28904, "upload_time": "2019-09-22T02:23:49", "upload_time_iso_8601": "2019-09-22T02:23:49.603800Z", "url": "https://files.pythonhosted.org/packages/a8/cb/2a112ed6ea0815fb04bac869d91c1a830ebc5091c435492b7b2fdd27b6ed/ssh2net-2019.9.21-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "2007502f496a349ce3af364fd5c888b3", "sha256": "f42ac933ec42cd93e243a49e0404df6c2f0d875607ac2137ee9c71dd4c9719f7" }, "downloads": -1, "filename": "ssh2net-2019.9.21.tar.gz", "has_sig": false, "md5_digest": "2007502f496a349ce3af364fd5c888b3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 26093, "upload_time": "2019-09-22T02:23:51", "upload_time_iso_8601": "2019-09-22T02:23:51.104805Z", "url": "https://files.pythonhosted.org/packages/21/65/6edc23a523b2e5c5eed3b30a9746142a6430318018fe97c652665406aa4b/ssh2net-2019.9.21.tar.gz", "yanked": false, "yanked_reason": null } ], "2020.1.10": [ { "comment_text": "", "digests": { "md5": "243499540045836557f133578e9500cd", "sha256": "40df5a5c9d063185de0a791d42bcd5a5ebfe0bcd5d2f02609bea302cea2b7c61" }, "downloads": -1, "filename": "ssh2net-2020.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "243499540045836557f133578e9500cd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 45782, "upload_time": "2020-01-11T01:44:24", "upload_time_iso_8601": "2020-01-11T01:44:24.458937Z", "url": "https://files.pythonhosted.org/packages/d6/37/5624077d7ddf2de5154e0b3564afb492993538622222d55cfc51676e6def/ssh2net-2020.1.10-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f08bf55fd5339776f599d2ad6e216614", "sha256": "a2d0a16fc6cbaa0d3975bd6830d70d2f0e142a321eb060434092ded4d34c1905" }, "downloads": -1, "filename": "ssh2net-2020.1.10.tar.gz", "has_sig": false, "md5_digest": "f08bf55fd5339776f599d2ad6e216614", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 35220, "upload_time": "2020-01-11T01:44:26", "upload_time_iso_8601": "2020-01-11T01:44:26.169575Z", "url": "https://files.pythonhosted.org/packages/d2/b4/9210d9cfa8761358429e6096473198e662399b435e771f63f8833bca9dc5/ssh2net-2020.1.10.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "243499540045836557f133578e9500cd", "sha256": "40df5a5c9d063185de0a791d42bcd5a5ebfe0bcd5d2f02609bea302cea2b7c61" }, "downloads": -1, "filename": "ssh2net-2020.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "243499540045836557f133578e9500cd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 45782, "upload_time": "2020-01-11T01:44:24", "upload_time_iso_8601": "2020-01-11T01:44:24.458937Z", "url": "https://files.pythonhosted.org/packages/d6/37/5624077d7ddf2de5154e0b3564afb492993538622222d55cfc51676e6def/ssh2net-2020.1.10-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f08bf55fd5339776f599d2ad6e216614", "sha256": "a2d0a16fc6cbaa0d3975bd6830d70d2f0e142a321eb060434092ded4d34c1905" }, "downloads": -1, "filename": "ssh2net-2020.1.10.tar.gz", "has_sig": false, "md5_digest": "f08bf55fd5339776f599d2ad6e216614", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 35220, "upload_time": "2020-01-11T01:44:26", "upload_time_iso_8601": "2020-01-11T01:44:26.169575Z", "url": "https://files.pythonhosted.org/packages/d2/b4/9210d9cfa8761358429e6096473198e662399b435e771f63f8833bca9dc5/ssh2net-2020.1.10.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }