脚本运行时同局域网跨设备Async异步传输控制台输出方案咨询
局域网脚本输出同步实现方案
方案1:零侵入管道+netcat组合(优先推荐)
无需修改原脚本、无需额外写代码,1分钟即可配置完成
- 原理是直接捕获原脚本的标准输出流,通过系统自带的网络工具转发,完全不影响原脚本的运行逻辑,输出实时性可达毫秒级
- 步骤1:在接收端(局域网内的另一台电脑)启动端口监听,执行命令:
nc -l 0.0.0.0 9999,其中9999为自定义端口,可自行替换为未被占用的端口,同时确保两台设备的防火墙放开该端口的TCP访问规则 - 步骤2:在运行原脚本的服务端,修改原脚本的启动命令即可完成转发:
- 仅转发输出、服务端本地不展示:
./你的原脚本执行命令 | nc 接收端局域网IP 9999 - 转发输出同时服务端本地也展示:
./你的原脚本执行命令 | tee /dev/tty | nc 接收端局域网IP 9999
- 仅转发输出、服务端本地不展示:
方案2:异步Socket实现(适合需要自定义逻辑的场景)
需要少量代码开发,支持扩展日志过滤、断连重连、多端同步等功能
可以直接使用Python标准库asyncio实现异步非阻塞的转发逻辑,无需安装第三方依赖,原脚本运行不会受到任何阻塞:
服务端(运行原脚本的设备)代码示例
import asyncio async def push_output(receiver_ip: str, port: int): # 替换为你自己的原脚本启动命令 proc = await asyncio.create_subprocess_exec( "./your_original_script.sh", stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.STDOUT ) # 建立和接收端的长连接 reader, writer = await asyncio.open_connection(receiver_ip, port) while True: # 异步监听脚本输出,无新输出时不会阻塞 line = await proc.stdout.readline() if not line: break writer.write(line) await writer.drain() writer.close() await writer.wait_closed() if __name__ == "__main__": # 替换为接收端的实际局域网IP和自定义端口 asyncio.run(push_output("192.168.3.20", 9999))
接收端代码示例
import asyncio async def handle_receive(reader, writer): while True: line = await reader.readline() if not line: break # 收到输出直接打印到控制台,可根据需求修改为存储到文件等逻辑 print(line.decode("utf-8"), end="") async def run_server(): server = await asyncio.start_server(handle_receive, "0.0.0.0", 9999) async with server: await server.serve_forever() if __name__ == "__main__": asyncio.run(run_server())
- 先启动接收端代码,再启动服务端代码即可实现实时同步,所有IO操作均为异步非阻塞,不会影响原脚本的运行效率
注意事项
- 如果需要支持多台设备同时接收输出,可以在方案2的基础上引入MQTT协议,局域网内部署本地MQTT broker即可,无需公网资源
- 涉及的自定义端口需要提前在两台设备的防火墙中配置入站、出站放行规则,避免连接被拦截
内容的提问来源于stack exchange,提问作者Luís Henrique Martins
相关产品推荐
相关产品推荐

