tcgetattr: Inappropriate ioctl for device

Le
unbewusst.sein
j'utilise ruby pour "émuler" un pseudo-terminal de connection ssh.
ça marche bien excepté un message :

tcgetattr: Inappropriate ioctl for device

que je ne comprends pas très bien.

je "configure" stty par :
system "stty cbreak isig"

et pour éviter d'être bloqué, STDOUT est en mode synchronisé.

je cherche non pas une solution "toute faite" mais des infos pointants
sur un/des tutoriaux expliquant comment configurer stty.

--
Une Bévue
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Cyrille Lefevre
Le #16747081
Une Bévue a écrit :
j'utilise ruby pour "émuler" un pseudo-terminal de connection ssh.
ça marche bien excepté un message :

tcgetattr: Inappropriate ioctl for device

que je ne comprends pas très bien.

je "configure" stty par :
system "stty cbreak isig"

et pour éviter d'être bloqué, STDOUT est en mode synchronisé.



bien essayé, mais stty travaille sur stdin :)

je cherche non pas une solution "toute faite" mais des infos pointants
sur un/des tutoriaux expliquant comment configurer stty.



pas très clair ce que tu veux faire et comment tu le fais.
donne un peu plus d'infos. comment t'interfaces-tu avec le
ssh que tu fork ? etc.
cherche du cote des pseudo-tty (pty)...
le source de la commande script(1) est un bon début pour comprendre.

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
unbewusst.sein
Le #16749171
Cyrille Lefevre
> et pour éviter d'être bloqué, STDOUT est en mode synchronisé.

bien essayé, mais stty travaille sur stdin :)



oui, mais stdin est déjà en mode synchronisé, c'est "builtin" au module
ruby que j'utilise.

le code du module ruby se lit d'ailleurs assez facilement, même si on ne
connait pas ruby :

------ Open3 ----------------------------------------------------
module Open3
def popen3(*cmd)
pw = IO::pipe # pipe[0] for read, pipe[1] for write
pr = IO::pipe
pe = IO::pipe

pid = fork{
# child
fork{
# grandchild
pw[1].close
STDIN.reopen(pw[0])
pw[0].close

pr[0].close
STDOUT.reopen(pr[1])
pr[1].close

pe[0].close
STDERR.reopen(pe[1])
pe[1].close

exec(*cmd)
}
exit!(0)
}

pw[0].close
pr[1].close
pe[1].close
Process.waitpid(pid)
pi = [pw[1], pr[0], pe[0]]
pw[1].sync = true
if defined? yield
begin
return yield(*pi)
ensure
pi.each{|p| p.close unless p.closed?}
end
end
pi
end
module_function :popen3
end
-----------------------------------------------------------------

> je cherche non pas une solution "toute faite" mais des infos pointants
> sur un/des tutoriaux expliquant comment configurer stty.

pas très clair ce que tu veux faire et comment tu le fais.
donne un peu plus d'infos. comment t'interfaces-tu avec le
ssh que tu fork ? etc.


avec ce script ruby qui simule mon UI :
-----------------------------------------------------------------
#! /usr/bin/env ruby

require 'open3'

ansi_red="e[31m"
ansi_clear="e[0m"

system "stty cbreak"

Open3.popen3("ssh -t -t TT") { |stdin, stdout, stderr|
STDOUT.sync=true
#stdin.puts "cd /mnt/fat/4tt;ls -Al"
Thread.start do
while c=STDIN.getc
stdin.print c.chr
end
end
Thread.start do
while line=stderr.gets
puts ansi_red+line.chomp+ansi_clear
end
end
while c=stdout.getc
print c.chr
end
}

system "stty -cbreak"

-----------------------------------------------------------------

le script ci-dessus, fonctionne comme je le souhaite (mis à part le
message : "tcgetattr: Inappropriate ioctl for device" sur stderr)

la ligne (commentée) :
#stdin.puts "cd /mnt/fat/4tt;ls -Al"
permet d'envoyer des commandes à ssh par programme
tandis qu'en dessous, les lignes :
while c=STDIN.getc
stdin.print c.chr
end
lisent le clavier et envoient la commande à ssh.

les lignes :
while line=stderr.gets
puts ansi_red+line.chomp+ansi_clear
end
lisent stderr et affiche les erreurs en rouge.

enfin les lignes :
while c=stdout.getc
print c.chr
end
affichent le résultat de la commande. j'ai choisi getc plutôt que gets
car j'ai un parser d'escape sequences ansi derrière.

cherche du cote des pseudo-tty (pty)...
le source de la commande script(1) est un bon début pour comprendre.



oui, je l'ai téléchargé (j'ai essayé en "Cocoa" avec NSPipe et NSTask) à
partir d'un exemple très simple d'Apple "Moriarity" qui fait un find sur
une chaine mais que je ne suis pas parvenu à étendre à ssh pour une
raison que j'ignore (mon authentification avec gpg-agent ne voit pas
l'appli).

Ce que je cherche à faire :

le but est de connecter mon mac à un smartphone sous linux par ssh/scp

c'est une appli avec UI, grosso-modo, "tout" fonctionne excepté :
- l'authentification que je dois faire à part de mon UI par un/des
scripts shell (zsh) en utilisant ssh-agent/ssh-add ou en utilisant
gpg-agent et son UI pinentry-mac ;

- dans mon appli j'ai une fenêtre "psudo-terminal" qui me permet de
lancer des commandes, via ssh, sur le smart-phone, ça marche mais avec
des artifices "bidouille" du genre : time-out ou envoi de
pseudo-commandes, je pense (mis à part le pb ioctl) qu'avec le script
ci-dessus, lequel "simule" mon UI au terminal, c'est >>potentiellement<<
résolu.

en fait, j'ai pas mal pataugé avant d'obtenir un fonctionnement non
bloquant, et j'aimerais comprendre miuex ce que fait le module Open3,
même si j'intuite, je manque de base et cherche des refs afin de piger
ce fonctionnement. donc, faire quelques exercices, à part de mon appli,
en C. ou en shell.

je souhaite intégrer la gestion de ssh-agent dans mon appli (un
utilisateur n'a pas nécessairement gpg-agent et pinentry), donc à
travers une fenêtre de mon UI, demander la passphrase puis lancer
ssh-add et lui envoyer la passphrase.

je n'ai pas beaucoup progressé avec ssh-add qui me semble refuser de
fonctionner autrement qu'en command line.

c'est ce que j'espère parvenir à faire en implémentant un
pseudo-terminal comme ci-dessus.

j'ai regardé le code de pinentry qui utilise un "pipe server" du même
ordre qu'Open3 ci-dessus et une mémoire sécurisée.

en résumé, grosso-modo, je souhaite émuler une connection interactive
depuis une fenêtre de mon appli (comme on le ferait dans un terminal) et
pouvoir répondre à ssh-add (même chose +/-)...
--
Une Bévue
Publicité
Poster une réponse
Anonyme