diff --git a/dashboard/backend/routers/terminal.py b/dashboard/backend/routers/terminal.py index 97430e6..991e5ba 100644 --- a/dashboard/backend/routers/terminal.py +++ b/dashboard/backend/routers/terminal.py @@ -28,16 +28,19 @@ async def ws_endpoint(websocket: WebSocket, token: str = Query("")): return try: - chan, session = await conn.create_session( - asyncssh.SSHClientProcess, term_type="xterm-256color", - term_size=(80, 24), + process = await conn.create_process( + term_type="xterm-256color", term_size=(80, 24), + encoding=None, ) async def read_ssh(): try: - async for data in chan.stdout: - await websocket.send_bytes(data.encode() if isinstance(data, str) else data) - except (asyncssh.Error, WebSocketDisconnect): + while True: + data = await process.stdout.read(4096) + if not data: + break + await websocket.send_bytes(data) + except (asyncssh.Error, WebSocketDisconnect, asyncio.CancelledError): pass read_task = asyncio.create_task(read_ssh()) @@ -50,14 +53,15 @@ async def ws_endpoint(websocket: WebSocket, token: str = Query("")): if data[0:1] == b"\x01" and len(data) == 5: cols = struct.unpack("!H", data[1:3])[0] rows = struct.unpack("!H", data[3:5])[0] - chan.change_terminal_size(cols, rows) + process.channel.change_terminal_size(cols, rows) else: - chan.write(data.decode("utf-8", errors="replace")) + process.stdin.write(data) elif "text" in msg and msg["text"]: - chan.write(msg["text"]) + process.stdin.write(msg["text"].encode()) except WebSocketDisconnect: pass finally: read_task.cancel() + process.close() finally: conn.close()