#!/usr/bin/env python3
# Drive mosh-client in a PTY with a real window size (mosh asserts s_height>0).
# Usage: pty-mosh.py <MOSH_KEY> <host> <port> <seconds> (prints captured output)
import os, pty, sys, select, struct, fcntl, termios, time
key, host, port, secs = sys.argv[1], sys.argv[2], sys.argv[3], float(sys.argv[4])
mfd, sfd = pty.openpty()
fcntl.ioctl(sfd, termios.TIOCSWINSZ, struct.pack('HHHH', 40, 120, 0, 0))
pid = os.fork()
if pid == 0:
os.setsid()
os.dup2(sfd, 0); os.dup2(sfd, 1); os.dup2(sfd, 2)
try: fcntl.ioctl(sfd, termios.TIOCSCTTY, 0)
except OSError: pass
os.environ.update(MOSH_KEY=key, LC_ALL='C.UTF-8', LANG='C.UTF-8', TERM='xterm')
os.execvp('mosh-client', ['mosh-client', host, port]); os._exit(127)
os.close(sfd)
buf = b''; end = time.time() + secs
while time.time() < end:
r, _, _ = select.select([mfd], [], [], 0.5)
if r:
try: d = os.read(mfd, 8192)
except OSError: break
if not d: break
buf += d
try: os.kill(pid, 15)
except OSError: pass
sys.stdout.buffer.write(buf); sys.stdout.flush()