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