{ "info": { "author": "Chad Smith", "author_email": "grassfedcode@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3.6" ], "description": "\n
\n \n

View and control remote terminals from your browser

\n
\n\n**Documentation**: https://cs01.github.io/termpair\n\n**Source Code**: https://github.com/cs01/termpair\n\n---\n\n## What is TermPair?\n\nTermPair lets developers share and control terminals in real time.\n\n## Usage\n\nStart the TermPair server:\n\n```\ntermpair share\n```\n\nThen share your terminal by running:\n\n```\ntermpair share\n```\n\nA URL will be printed to the terminal, such as:\n\n```\nhttp://localhost:8000/?id=5a32e471453c0bb0c642acbbd6ee58f8\n```\n\n
\n \n
\n\nThat URL is valid for the current terminal sharing session. The session ends when the process being broadcast ends, usually by typing `quit` or `exit`, or by closing the terminal window. At that time, the URL is no longer valid.\n\nThe session can be shared with others who you want to view and optionally control your terminal from a browser:\n\n
\n \n
\n\nPass the `-a` flag to grant the browser control of the terminal:\n\n```\ntermpair share -a\n```\n\n## Quickstart\n\nTo quickly get up and running (without even having to install to your system!), use [pipx](https://github.com/pipxproject/pipx) to start the server:\n\n```\npipx run termpair serve\n```\n\nThen share your client by running\n\n```\npipx run termpair share -b\n```\n\nThe `-b` flag will automatically open a browser tab to view the shared terminal.\n\n## Installation\n\nYou can install using [pipx](https://github.com/pipxproject/pipx) or pip:\n\n```\npipx install termpair\n```\n\nor\n\n```\npip install termpair\n```\n\n## API\n\nTo view the command line API reference, run:\n\n```\ntermpair --help\n```\n\n## Security Considerations\n\nIt should go without saying but this can be extremely dangerous if you use it improperly.\n\n**You should only broadcast a terminal session you want to be shared, and only share the URL with those you trust.** No password is required after opening the URL, so consider it to be sensitive information!\n\nBy using TermPair, anyone with the sharable URL can:\n\n- View every keystroke you make (even passwords that appear hidden in the terminal).\n- View every character output by the terminal.\n\nIf you are in a public location, someone over your shoulder could see this url, or take a picture of it, providing them the ability to view or control your termpair session.\n\nIf you allow other users to control your terminal, they can:\n\n- Run any commands.\n- View/modify/delete any files.\n- Restart or corrupt your computer.\n- Install a virus.\n\nIf you run the server locally on the default host, it will not be accessible to anyone other than you. These security implications apply if you are exposing the port to others.\n\n## System Requirements\n\nOperating System:\n\n- To view/control from the browser: All operating systems are supported.\n- To run the server, `termpair serve`: Tested on Linux. Should work on macOS. Might work on Windows.\n- To share your terminal, `termpair share`: Tested on Linux. Should work on macOS. Probably doesn't work on Windows.\n\nPython: 3.6\n\n## How It Works\n\nTermPair is built with Python and leverages asynchronous paradigms, so it's efficient and snappy. It uses the [Bocadillo](https://bocadilloproject.github.io/) web framework on the backend.\n\n### Run Server\n\nThe server acts as a router between a unix terminal broadcasting and the browser(s) that are remotely viewing the terminal.\n\nIt must be started before a terminal session can be broadcast.\n\n```\n$ termpair serve\nINFO: Started server process [16592]\nINFO: Waiting for application startup.\nINFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)\n```\n\nTerminals can now broadcast to http://127.0.0.1:8000 \ud83c\udf89.\n\n### Broadcast Your Terminal\n\nTo let others view your terminal:\n\n```\n$ termpair share\nSharing all input and output of `bash -l`.\n\nWARNING: Your terminal is viewable but NOT controllable from\n\nlocalhost:8000/?id=e8a7c806102134022455ddd1841470ed\n\nType 'exit' to stop sharing.\n\nWhen you are no longer sharing, you will see the secret string 'dxQDwwWms844' printed.\n\n\n$ exit\nlogout\nYou are no longer broadcasting (dxQDwwWms844)\n```\n\nYour terminal is now viewable at `localhost:8000/?id=e8a7c806102134022455ddd1841470ed`. \ud83c\udf89\n\nTo let others view **and remotely control** your terminal:\n\n```\n$ termpair share -a\n\n...\n\nWARNING: Your terminal is viewable AND controllable from\n\nlocalhost:8000/?id=e8a7c806102134022455ddd1841470ed\n...\n```\n\nWhen you run this, a new [pty](https://en.wikipedia.org/wiki/Pseudoterminal) process is started locally, and by default launches a new instance of the shell you are using, such as `bash`. But it can run any executable, interactive or not, with any arguments you want to supply.\n\nYou can pass the `--cmd` flag to specify the process that is shared in the terminal session.\n\n```\ntermpair share # shares current SHELL. Can run anything from within here, like vim.\ntermpair share --cmd $SHELL # equivalent to the above command\ntermpair share --cmd \"python\"\ntermpair share --cmd \"gdb\"\ntermpair share --cmd \"gdb -p 1234\"\n```\n\nThe sharing session ends when the process the terminal was sharing ends, usually by typing `exit` or `quit`. It can also be ended by closing the terminal itself. Each session is assigned a unique TermPair session id, which is a short string of characters. The session id is never shared with the server or any viewers watching the session.\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/cs01/termpair", "keywords": "terminal,share,broadcast,pty,websockets", "license": "License :: OSI Approved :: MIT License", "maintainer": "", "maintainer_email": "", "name": "termpair", "package_url": "https://pypi.org/project/termpair/", "platform": "", "project_url": "https://pypi.org/project/termpair/", "project_urls": { "Homepage": "https://github.com/cs01/termpair" }, "release_url": "https://pypi.org/project/termpair/0.0.0.2/", "requires_dist": [ "bocadillo (<0.14,>=0.13.1)", "mkdocs ; extra == 'dev'", "mkdocs-material ; extra == 'dev'", "mypy ; extra == 'dev'", "black ; extra == 'dev'" ], "requires_python": ">=3.6", "summary": "View and control remote terminals from your browser", "version": "0.0.0.2" }, "last_serial": 5226944, "releases": { "0.0.0.1": [ { "comment_text": "", "digests": { "md5": "4ce401a68ce32b47a99de70c8065dfd9", "sha256": "d8a6e6e7a8cf7a8ff4d7104b8051d519b4bdd58b6cd3b978a8eea8dd8b4b3f19" }, "downloads": -1, "filename": "termpair-0.0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "4ce401a68ce32b47a99de70c8065dfd9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 414917, "upload_time": "2019-03-17T05:10:08", "url": "https://files.pythonhosted.org/packages/08/b5/391f41650023b1ef131cec263e6c7e5f050455cab3f7d0e6f6398c083d6e/termpair-0.0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56800e61e15efdd5bb01f68c31990fc0", "sha256": "0f688bdc5158a64a50ef1109c01fcd448e967cef45164a27ecaf86d69798cb12" }, "downloads": -1, "filename": "termpair-0.0.0.1.tar.gz", "has_sig": false, "md5_digest": "56800e61e15efdd5bb01f68c31990fc0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 406486, "upload_time": "2019-03-17T05:10:11", "url": "https://files.pythonhosted.org/packages/97/52/7023d06e6f9daa740bf2ed912bda5558b36ee50ceb6fcf27147c1dd59483/termpair-0.0.0.1.tar.gz" } ], "0.0.0.2": [ { "comment_text": "", "digests": { "md5": "65722b04457c74514d218b8648908603", "sha256": "2d4bde5d906b5076fac98f1aa80a1b3b4383327a9166e74641f6edec087937a3" }, "downloads": -1, "filename": "termpair-0.0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "65722b04457c74514d218b8648908603", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 415634, "upload_time": "2019-05-04T23:46:24", "url": "https://files.pythonhosted.org/packages/fb/fc/866cea0c85c60e919c36cffd315c0ff6d4374fc2c95f8f160d790166b167/termpair-0.0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "043b8cd67ce56a83336332be6197acd7", "sha256": "db4be4127ee8ef1f1cdd6eaabc4917749b17fdfb22d2f171b57a9c6f6259c3e3" }, "downloads": -1, "filename": "termpair-0.0.0.2.tar.gz", "has_sig": false, "md5_digest": "043b8cd67ce56a83336332be6197acd7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 407355, "upload_time": "2019-05-04T23:46:26", "url": "https://files.pythonhosted.org/packages/c2/8a/d88e2197b6c20eccd1447231c93e403d47897d76b92ff32aafa31abd4be3/termpair-0.0.0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "65722b04457c74514d218b8648908603", "sha256": "2d4bde5d906b5076fac98f1aa80a1b3b4383327a9166e74641f6edec087937a3" }, "downloads": -1, "filename": "termpair-0.0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "65722b04457c74514d218b8648908603", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 415634, "upload_time": "2019-05-04T23:46:24", "url": "https://files.pythonhosted.org/packages/fb/fc/866cea0c85c60e919c36cffd315c0ff6d4374fc2c95f8f160d790166b167/termpair-0.0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "043b8cd67ce56a83336332be6197acd7", "sha256": "db4be4127ee8ef1f1cdd6eaabc4917749b17fdfb22d2f171b57a9c6f6259c3e3" }, "downloads": -1, "filename": "termpair-0.0.0.2.tar.gz", "has_sig": false, "md5_digest": "043b8cd67ce56a83336332be6197acd7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 407355, "upload_time": "2019-05-04T23:46:26", "url": "https://files.pythonhosted.org/packages/c2/8a/d88e2197b6c20eccd1447231c93e403d47897d76b92ff32aafa31abd4be3/termpair-0.0.0.2.tar.gz" } ] }