尝试 SSH 时设备的 ioctl 不合适

问题描述 投票:0回答:4

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

linux bash ssh scripting
4个回答
15
投票

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

现在,

-tt
选项对
ssh
的全部意义在于保证在远程主机上运行的程序is连接到终端,并且
stty
打印出
speed 38400 baud; line = 0; -brkint -imaxbel
表明它was 。 这是当我使用 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 启动脚本中存在错误,这些脚本在“非交互式”运行时执行了不适当的操作,导致您收到此错误即使正在运行连接到终端的命令。 我无法进一步帮助您,但也许有关类似问题的旧答案提供了一些线索。


5
投票
export GPG_TTY=$(tty)

来自:

https://github.com/keybase/keybase-issues/issues/2798#issue-205008630

:)


4
投票
在这个答案中,我不会

提出一个解决方案(我不知道错误来自哪里),但是,相反,我将建议一个强大的工具来找到它! 要了解问题出在哪里,可以使用命令

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) ....

在这里

,您可以找到有关如何使用的示例。

建议:

ioctl(...)系统调用之前,应该对同一设备进行

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


0
投票
/etc/bashrc

中,您可以找到一行: mesg y

替换为:

if [ -t 1 ]; then mesg n fi

这将避免警告

© www.soinside.com 2019 - 2024. All rights reserved.