37 lines
1.5 KiB
Python
Executable File
37 lines
1.5 KiB
Python
Executable File
#!/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)
|