问题标签 [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 投票
1 回答
6331 浏览

linux - linux下监控和记录/dev/pts/1

我想监视和记录一个伪终端设备 /dev/pts/12 (用于调试目的),即我想查看写入终端的内容,并且我不希望使用终端的任何进程注意到。

显而易见的解决方案

不起作用:充其量,它似乎只捕获击键。

换句话说,我想要一些类似于 script -t file.timings typescript 的输出;但我也需要击键。Reptyr -l $PID 是另一个可能有帮助的程序:它将进程 $PID 的输出重定向到另一个 /dev/pts 或管道。

0 投票
3 回答
5405 浏览

ruby - Linux PTY 上的 Ruby 在没有 EOF 的情况下消失,引发 Errno::EIO

我正在编写一些代码,它接收一个文件,将该文件传递给几个二进制文件之一进行处理,并监视转换过程中的错误。我已经在 OSX 上编写并测试了以下例程,但由于我不清楚的原因,linux 失败了。

运行的命令变化很大,##mark 处的代码已被简化为本地回显,以尝试调试问题。该命令执行,脚本在终端中打印预期的输出,然后引发异常。

它在 Debian 系统上产生的错误是: Errno::EIO (Input/output error - /dev/pts/0):

我能想到的所有命令字符串都会产生该错误,当我在没有本地 echo 块的情况下运行代码时,它运行得很好:

在任何一种情况下,命令本身都可以正常执行,但似乎 debian linux 没有将 eof 发送到 pty。PTY 的文档页面和 ruby​​-doc 上的 IO 似乎在这里没有任何帮助。

有什么建议么?谢谢。

-vox-

0 投票
2 回答
1883 浏览

linux - 使用 pty(通过 ssh)和管道连接到更多

这是一个让我发疯的问题,我无法找到解决方案。我的程序:

并且看起来像~/severalLineFileanotherhost

当我自己运行我的程序时,我的终端的输出看起来像预期的那样。但是,当调整我的终端大小使其只有 5 行,并将我的程序通过管道传输到更少时,它看起来像:

并且在该点按空格键时,它会打印出line5line6(以及任何其他行),例如:

现在我明白这是在伪终端中运行 ssh 的结果,并且由于回车符包含在换行符中而发生这种阶梯式。我已经尝试过使用stty ocrnl,但这并没有达到我想要的效果,即在我按下空格键后,最初打印的 less 表现得像所有东西一样。

顺便说一句,我需要ssh-t模式下运行,因为我希望所有ctrl+C键盘中断都能进入远程进程。如果在这方面有解决方案,我会全力以赴。我在 Linux Server 6.1 上,终端是通过 Mac OS 10.6.8

我也尝试用 替换\r\n伪终端生成的\n,但这并不能解决问题。

0 投票
2 回答
1735 浏览

python - ssh 使用没有 RSA 密钥的 python

Stackoverflow 的新手,所以首先,你好。

我正在为我的学校做一个小项目,该项目应该是开源 Unison 程序的自定义 gui(用 python 编写,对我来说是一个教育挑战,因为我从未使用过 python)。我们正在尝试让学生和教职员工在家里和学校同步文件夹,方法是通过尽可能少的输入启动这个程序(如果你愿意的话,请防止白痴)。该界面应该只是他们是学校用户名和密码,而 gui 包装器应该只是将用户名和密码发送到 Unison 并同步它们。

问题是 Unison 依次启动 SSh 并提示输入密码,但 python subprocess.communicate(input) 方法不会让 ssh 获取密码。我意识到 ssh 只会接受来自终端的输入,我不知道如何欺骗它。我读过一些关于使用伪终端的东西,但我仍然很难过。RSA 密钥将是理想的解决方案,但生成它们然后将它们放置在远程服务器上仍然需要我至少使用密码登录一次,这需要解决上述问题,或者终端不是白痴证明。

如果我将其粘贴到终端中,执行字符串可以正常工作。如果您愿意,任何一般的 python 提示也将不胜感激。

谢谢!

Unison 用户手册:http ://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html

编辑:我还应该注意,虽然我目前正在 OSX 和 Linux 下进行开发,但我最终必须使这个 Windows 兼容,因为我学校的大多数学生都将 Windows 作为他们的主要(或唯一)机器运行。

0 投票
1 回答
925 浏览

linux - pty 文件描述符读取超时失败

我正在尝试在代表 PTY 的文件描述符上设置读取超时。我在 termios 中设置了 VMIN = 0 和 VTIME = 10,我希望在字符可用时返回,或者如果没有字符可用则在一秒钟后返回。但是,我的程序永远处于读取调用中。

PTY 有什么特别之处使它不起作用吗?是否有其他 TERMIOS 设置导致此设置起作用?我在标准输入文件描述符上尝试了相同的配置,它按预期工作。

0 投票
2 回答
1076 浏览

java - 如何使用 PTY 在 Scala 中生成进程?

在红宝石中,我有:

如何在 scala/java 中做到这一点?

0 投票
4 回答
8963 浏览

python - 捕获输出时使用带有 select 和 pty 的子进程挂起

我正在尝试编写一个能够与其他程序交互的 python 程序。这意味着发送标准输入和接收标准输出数据。我不能使用 pexpect(尽管它确实启发了一些设计)。我现在使用的过程是这样的:

  1. 将 pty 附加到子进程的标准输出
  2. 通过检查循环直到子进程退出subprocess.poll
    • 当标准输出中有可用数据时,立即将该数据写入当前标准输出。
  3. 结束!

我一直在对一些代码(如下)进行原型设计,这些代码有效,但似乎有一个让我烦恼的缺陷。子进程完成后,如果我在使用select.select. 我真的不想设置超时。只是看起来有点脏。但是,我试图解决这个问题的所有其他方法似乎都不起作用。Pexpect 似乎通过使用os.execvandpty.fork而不是subprocess.Popenpty.openpty我不喜欢的解决方案来解决它。我在检查子流程的生命周期方面做错了吗?我的方法不正确吗?

我正在使用的代码如下。我在 Mac OS X 10.6.8 上使用它,但我也需要它在 Ubuntu 12.04 上工作。

这是子流程运行器runner.py

这是子流程代码outputter.py奇怪的随机部分只是为了模拟程序以随机​​间隔输出数据。如果您愿意,可以将其删除。没关系

感谢您提供的任何帮助!

额外说明

使用 pty 是因为我想确保 stdout 不被缓冲。

0 投票
3 回答
1265 浏览

c - 如何从 ssh 会话中获取伪终端主文件描述符?

在 C 或 bash 中,

我想知道,如果可能的话,您如何从 ssh 会话内部获取伪终端主机的文件描述符,该主机负责获取该会话的从属设备(pts)的输入。

0 投票
1 回答
3871 浏览

sftp - sshpass 抛出错误“无法获得伪终端:成功”

我正在尝试运行 sshpass 工具来自动执行 sftp 操作。

在另一台服务器上,该命令有效,但在该服务器上它只返回一行错误消息。

这是我正在使用的命令:

我得到了错误:

我已经用许多不同的主机和 root 用户尝试过它,我可以毫无问题地 sftp,所以我很确定它是 sshpass 或伪终端问题。

我对伪终端知之甚少,似乎找不到任何有关错误的信息。文件夹 /dev/pts 为空, cat /proc/sys/kernel/pty/nr 为 0,我认为这意味着没有任何运行。从 ptya0 到 ptyzf 共有 256 个 pty** 项目,这让我相信我可能已经达到了伪终端数量的限制。我认为我的最大终端数(通过查看 cat /proc/sys/kernel/pty/max)是 4096。

有没有其他人遇到过这个错误或知道可能出了什么问题?它是一个生产服务器,所以我不能让它停机。对此的任何帮助将不胜感激。

0 投票
1 回答
2210 浏览

terminal - 无法更改 pty/N 上的终端大小(适用于 ttyN)

我使用下一个来更改终端大小:
rc = ioctl(fd, TIOCSWINSZ, &ws);
当我在 linux 文本终端下运行它时(通过 Alt-Ctrl-F1 切换),结果是我希望看到的。在 ioctl 系统调用给定的范围内我的整个输入和输出。
但是当我通过 SSH 连接到 localhost 并运行相同的程序时,它只能部分工作。我的意思是我不能输入比 ioctl 设置的终端大小更宽的命令,但是输出可以跨越 ioctl 给定的终端边界,并且输入可以占用 ioctl 设置的更多行。之后也没有自动回车和换行。
我直接运行程序时看到的唯一区别是它在终端/dev/ttyN上运行,它的主编号是5,当我通过SSH运行程序时,它使用/dev/pts/N作为终端,主编号为136 .所以,据我了解,这是由于终端的差异而发生的。
我的问题:
1. 这是正确的吗?是终端驱动的原因吗?
2. 我该如何解决?我需要通过 SSH 进行相同的行为,就像在本地 tty 终端中一样。

谢谢!