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

我见过的大多数代码示例都试图从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()

回答:

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)

以上是 无法使用termios.TIOCSTI伪造终端输入 的全部内容, 来源链接: utcz.com/qa/413661.html

回到顶部