web-dev-qa-db-fra.com

Ioctl inapproprié pour le périphérique lors de la tentative de SSH

J'essaie de SSH quelques serveurs et j'obtiens la sortie Sudo -l de chaque serveur.

Ci-dessous le script que j'exécute

#!/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"

J'ai trouvé cette option -tt dans ce script comme cause de cette erreur. Toute pensée sur ceci?

Aussi, j'ai noté que je ne vois pas cette erreur quand j'exécute la commande ci-dessous juste pour 1 serveur.

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

Ci-dessous le message d'erreur complet que je reçois: tcgetattr: Inappropriate ioctl for device

4
Chamara Keragala

tcgetattr: Inappropriate ioctl for devicenormalement signifie que certains programmes ont tenté d'effectuer une opération de contrôle de terminal, mais que les flux d'E/S standard n'étaient pas connectés à un terminal. (Je le sais parce que tcgetattr est le nom d'une fonction de bibliothèque C effectuant des opérations de contrôle de terminal.)

Désormais, le point entier de l'option -tt de ssh est de garantir que le programme exécuté sur l'hôte distant est connecté à un terminal, et que stty imprimant speed 38400 baud; line = 0; -brkint -imaxbel démontre qu'il était. Voici ce que je reçois lorsque j'exécute ces commandes avec mes serveurs:

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

Mais ce que vous obtenez est

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

L'erreur tcsetattr provient de not provenant de stty. Tout d'abord, quelque chose a essayé de faire quelque chose lié au terminal et a échoué, et thenstty a été exécuté avec succès. Cela suggère un bogue dans vos scripts de démarrage du shell, qui font quelque chose d’inapproprié lorsqu’ils sont exécutés "de manière non interactive", ce qui vous permet d’obtenir cette erreur même si vous exécutez des commandes connectées un terminal. Je ne peux pas vous aider davantage, mais peut-être que cette vieille réponse concernant un problème similaire } offre quelques indices.

6
zwol

Dans cette réponse, je ne vais pas proposer une solution (je ne sais pas d’où vient l’erreur), mais je vais plutôt suggérer un puissant instrument pour la trouver!

Pour comprendre l’origine du problème, vous pouvez utiliser la commande strace

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

Bien sûr, vous saurez quel est l'appel système à l'origine de l'erreur. Le shell invitera tous les appels système et, à un moment proche de la fin, vous verrez quelque chose comme:

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

Ici , vous pouvez trouver des exemples sur comment utiliser it. 

Suggestion: avant l'appel système ioctl(...), il devrait exister un appel système open(...) pour le même périphérique. Allez dans le fichier d’en-tête de l’appareil et essayez de regarder les différentes commandes que vous pouvez transmettre. Le problème devrait être une commande non reconnue} (due peut-être à une ancienne version du pilote de périphérique utilisé). Ce n'est qu'une suggestion.

1
Leos313
0
Felipe