我正在为此拔头发。我查看了 /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 的文件来欺骗它吗?
尝试-tt看看是否有效。
从 ssh 手册页,
Multiple -t options force tty allocation, even if ssh has no local tty.