一尘不染

无法使用termios.TIOCSTI伪造终端输入

linux

我见过的大多数代码示例都试图从stdin读取而没有本地回显。为此,他们修改了“本地模式”标志以删除“回声输入字符”设置。我想我可能只是修改“输入模式”标志,TIOCSTI这是“插入输入队列给定的字节。”
。但是,即使我以root身份运行脚本,也没有任何效果。我写给fd的所有内容似乎都去了终端输出,而不是终端输入。基本上,我想做的就是这个确切的事情,但是在纯python中。

"""
termfake.py

Usage: sudo python termfake.py /dev/ttys002

Get the tty device path of a different local termimal by running `tty`
in that terminal.
"""

import sys
import termios

fd = open(sys.argv[1], 'w')
fdno = fd.fileno()

# Returns [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]
tatters = termios.tcgetattr(fdno)
print('original', tatters)
tatters[0] = termios.TIOCSTI
print('TIOCSTI', termios.TIOCSTI)

# Set iflag
termios.tcsetattr(fdno, termios.TCSANOW, tatters)

# Verify setting change
with open('/dev/ttys002', 'w') as fd2:
    print('modified', termios.tcgetattr(fd2.fileno()))

fd.write('This is test\n')
fd.close()

阅读 472

收藏
2020-06-07

共1个答案

一尘不染

TIOCSTI是一个ioctl(在中进行了记录tty_ioctl(4)),而不是终端设置,因此您不能使用tcsetattr()-您需要将伪输入的每个字符输入ioctl()。以前从未需要从Python进行过ioctl操作,但是以下操作似乎可以ls在运行Bash
的其他终端(指定为参数,例如 / dev / pts / 13 )中运行:

import fcntl
import sys
import termios

with open(sys.argv[1], 'w') as fd:
    for c in "ls\n":
        fcntl.ioctl(fd, termios.TIOCSTI, c)

TIOCSTI``CAP_SYS_ADMIN顺便要求root特权(或更具体地讲,但实际上通常是相同的)-请参阅capabilities(7)

2020-06-07