Articles of pty

OSError故障排除:出于pty设备

有时,我调用pty.openpty() (当我的脚本的一堆实例并发运行时发生pty.openpty()我得到了一个OSErrorexception,并带有'out of pty devices'消息。 什么是我打的限制? 我怎样才能解决这个问题? CentOS 5.6,Python 2.4

伪terminal的使用 – C

我使用特定的会话编号创build了一个pThread 。 如果pThread产生了,我试着让另一个进程运行使用openpty启动的伪terminal。 这是代码的一部分: if (openpty(&(numa_pst[session][0]),&(numa_pst[session][1]), NULL, NULL, NULL) != 0) { int err_code = errno; sprintf (line_temp, "*** ERROR: numa openpty failed with:\n%s\n", strerror(err_code)); } session = 0; int* pi = calloc(sizeof(int), 1); *pi = session; if (pthread_create(&system_wideThread[session], 0, system_wider, (void*)pi)) { int err_code = errno; sprintf (line_temp, "*** ERROR: System-wide thread spawn failed […]

我如何与Python中的另一个程序进行交互?

我想编写一个运行另一个程序的Python脚本,读取其他程序的输出并对其进行处理。 问题是这个程序提示input密码,我不知道如何自动提供。 (对于这个脚本来说,如果密码是以纯文本的forms存储在脚本本身,那真的没什么关系)。我想要做的就是: os.system('echo someinput | /var/local/bin/someprogram') 这会导致某些程序给我不需要的密码提示,也不会将程序的输出作为返回值。 不幸的是,该scheme没有办法绕过这个提示。 不幸的是,我对于如何解决这个问题也有一些限制。 首先,我坚持Python 2.3(所以我不能使用subprocess模块)。 其次,我不能安装任何新的模块,(所以没有关系)。 幸运的是,它不必特别便携,所以只有Linux的解决scheme是好的。 我一直在试图弄清楚pty模块,因为它看起来像提供了我所需要的,但花了几个小时的时间与之搏斗后,我无法弄清楚如何让它按我需要的方式工作。

你可以欺骗isatty并单独loginstdout和stderr吗?

问题 所以你要logging一个进程或subprocess的stdout和stderr(单独的),如果你没有logging任何东西,输出和你在terminal中看到的不一样。 似乎很简单没有? 不幸的是,似乎不可能为这个问题写出一个通用的解决scheme,这对任何给定的过程都有效。 背景 pipe道redirect是分离标准输出和标准错误的一种方法,允许您单独logging它们。 不幸的是,如果将stdout / err更改为pipe道,则进程可能会检测到pipe道不是tty(因为它没有宽度/高度,波特率等),并可能相应地改变其行为。 为什么改变行为? 那么,有些开发人员利用terminal的function,如果你正在写出一个文件,这是没有意义的。 例如,加载栏通常需要将terminal光标移回到行的开始位置,并使用新长度的栏来覆盖以前的加载栏。 颜色和字体重量也可以显示在terminal中,但是在平面ASCII文件中不能。 如果要将这样一个程序的标准输出直接写入文件,则该输出将包含所有terminal的ANSI转义码,而不是格式正确的输出。 因此,开发人员在向stdout / err写入任何内容之前都会执行某种“isatty”检查,因此如果该检查返回false,则可以为文件提供更简单的输出。 这里通常的解决scheme是欺骗这样的程序,通过使用一个pty(一个双向pipe道,也有宽度,高度等等)来认为pipe道实际上是tty。你将进程的所有input/输出redirect到这个pty,处理成思考它与真实的terminal交谈(你可以直接把它logging到文件中)。 唯一的问题是,通过使用stdout和stderr的单个pty,我们现在不能再区分这两者了。 所以你可能想为每个pipe道尝试一个不同的pty,一个是stdin,一个是stdout,另一个是stderr。 虽然这将在50%的时间内运行,但许多进程不幸的是会执行额外的redirect检查,以确保stdout和stderr(/ dev / tty000x)的输出path是相同的。 如果它们不是,那么必须有redirect,因此它们会给你一样的行为,就好像你已经用stdout和stdout没有pty一样。 你可能会认为这种redirect检查是不常见的,但不幸的是,这实际上是非常普遍的,因为很多程序都重复使用其他代码来检查,就像在OSX中find这样的代码: http://src.gnu-darwin.org/src/bin/stty/util.c 挑战 我认为寻找解决scheme的最佳方式是以挑战的forms。 如果任何人都可以运行下面的脚本(理想情况下通过Python,但在这一点上我会采取任何东西),stdout和stderr分别logging,你设法愚弄它认为它是通过一个tty,你解决了这个问题:) #!/usr/bin/python import os import sys if sys.stdout.isatty() and sys.stderr.isatty() and os.ttyname(sys.stdout.fileno()) == os.ttyname(sys.stderr.fileno()): sys.stdout.write("This is a") sys.stderr.write("real tty :)") else: sys.stdout.write("You cant fool me!") sys.stdout.flush() […]

如何在Linux中使用C语言的伪terminal?

我试图弄清楚如何在Linux中使用伪terminal,本质上我想创build一个telnetd克隆,我在前面提到的问题 。 我理解主从terminal的概念,对C中如何使用系统调用有基本的把握 我的问题涉及打开从属/主文件描述符后的下一步。 如何在奴隶中启动getty? 有没有在网上使用forkpty(),openpty(),或其他API的好资源? C中的一些例子会有所帮助。 这是一个非常相似的问题 ,但没有人提供任何实例。

pipe理数据到Linux程序,期望TTY(terminal)

我有一个Linux程序拒绝运行,如果它的标准input/标准输出不是TTY(terminal设备)。 是否有一个易于使用的工具,将创build一个PTY,与新创build的TTY启动程序,并通过标准input/标准输出复制所有数据? 用例不是交互式的,而是脚本。 我正在寻找最轻量级的解决scheme,最好不要创buildTCP连接,也不需要安装太多的其他工具和库。