【发布时间】:2017-08-12 12:00:51
【问题描述】:
我正在处理research project 并尝试读取用户正在输入终端的内容,在评估命令时停止执行,然后恢复(或关闭)会话。
我发现这个example in the docs 会打开一个新会话,记录所有内容并将其写入文件。
在削减额外内容后,我最终得到了这个:
import os, pty
shell = os.environ.get('SHELL', 'sh')
with open('typescript', 'w') as script:
def read(fd):
data = os.read(fd, 1024)
# Parse on the hash
cmd = data.decode()
before, sep, after = cmd.rpartition("#")
script.write(after)
return data
pty.spawn(shell, read)
这有两个问题,一个是它是反应式的,另一个是它还捕获给定命令的任何输出。
在寻找另一种方式时,我找到了a different question 的答案:
def wait_key():
''' Wait for a key press on the console and return it. '''
result = None
if os.name == 'nt':
import msvcrt
result = msvcrt.getch()
else:
import termios
fd = sys.stdin.fileno()
oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)
try:
result = sys.stdin.read(1)
except IOError:
pass
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
return result
我阅读了 terminos 文档并认为这可能是要走的路,但我不明白如何使其适应 ENTER 键。
编辑:我正在做的是使用机器学习模型评估命令并决定是否允许执行命令,例如阻止某人使用 sudo rm -rf /。这实际上只是一个概念验证和演示。
有没有更好的方法来解决这个问题?
【问题讨论】: