/dev/tty:没有这样的设备或地址 - 仅在脚本中

Bry*_*son 8 ssh bash tty

我正在为此拔头发。我查看了 /dev/tty 的所有谷歌结果:没有这样的设备或地址,它们都不适用于我正在做的事情/没有一个解决方案是成功的。

我有一个脚本,可以通过 SSH 连接到另一台机器(使用公钥)并自行运行(使用不同的参数 - 它不会循环)。调用这个 rpmInstallScript.bash

在脚本的某一时刻,它运行 rpm -ivh 来安装一些 RPM 包。在安装这些软件包之一的过程中,会在 /var/tmp 中放置一个名为 rpm-tmp 的文件。[6 个随机字符]

这个文件是一个脚本,我猜它是在 rpm 安装过程中的某个时刻执行的。

在脚本中,有多次出现

echo [something] > /dev/tty 
Run Code Online (Sandbox Code Playgroud)

或者

echo [something] | tee [something] > /dev/tty.
Run Code Online (Sandbox Code Playgroud)

所有这些事件都以 /dev/tty 失败:没有这样的设备或地址。如果我手动 ssh 进入机器并自己 rpm 包,运行 rpm-tmp 脚本或运行 rpmInstallscript.bash,它工作正常。

我正在使用 ssh -t 连接到远程机器,因此应该有一个 tty,对吗?

我不明白为什么这不起作用,特别是因为手动执行,即使没有 -t 选项,也能正常工作。我唯一能想到的是它不是交互式会话 - 但 /dev/tty 应该仍然存在,对吗?

编辑 - 错误结果来自:

ssh -t root@[machine] -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null <<DONE
./rpmInstallScript.bash
Run Code Online (Sandbox Code Playgroud)

其中 rpmInstallScript.bash 运行 rpm -ivh,放置在 /var/tmp 中的结果脚本使用 >/dev/tty - 这就是失败的原因

再次编辑:使用 -tt 给出:

tcgetattr: Inappropriate ioctl for device
Run Code Online (Sandbox Code Playgroud)

仅当从脚本运行时 - 手动运行 ssh -tt 然后 echo test >/dev/tty 工作正常。

我只能假设这是强制创建 tty 的失败。

有没有其他方法可以“生成”tty?我可以通过创建一个名为 /dev/tty 的文件来欺骗它吗?

hkd*_*tam 3

尝试-tt看看是否有效。

从 ssh 手册页,

Multiple -t options force tty allocation, even if ssh has no local tty.