尝试 SSH 时设备的 ioctl 不合适

新手上路,请多包涵

我正在尝试对几台服务器进行 SSH 连接,并尝试获取每台服务器的 sudo -l 输出。

下面是我正在执行的脚本

#!/bin/bash
serverlist="/tmp/servers"

while IFS=, read -r server netgroup username user
do
        ssh -tt -q root@$server sudo -U $username -l < /dev/null
done < "$serverlist"

我发现该脚本中的 -tt 选项是导致此错误的原因。对此有什么想法吗?

我还注意到,当我仅为 1 台服务器执行以下命令时,我没有看到此错误。

ssh -tt -q root@myserver sudo -U cham01 -l

以下是我收到的完整错误消息: tcgetattr: Inappropriate ioctl for device

原文由 Chamara Keragala 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
1 个回答

tcgetattr: Inappropriate ioctl for device 通常 表示某些程序试图进行终端控制操作,但其标准 I/O 流未连接到终端。 (我知道这一点是因为 tcgetattr 是执行终端控制操作的 C 库函数的名称。)

现在, -tt 选项到 ssh 的全部意义在于保证远程主机 运行的程序连接到终端,并且 stty 打印出来 speed 38400 baud; line = 0; -brkint -imaxbel 证明它 .这是 在服务器上运行这些命令时得到的结果:

 $ ssh myserver stty < /dev/null
stty: 'standard input': Inappropriate ioctl for device

$ ssh -tt myserver stty < /dev/null
speed 38400 baud; line = 0;
-brkint -imaxbel
Connection to myserver closed.

但是你得到的是

$ ssh -tt yourserver stty < /dev/null
tcsetattr: Inappropriate ioctl for device
speed 38400 baud; line = 0;
-brkint -imaxbel

tcsetattr 错误 不是 来自 stty 。首先有些东西试图做一些与终端相关的事情但失败了, 然后 stty 运行成功。这表明您的 shell 启动脚本中存在错误,该错误在“非交互式”运行时执行了不适当的操作, 即使正在 运行连接到终端的命令,也会导致您收到此错误。我不能再帮你了,但也许 这个关于类似问题的旧答案 提供了一些线索。

原文由 zwol 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题