Skip to content

Instantly share code, notes, and snippets.

@jonathanslenders
Created January 10, 2024 11:40
Show Gist options
  • Select an option

  • Save jonathanslenders/873f1c050456d4c1d7ef9928c850d6e2 to your computer and use it in GitHub Desktop.

Select an option

Save jonathanslenders/873f1c050456d4c1d7ef9928c850d6e2 to your computer and use it in GitHub Desktop.
python-webbrowser-over-ssh
# Example to make Python's `webbrowser` module work over SSH.
# 1. Run the following code on the host machine:
import asyncio, webbrowser
async def handler(reader, writer):
data = await reader.read()
url = data.decode()
addr = writer.get_extra_info('peername')
print(f"{addr!r}: {url!r}")
webbrowser.open(url)
await writer.wait_closed()
async def main():
server = await asyncio.start_server(handler, '127.0.0.1', 7348)
addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)
print('Starting webbrowser server')
print(f'Listening on on {addrs}')
async with server:
await server.serve_forever()
asyncio.run(main())
# 2. Run the following code on the client:
import socket, webbrowser
class SSHBrowser(webbrowser.BaseBrowser):
def open(self, url: str, new: int = 0, autoraise: bool = True) -> None:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 7348))
s.send(url.encode())
s.close()
return True
webbrowser.register("ssh-browser", None, SSHBrowser(), preferred=True)
# 3. Open an SSH tunnel from the host to where the client runs:
# ssh destination -R 7348:localhost:7348
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment