【问题标题】:Python TTY ControlPython TTY 控件
【发布时间】:2011-08-19 20:04:28
【问题描述】:

我想我不清楚 getty/agetty/mgetty 程序在 linux/unix 机器上的功能是什么。我可以在 tty 上启动一个 shell,如下所示:

TTY = '/dev/tty3'

cpid = os.fork()
if cpid == 0:
    os.closerange(0, 4)
    sys.stdin = open(TTY, 'r')
    sys.stdout = open(TTY, 'w')
    sys.stderr = open(TTY, 'w')
    os.execv(('/bin/bash',), ('bash',))

..如果我切换到 tty3,则有一个 shell 正在运行——但一些击键被忽略/永远不会被发送到 shell。 shell 知道 TTY 设置不正确,因为 bash 会说“无法打开 tty,作业控制已禁用”

我知道 'termios' 模块具有更改 TTY 设置的功能,这是 'tty' 模块使用的功能,但我找不到 python 正确设置 TTY 并启动 shell 的示例。我觉得它应该是一些简单的东西,但我不知道在哪里看。

查看 *etty 程序的源代码对我没有帮助 - C 在我看来像希腊语:-/

也许我只是没有寻找合适的条款?过去有人用 Python 替换了 *etty 程序,并且有愿意分享的解释吗?

感谢您回答我的基本问题 :)

【问题讨论】:

    标签: python linux unix tty termios


    【解决方案1】:

    我可以看到您至少缺少两件事 - 可能还有更多:

    首先,您需要在关闭旧的标准输入/标准输出后,打开新的TTY之前,在子进程中调用setsid()。这做了两件重要的事情 - 它使您的新进程成为新会话的领导者,并将其与之前的控制终端分离(仅仅关闭该终端是不够的)。这意味着当您打开新的 tty 时,它将成为您想要的控制终端。

    其次,需要设置TERM环境变量来匹配新的tty。

    【讨论】:

    • os.setsid() 就是全部!我知道这必须很容易。谢谢。
    【解决方案2】:

    您应该查看 *tty* 程序的源代码,了解它们的作用。

    我的猜测是,他们主要发出一堆 ioctl 命令来将终端初始化为程序通常期望的模式(例如登录等)。但是其中一些也可能提示输入用户名(不是密码;登录会这样做)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多