我正在尝试通过 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
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 启动脚本中存在错误,这些脚本在“非交互式”运行时执行了不适当的操作,导致您收到此错误即使您正在运行连接到终端的命令。 我无法进一步帮助您,但也许有关类似问题的旧答案提供了一些线索。
提出一个解决方案(我不知道错误来自哪里),但是,相反,我将建议一个强大的工具来找到它! 要了解问题出在哪里,可以使用命令
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(...)
系统调用。进入设备的头文件并尝试查看可以传递给它的不同命令。问题应该是无法识别的命令(由于可能使用的是旧版本的设备驱动程序)。这只是一个建议。
中,您可以找到一行:
mesg y
替换为:
if [ -t 1 ]; then
mesg n
fi
这将避免警告