it-swarm.com.ru

Неправильный ioctl для устройства при попытке SSH

Я пытаюсь SSH несколько серверов и пытаюсь получить вывод Sudo -l каждого сервера.

Ниже скрипт, который я выполняю

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

while IFS=, read -r server netgroup username user
do
        ssh -tt -q [email protected]$server Sudo -U $username -l < /dev/null
done < "$serverlist"

Я обнаружил, что опция -tt в этом скрипте является причиной этой ошибки. Есть мысли по этому поводу?

Также я отметил, что я не вижу эту ошибку, когда я выполняю команду ниже только для 1 сервера.

ssh -tt -q [email protected] Sudo -U cham01 -l

Ниже приведено полное сообщение об ошибке, которое я получаю: tcgetattr: Inappropriate ioctl for device

4
Chamara Keragala

tcgetattr: Inappropriate ioctl for deviceобычно означает, что некоторая программа пыталась выполнить операцию управления терминалом, но ее стандартные потоки ввода/вывода не были подключены к терминалу. (Я знаю это, потому что 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

Ошибка tcsetattrnot исходит от stty. Сначала что-то пыталось сделать что-то, связанное с терминалом, и не удалось, и затемstty успешно запустился. Это говорит об ошибке в ваших скриптах запуска Shell, которая делает что-то неуместное при запуске «неинтерактивно», в результате чего вы получаете эту ошибку даже если you are выполнение команд, подключенных к терминалу. Я не могу вам больше помочь, но, возможно, этот старый ответ о похожей проблеме предлагает некоторые подсказки.

6
zwol

В этом ответе я не предложу решение (я не знаю, откуда возникла ошибка), но вместо этого я собираюсь предложить мощный инструмент для его поиска!

Чтобы понять, откуда возникла проблема, вы можете использовать команду strace

strace ssh -tt -q [email protected] Sudo -U cham01 -l < /dev/null 

Конечно, вы поймете, какой из них является системным вызовом, который вызывает ошибку. Командная консоль будет запрашивать все системные вызовы, и в какой-то момент ближе к концу вы увидите что-то вроде:

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

Здесь , вы можете найти примеры по как использовать это. 

Предложение: перед системным вызовом ioctl(...) должен быть системный вызов open(...) для того же устройства. Зайдите в файл заголовка устройства и попробуйте взглянуть на другую команду, которую вы можете передать. Проблема должна заключаться в не распознанная команда (из-за возможно старой версии используемого драйвера устройства). Это всего лишь предложение.

1
Leos313
0
Felipe