问题标签 [pty]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
4168 浏览

linux - 如何监视进程和终端之间的通信?

我有一个由第三方开发的与终端通信的 Linux 进程。对于调试,我希望看到通信返回。

有人可能会认为cat可以解决问题(看到一个方向):

...但事实并非如此。相反,cat会窃取一半用于应用程序的数据,这几乎毫无价值。

third-party-app 被硬编码为假设/dev/tty.

我发现监视通信的一种方法是将/dev/tty设备重命名为,比如说,/dev/real_tty并创建一个命名管道/dev/tty来代替它。然后运行:

...至少会让我看到 的输出,方法是将数据从命名管道/dev/real_tty复制到./dev/real_tty/dev/ttystdout

这种工作但感觉真的很狡猾,并且依赖于更换设备的诡计。它也不能双向工作,因为命名管道只能在一个方向上传输数据。

这样做的正确方法是什么?

如果有人想知道,TTY 设备是与微控制器的 RS-232 链接。该信息不敏感或不安全。所有进程(应用程序和间谍)都可以作为 root 运行。

0 投票
2 回答
3607 浏览

linux - 如何检测何时有人在 Linux 中打开 pty(伪终端)的从属端?

从串行设备(/dev/ttyXX)读取多个进程使得这两个进程无法获取所有数据——数据将以某种方式在它们之间拆分。我想编写一个从串行设备读取的程序,创建几个主/从 pty 对,然后允许从串行设备读取的程序改为从 pty 读取,以便所有读取进程都接收数据从串行设备开始,让 pty 像串行设备一样工作,因为当它们开始从 pty 读取时,它们只会获得最新的数据。换句话说,您不会得到任何在开始阅读之前写入的数据(根据我的经验,这就是 /dev/ttyXX 设备的工作方式,或者至少是我正在阅读的 RS-232 风速计)。命名管道可以通过捕获 SIGPIPE 来模拟这些语义,以确定没有读取器,因此我们可以选择不写入特定的命名管道。然而,一些为使用终端而编写的二进制文件在与命名管道通信时可能会失败,因为检查 isatty() 和 tcsetattr() 等调用时的 errno 条件可能会导致失败条件。这里的关键是能够使用为终端编写的现有二进制文件。

因此,如果我可以检测到何时打开 pty 的从属端进行读取,这应该给我提供与命名管道案例中没有 SIGPIPE 大致相同的语义。我注意到 HP-UX 将 TIOCTRAP 作为 ioctl() 命令,这似乎完全符合我的要求,但遗憾的是它在 Linux 上不可用。

几天来我一直在阅读参考资料,这类事情的选择数量是惊人的。答案可能在于终端设置、阻塞/非阻塞行为、在某处设置缓冲区大小、从 poll()/select() 报告的条件或某种组合。不过,我似乎找不到任何东西。我想知道是否有可能我需要编写自己的设备驱动程序,但似乎我应该能够做到这一点而无需走那么远。

因此,为了澄清:
- 问题是:如何检测有人在 Linux 中打开 pty(伪终端)的从属端?
- 我希望阅读器打开 pty 的从端以在阅读器打开 pty 后严格接收写入的数据(如果我的多写过程只是在阅读器打开从端之前写入数据一段时间,数据将缓冲起来并最终写入器将阻塞,从属读取器在打开时将立即获取所有缓冲数据——这是不可取的,因为我希望它只获取在紧邻时间附近生成的数据)
——它必须是一个 pty,而不是命名管道、套接字等,因为 isatty() 和 tcsetattr() 等需要正常,以便现有的二进制文件工作

0 投票
1 回答
1598 浏览

ruby - Why is ruby's PTY library failing to capture input when the shell has subprocesses?

I am writing a terminal emulator in ruby using the PTY library. /dev/tty0 is a device file connected to a keyboard. I am spawning the shell like this:

It mostly works, but when a subprocess is started in the shell, shell[0] is not outputting the keyboard input to that subprocess. For example: When I send "cat\nasdf" through shell[1], "cat" comes back through shell[0] but "asdf" does not. Why is this happening, and how can I fix it?

Edit:
Here is my code. ChumbyScreen is an external module controlling the screen of the embedded device I am writing this for (it is called "Chumby"). The write method puts a character on the screen.

After reading shodanex's answer, I tried this:

It works, but characters I have typed do not show up until I press enter. It must be line buffered somehow - how do I get past this? Also Control-C and Control-D do nothing. I need them to send an eof and terminate a process.

0 投票
1 回答
1737 浏览

linux - rlwrap:无法打开主 pty:没有这样的文件或目录

尝试运行rlwrap tclsh时,我收到此错误消息:

这是什么原因造成的?如何解决这个问题?

PS 我正在运行 64 位 CentOS。

0 投票
1 回答
535 浏览

python - 字符不能从主伪终端变为从伪终端

