【问题标题】:Inappropriate ioctl for device when trying to SSH尝试 SSH 时设备的 ioctl 不合适
【发布时间】:2017-08-20 04:56:40
【问题描述】:

我正在尝试通过 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

【问题讨论】:

  • 请显示错误消息的完整且未经编辑的文本,而不仅仅是“不适合设备的 ioctl”部分。这个问题有几个不同的潜在原因,如果没有进一步的信息,我无法判断是哪一个。另外,请告诉我们脚本是否真的失败,或者它是否只打印您想要的输出但这个错误消息。
  • 添加-vvv 切换到ssh 命令以获取更多信息和消息的上下文(而不是-q,它会隐藏所有信息)。
  • (1) 执行ssh -tt -q root@myserver sudo -U cham01 -l &lt; /dev/null 时是否出现此错误?
  • (2) 我再说一遍:请告诉我们脚本是否真的失败,或者它是否只打印了您想要的输出以及此错误消息。
  • @zwol 脚本不会失败。它只是在输出中打印tcgetattr: Inappropriate ioctl for device。是的,当我执行ssh -tt -q root@myserver sudo -U cham01 -l &lt; /dev/null 时出现此错误

标签: linux bash ssh scripting


【解决方案1】:

【讨论】:

    【解决方案2】:

    在这个答案中,我将提出解决方案(我不知道错误来自哪里),而是建议使用强大的工具来找到它!

    要了解问题出在哪里,可以使用命令strace

    strace ssh -tt -q root@myserver sudo -U cham01 -l < /dev/null 
    

    您肯定会意识到哪个是导致错误的系统调用。 shell 将提示所有系统调用,并且在接近尾声的某个时刻,您会看到如下内容:

    ....
    ioctl(3, SNDCTL_TMR_START or TCSETS, {B0 -opost -isig -icanon -echo ...}) = -1 ENOTTY (Inappropriate ioctl for device)
    ....
    

    Here,您可以找到如何使用它的示例。

    建议:在ioctl(...) 系统调用之前,应该对同一设备有一个open(...) 系统调用。进入设备的头文件并尝试查看可以传递它的不同命令。问题应该是无法识别的命令(由于可能使用的设备驱动程序的旧版本)。这只是一个建议。

    【讨论】:

    • 这是一个很好的技巧,但如果错误消息来自ssh 连接的远程端,它将无济于事。
    • 对!我只是想分享几年前我发现问题的方式!这可能对我猜的人有帮助
    【解决方案3】:

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

    现在,-tt 选项对ssh 的全部意义在于保证远程主机上运行的程序 连接到终端,并且stty 打印出@987654328 @ 表明它。这是我在 my 服务器上运行这些命令时得到的结果:

    $ 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 启动脚本中存在错误,该错误在“非交互式”运行时执行了一些不适当的操作,导致您收到此错误正在运行连接到终端的命令。我不能再帮你了,但也许this old answer about a similar problem 提供了一些线索。

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 2010-12-08
      • 1970-01-01
      • 2014-09-17
      • 2015-02-03
      • 2021-11-25
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多