#!/usr/bin/env python3 # Types text into the VM through the QEMU monitor (US keyboard). # Usage: type.py MONITOR_SOCKET 'text' (newline = Enter; keys: {{ctrl-s}}, {{esc}}, ...) import re, socket, sys, time SHIFTED = {'!': '1', '@': '2', '#': '3', '$': '4', '%': '5', '^': '6', '&': '7', '*': '8', '(': '9', ')': '0', '_': 'minus', '+': 'equal', '{': 'bracket_left', '}': 'bracket_right', '|': 'backslash', ':': 'semicolon', '"': 'apostrophe', '<': 'comma', '>': 'dot', '?': 'slash', '~': 'grave_accent'} PLAIN = {' ': 'spc', '\n': 'ret', '\t': 'tab', '-': 'minus', '=': 'equal', '[': 'bracket_left', ']': 'bracket_right', '\\': 'backslash', ';': 'semicolon', "'": 'apostrophe', ',': 'comma', '.': 'dot', '/': 'slash', '`': 'grave_accent'} def keys(text): for token in re.split(r'(\{\{[a-z0-9_-]+\}\})', text): if token.startswith('{{') and token.endswith('}}'): yield token[2:-2] continue for c in token: if c in PLAIN: yield PLAIN[c] elif c in SHIFTED: yield 'shift-' + SHIFTED[c] elif c.isupper(): yield 'shift-' + c.lower() elif c.isalnum(): yield c s = socket.socket(socket.AF_UNIX) s.connect(sys.argv[1]) time.sleep(0.2) text = open(sys.argv[2][1:]).read() if sys.argv[2].startswith('@') else sys.argv[2] for k in keys(text): s.sendall(('sendkey %s\n' % k).encode()) time.sleep(0.06) time.sleep(0.3)