这可能是非常基本的问题,但我想彻底了解它。
我做了什么:
why?部分。据我所知,/dev/pts文件是为 ssh 或 telnet 会话创建的。
我试图弄清楚tty是如何工作的1(每个元素的工作流程和职责)。我已经阅读了几篇关于它的有趣文章,但仍然有一些模糊的地方。
这是我到目前为止的理解:
/dev/ptmx对伪终端的主控部分进行不同的系统调用。/dev/pts/[0-N],对应过时的串口,并在其上“附加”了一个slave伪终端。以下是我的问题:
pts商店还有什么其他信息?Xterm 是自己更新所有字段,还是在其上ptm添加一些“智能”?1. 我的理解基于Linus Akesson 揭秘的TTY和Andries Brouwer的Linux Kernel帖子,以及这些网站上的其他几个问题
给定一个命令,当它的输出到达终端时改变其行为(例如产生彩色输出),如何在保留改变的行为的同时在管道中重定向该输出?必须有一个实用程序,我不知道。
某些命令(例如grep --color=always)具有选项标志来强制执行该行为,但问题是如何解决仅依赖于测试其输出文件描述符的程序。
如果重要的话,我的 shellbash在 Linux 上。
如果你启动一个终端并调用一个可执行文件(为了简单起见,假设它是面向行的),你会从可执行文件中得到对命令的回复。这如何打印给您(用户)?终端是否做类似的事情pexpect?(轮询等待输出)还是什么?它如何获得要打印输出的通知?终端如何启动程序?(它类似于 python 的 os.fork() 吗?)我很困惑终端是如何工作的,我一直在玩一些终端模拟器,但我仍然不明白所有这些魔法是如何工作的。我正在查看 konsole (kde) 和 yakuake(可能使用 konsole)的来源,但我无法理解所有这些魔法发生的地方。
如果我做:
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 ,是否有更直接、可靠且侵入性更小的方法来获取该信息?
每次我使用 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. 我想了解它的作用以及为什么我需要输入它。
我正在尝试使用 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 调用在脚本内部并且无法轻松提取。
让我们运行cat然后输入athen ^D- 你会看到cat没有退出。
与cat+ a+ Enter+比较^D- 现在 cat 确实退出了。
那么,为什么在第一种情况下^D需要按两次退出cat,而^D在第二种情况下只需要按一次?
连接到 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为交互式程序添加参数?