OverviewFilesCommitsIssuesDocsReleasesPeers

hypermosh-shell / test / pty-mosh.py

29 lines · python ref:
#!/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()