【问题标题】:bash how to close /dev/tty?bash 如何关闭/dev/tty?
【发布时间】:2013-12-01 22:01:35
【问题描述】:

我希望我的交互式 bash 运行一个最终会执行以下操作的程序: 回声错误:foobar >/dev/tty 并在另一个(python)组件中尝试提示并从 /dev/tty 读取密码。 我希望这样的读写失败,但不会阻塞。
有没有办法在父脚本中关闭 /dev/tty 然后运行程序? 我试过了 foo >&/tmp/outfile

这不起作用。 什么工作是'at'命令: 现在 在> foobar >&/tmp/outfile

【问题讨论】:

    标签: linux bash tty


    【解决方案1】:

    /dev/tty 未在您的父脚本中打开。 /dev/tty 不是文件描述符,而是文件系统中的路径。

    一行脚本如:

    echo foobar > /dev/tty
    

    为自己打开一个新的描述符。为了让它失败,我们必须删除/dev/tty,否则不能让它工作:更改权限,或者用不存在的设备替换它。不用说,这些都是坏主意。

    如果我们想运行一个脚本,它为我们做一些有用的事情,但也做我们不想要的与/dev/tty 之间的 I/O(而且我们不能更改脚本),解决方案包括创建该脚本的环境,其中控制终端是一些伪tty(其主端只是丢弃数据),对/dev/tty/dev/null相同的设备执行chroot

    关于第一个选项,有一些实用程序可以创建伪 tty,例如 Expect。

    例如:

    $ expect -c "spawn ./badscript ; expect"
    

    将在其/dev/tty 是连接到expect 解释器的伪tty 的环境中运行badscript。由badscript 发出的echo foo > /dev/tty 仍会显示在您的终端上,但现在它如何到达您的终端是expect 通过伪tty 设备从badscript 读取它,然后重复它; badscript 被阻止直接写入您的 tty。当然,通过一些期望语言的脚本,您可以防止这种情况发生。

    【讨论】:

    • 我明白了,这很有帮助。不幸的是,我无法在我们无数的服务器上安装期望(或 pexpect)......有没有办法使用 python(内置)'pty' 模块来做到这一点?
    • @GeorgeYoung 不知道,但如果不是,该模块几乎不符合粗体首字母缩写词 PTY。 :)
    【解决方案2】:

    /dev/tty指进程的控制终端。如果您打算通过将其描述为 关闭 来摆脱它,则必须调用 setsid() 这将使进程控制 TTY-less,但必须注意始终传递 O_NOCTTY 否则打开的文件(如果是 TTY)可以成为控制 TTY。[2]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 2013-08-27
      • 2012-02-18
      • 1970-01-01
      相关资源
      最近更新 更多