无法使用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 fcntlimport 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