我目前正在尝试通过 pexpect 发送二进制数据。出于某种原因,除了 0x04 之外,数据只是通过 find 得到的,它只是被跳过了。我跟踪了 pexpect 调用以确定所有发生的事情都是对从 pty.fork() 命令打开的文件描述符的 os.write() 调用。

有任何想法吗?

(举例说明问题的示例代码)

结果:

0 投票
1 回答
1512 浏览

c - C/Linux 编程:伪终端:如何从当前 stdio 重定向到 pty 并在使用后重定向回来

我正在尝试创建一个简单的远程管理程序,用户可以在其中连接到我的小设备并“接管”系统的当前 stdio。例如:

系统启动时使用控制台=串行端口 --> 客户端连接,将输入/输出重定向到套接字

我已经使用 Linux 的 pty 功能完成了对网络部分的重定向(通过阅读大量手册页。伙计,直到现在我才欣赏这些手册页!:D)。

openpty() -> grantpt() -> unlockpt() --> 客户端连接,执行 login_tty()

然后我的程序处理主 FD 和套接字的监视。但是,我有一个大问题:我不知道如何将输出重定向回来。我尝试了以下方法:

o 硬编码打开串口文件

o 在 login_tty() 中使用打开的串口文件

但它似乎不起作用(关于进程组和在执行第一个 login_tty() 后成为进程组的领导者)。有什么建议或想法吗?

login_tty() 是否具有某种“逆”功能?

0 投票
5 回答
14010 浏览

python - python pty.fork - 它是如何工作的

http://docs.python.org/library/pty.html说 -

pty.fork()¶ 将孩子的控制终端连接到伪终端。返回值为 (pid, fd)。请注意,孩子的 pid 为 0,并且 fd 无效。parent 的返回值是 child 的 pid,fd 是连接到 child 的控制终端(也连接到 child 的标准输入和输出)的文件描述符。

这是什么意思?每个进程都有 3 个 fd(stdin、stdout、stderr)。现在这会影响这些 fds 吗?子进程不会有这些 fd 吗?我很困惑。 - 完全。

0 投票
3 回答
6353 浏览

bash - 如何重定向写入 tty 的程序?

这是未重定向的输出(如果您不知道是什么module,则无关紧要):

假设我想将它重定向到一个文件....

嗯,应该在stderr

嘿!它正在重置我的重定向。这真的很烦人,我有两个问题:

  1. 我怎样才能实现我想要的,即将所有内容重定向到我的文件中
  2. 他们为什么要做这么奇怪的事情?

另请参阅相关问题。

编辑:有人在评论中询问,所以有一些细节。这是在 64 位的 AIX 5.3 上。我的 python 2.6.5 几乎完全可用。我同时拥有 gcc 4.1.1 和 gcc 4.5.1,但链接它们的库并不多(util-linux-ng 库,其中包含答案中提到的脚本版本,无法为 getopt 部分编译)。我也有几个版本的 IBM XL 编译器 xlc。我一开始没有指定的原因是我希望在一些 shell 技巧中,也许使用 exec,而不是在外部程序中。

0 投票
6 回答
7558 浏览

php - 如何使用 PHP 设置交互式 SSH 会话?

我正在尝试通过 Mac OS X 10.6 上的命令行使用 PHP 建立与远程服务器的交互式 SSH 连接。我目前正在使用 PHP 的 proc_open 函数来执行以下命令:

这几乎可以工作。这些-t -t选项应该强制一个他们几乎做的伪终端。我可以输入 SSH 密码并按回车键。但是,按下回车后,终端似乎只是挂起。没有输出,什么都没有——就好像 SSH 会话失败了。我无法运行命令或任何东西,必须使用 Ctrl+C 杀死整个事情。我知道登录成功,因为我可以执行类似的命令ssh -t -t -p 22 user@server.com "ls -la"并获得正确的输出。

我认为问题一定与我在 proc_open 调用中使用标准管道这一事实有关,因此我将它们替换为 pty。我收到以下错误:“此系统不支持 pty 伪终端...”

Mac OS X 是否根本不支持 pty 或伪终端?(我对使用所有这些 shell 术语很陌生)。

这是PHP代码:

(对不起 - 我一辈子都无法弄清楚 SO 的格式说明......)

我究竟做错了什么?为什么我不能使用 pty?这在 Mac OS X 上是不可能的吗?谢谢你的帮助!

0 投票
2 回答
7292 浏览

linux - 将数据传输到需要 TTY(终端)的 Linux 程序

我在 Linux 中有一个程序,如果它的标准输入/标准输出不是 TTY(终端设备),它会拒绝运行。是否有一个易于使用的工具可以创建 PTY,使用新创建的 TTY 启动程序,并通过 stdin/stdout 复制所有数据?

用例不是交互式的,而是脚本。我正在寻找最轻量级的解决方案,最好不要创建 TCP 连接,并且不需要安装太多其他工具和库。