Ubuntu远程服务器SSH登录后调用本地浏览器显示链接的方法
这个需求我刚好折腾过,分两种常见场景给你具体方案,都是在Ubuntu环境下验证过的:
场景1:远程启动Web服务,自动在本地打开对应地址
如果你的Python脚本是启动一个Web服务(比如Flask/Django),需要本地浏览器自动访问这个远程服务,用SSH端口转发+本地脚本串联最方便:
- 写一个本地的bash脚本(比如
remote_run_and_open.sh),把端口转发、远程执行脚本、本地打开浏览器的步骤串起来:
#!/bin/bash # 替换成你的远程服务器用户名和地址 REMOTE_USER="your-remote-user" REMOTE_HOST="your-remote-ip-or-domain" # 远程Web服务的端口(比如脚本启动在8000) REMOTE_PORT=8000 # 本地映射的端口(和远程一致就行,避免冲突) LOCAL_PORT=8000 # 远程Python脚本的路径 REMOTE_SCRIPT_PATH="/path/to/your/script.py" # 1. 后台建立SSH端口转发,把远程端口映射到本地 ssh -fNL ${LOCAL_PORT}:localhost:${REMOTE_PORT} ${REMOTE_USER}@${REMOTE_HOST} # 2. 远程执行Python脚本(如果脚本需要后台运行,可以加&) ssh ${REMOTE_USER}@${REMOTE_HOST} "python3 ${REMOTE_SCRIPT_PATH}" # 3. 本地自动打开默认浏览器访问映射后的地址 xdg-open "http://localhost:${LOCAL_PORT}"
- 给脚本加执行权限:
chmod +x remote_run_and_open.sh - 运行脚本即可:
./remote_run_and_open.sh
场景2:远程任意操作触发本地打开指定URL
如果需要远程脚本执行到某个逻辑节点时,主动通知本地打开任意URL(比如外部链接、本地文件地址等),用SSH反向隧道+本地监听服务实现:
第一步:本地准备监听服务
写一个简单的Python脚本(local_browser_trigger.py),用来监听本地端口,收到远程发来的URL后调用浏览器打开:
import socket import subprocess import sys def main(): # 监听本地的9000端口(可以自定义,只要不冲突) LISTEN_PORT = 9000 try: server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('localhost', LISTEN_PORT)) server.listen(1) print(f"Local trigger listener running on port {LISTEN_PORT}...") while True: client, addr = server.accept() # 接收远程发来的URL url = client.recv(1024).decode('utf-8').strip() if url: print(f"Received trigger: opening URL {url}") # 调用系统默认浏览器(Ubuntu用xdg-open,兼容所有桌面环境) subprocess.run(['xdg-open', url], check=True) client.close() except Exception as e: print(f"Error: {e}", file=sys.stderr) sys.exit(1) if __name__ == "__main__": main()
先把这个脚本后台运行:
nohup python3 local_browser_trigger.py &
第二步:建立SSH反向隧道
登录远程服务器时,加上反向隧道参数,把本地的9000端口映射到远程的9000端口:
ssh -R 9000:localhost:9000 your-remote-user@your-remote-host
第三步:修改远程Python脚本
在需要触发本地浏览器的位置,添加以下代码,向远程的9000端口发送URL:
import socket def trigger_local_browser(url): try: # 连接到映射过来的本地端口(远程的localhost:9000就是本地的9000) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('localhost', 9000)) sock.sendall(url.encode('utf-8')) sock.close() print("Successfully triggered local browser") except Exception as e: print(f"Failed to trigger local browser: {str(e)}") # 示例:在脚本逻辑完成后触发 if __name__ == "__main__": # 你的业务代码 print("Running remote Python script...") # ... 执行你的操作 ... # 触发本地打开目标URL trigger_local_browser("https://example.com")
额外注意事项
xdg-open是Ubuntu桌面环境的通用命令,会自动调用你设置的默认浏览器;如果指定用Chrome,可以换成google-chrome,Firefox换成firefox。- 端口转发时如果遇到端口被占用,换个未使用的端口即可(比如把9000换成9001,两端保持一致)。
- 如果需要长期运行本地监听服务,可以把它做成systemd服务,避免终端关闭后进程终止。
内容的提问来源于stack exchange,提问作者An0n
相关产品推荐
相关产品推荐

