标签: pty

什么是伪终端 (pty/tty)?

这可能是非常基本的问题,但我想彻底了解它。

  1. 什么是伪终端?(tty/pty)
  2. 我们为什么需要它们?他们是如何被介绍的以及对它的需求是什么?
  3. 它们过时了吗?我们不再需要它们了吗?有什么东西可以代替它们吗?
  4. 任何有用的用例?

我做了什么:

  1. 阅读手册页 - 获得了一些信息,但没有确切的图片。
  2. 试图从 Richard Stevens 的 Unix Network Programming 中阅读它们。得到了一些信息,但不是那why?部分。

linux terminal pty

121
推荐指数
3
解决办法
8万
查看次数

91
推荐指数
3
解决办法
11万
查看次数

每个伪终端 (PTY) 组件(软件、主端、从端)的职责是什么?

我试图弄清楚tty如何工作的1(每个元素的工作流程和职责)。我已经阅读了几篇关于它的有趣文章,但仍然有一些模糊的地方。

这是我到目前为止的理解:

  • 仿真终端/dev/ptmx对伪终端的主控部分进行不同的系统调用。
  • 伪终端的master部分分配了一个文件/dev/pts/[0-N],对应过时的串口,并在其上“附加”了一个slave伪终端。
  • 从伪终端保存会话ID、前台作业、屏幕大小等信息。

以下是我的问题:

  1. ptmx除了分配从属部分之外还有什么用途吗?它是否提供某种“智能”,或者模拟终端(例如 xterm)具有像终端一样运行的所有智能?
  2. 为什么 xterm必须与 master 部分交互,因为它只转发 slave 部分的 stdout 和 stdin?为什么不能 直接读写pts文件
  3. 会话 ID 是否总是附加到一个 pts 文件,反之亦然?我可以输入 ps 命令并找到2 个 sessionId 的相同 /dev/pts/X吗?
  4. pts商店还有什么其他信息?Xterm 是自己更新所有字段,还是在其上ptm添加一些“智能”?

1. 我的理解基于Linus Akesson 揭秘TTYAndries BrouwerLinux Kernel帖子,以及这些网站上的其他几个问题

kernel terminal-emulator terminal tty pty

77
推荐指数
3
解决办法
2万
查看次数

如何诱使命令认为其输出将发送到终端

给定一个命令,当它的输出到达终端时改变其行为(例如产生彩色输出),如何在保留改变的行为的同时在管道中重定向该输出?必须有一个实用程序,我不知道。

某些命令(例如grep --color=always)具有选项标志来强制执行该行为,但问题是如何解决仅依赖于测试其输出文件描述符的程序。

如果重要的话,我的 shellbash在 Linux 上。

shell pipe utilities stdout pty

55
推荐指数
6
解决办法
1万
查看次数

Linux 终端如何工作?

如果你启动一个终端并调用一个可执行文件(为了简单起见,假设它是面向行的),你会从可执行文件中得到对命令的回复。这如何打印给您(用户)?终端是否做类似的事情pexpect?(轮询等待输出)还是什么?它如何获得要打印输出的通知?终端如何启动程序?(它类似于 python 的 os.fork() 吗?)我很困惑终端是如何工作的,我一直在玩一些终端模拟器,但我仍然不明白所有这些魔法是如何工作的。我正在查看 konsole (kde) 和 yakuake(可能使用 konsole)的来源,但我无法理解所有这些魔法发生的地方。

terminal-emulator terminal tty architecture pty

35
推荐指数
2
解决办法
2万
查看次数

我们如何知道谁在伪终端设备的另一端?

如果我做:

echo foo > /dev/pts/12
Run Code Online (Sandbox Code Playgroud)

某些进程foo\n将从其文件描述符中读取到主端。

有没有办法找出那个(那些)过程是什么?

或者换句话说,我怎么能找出哪个 xterm/sshd/script/screen/tmux/expect/socat... 在 的另一端/dev/pts/12

lsof /dev/ptmx将告诉我在任何 pty 的主端具有文件描述符的进程。一个进程本身可以使用ptsname()TIOCGPTNioctl)根据自己的fd找出从设备到主端,所以我可以使用:

gdb --batch --pid "$the_pid" -ex "print ptsname($the_fd)"
Run Code Online (Sandbox Code Playgroud)

对于lsof构建该映射而返回的每个 pid/fd ,是否有更直接、可靠且侵入性更小的方法来获取该信息?

terminal-emulator open-files pty

29
推荐指数
2
解决办法
6391
查看次数

'script /dev/null' 有什么作用?

每次我使用 rootsu用户登录 VM并尝试使用screen它时都会引发错误:

Cannot open your terminal '/dev/pts/0' - please check.
Run Code Online (Sandbox Code Playgroud)

Stack Overflow 上的一篇帖子说我需要用script /dev/null它来修复它,它可以工作,但它仍然没有解释为什么我需要输入script /dev/null. 我想了解它的作用以及为什么我需要输入它。

gnu-screen terminal su pty

21
推荐指数
1
解决办法
3140
查看次数

如何在 Jenkins 的 Docker 容器中运行构建

我正在尝试使用 Jenkins 在 Docker 容器中构建 C++ 项目。我在 Jenkins 中构建或在 Jenkins 之外的容器中构建都没有问题。

以下是我尝试过的。为清楚起见,我省略了卷映射。

情况1

以下命令在 shell 中成功运行构建。

docker run --rm --interactive=true --tty=true $IMAGE make
Run Code Online (Sandbox Code Playgroud)

但是,当在 Jenkins 中作为“执行 shell”步骤运行时,Docker 会返回以下错误。

cannot enable tty mode on non tty input
Run Code Online (Sandbox Code Playgroud)

案例二

以下命令与前一个命令类似,但禁用交互性。

docker run --rm $IMAGE make
Run Code Online (Sandbox Code Playgroud)

Jenkins 可以成功运行构建。但是,在中止构建时会出现严重的问题。构建会立即标记为中止,但容器会继续运行,直到构建完成。退出后容器也不会被移除。

在 shell 中运行时,命令会成功构建,但无法中断它。退出后容器也会被移除。

有谁知道如何在 Jenkins 的 Docker 容器中干净地运行构建并保留中止构建的能力?

使用任何 Jenkins 插件都不是一种选择,因为 Docker 调用在脚本内部并且无法轻松提取。

tty jenkins pty docker

19
推荐指数
1
解决办法
2万
查看次数

为什么需要按两次 ^D 才能退出 `cat`?

让我们运行cat然后输入athen ^D- 你会看到cat没有退出。

cat+ a+ Enter+比较^D- 现在 cat 确实退出了。

那么,为什么在第一种情况下^D需要按两次退出cat,而^D在第二种情况下只需要按一次?

tty pty stty

13
推荐指数
1
解决办法
807
查看次数

当 ssh 客户端的参数后跟一个交互式程序时,为什么 sshd 不使用伪终端?

连接到 SSH 服务器的正常方法是ssh username@ip_address. 但是用户可能只想在远程机器上运行程序。所以程序名称跟在正常参数之后,即ssh username@ip_address <program_name>. 例如,ssh username@ip_address ls。除了交互式程序(也接受用户输入以及提供输出),例如top. 输出是

未设置 TERM 环境变量。

这意味着 sshd 和 top 程序之间没有连接(伪)终端。解决方案是-t在整个命令现在变成的地方添加参数ssh -t username@ip_address top

我的问题是为什么默认情况下 sshd 不能也使用伪终端与非交互式程序进行通信,因此不需要-t为交互式程序添加参数?

ssh pty

11
推荐指数
2
解决办法
4948
查看次数