Re: [#!/fr] [HS?]ssh émulation de terminal

Page principale
Supprimer ce message
Répondre à ce message
Auteur: Yvon Thoraval
Date:  
À: La liste francophone des scripts shell
Sujet: Re: [#!/fr] [HS?]ssh émulation de terminal
Le 3 septembre 2008 17:48, Frédéric Goudal <goudal@???> a écrit :
> Il me semblait qu'il y avait des implémentations avec divers langage (perl
> au moins me semble-t-il)..


Exact, il y a deux wrappers l'un pour python, l'autre pour Perl.
Mais, amha, tcl reste nécessaire.

ce que fait Expect, en fait, je sais le faire avec Ruby.
avec Expect, pour chaque commande on a 2/3 phases :
on envoie la commande et on reçoit le résultat, l'attente de résultat
s'arretant sur la string "expectée", par exemple le prompt.

j'ai une version de mon prog (en RubyCocoa) qui marche comme ça :
j'envoie une commande et, comme je ne sais comment détecter la fin du
résultat j'envoie une commande "bidon" :

echo END_OF_COMMAND

je détecte cette string "END_OF_COMMAND " et je sais que je peux
envoyer une autre commande.

en fait, je pense que ce qu'il me manque, c'est "l'art et la manière"
de configurer tty.

par exemple, avec telnet, ma connection marche "presque" comme en
interactif avec Terminal.app, j'obtiens tout ce que je veux :
le prompt, la colorisation (fichier, dir, symlink), les messages de
login et logout avec très peu de code :

------------------------------------------------------------------------
#! /usr/bin/env ruby

require 'open3'

ansi_red="\e[31m"
ansi_clear="\e[0m"
#system "stty -echo isig"
Open3.popen3("telnet -l root 169.254.0.2 23") { |stdin, stdout, stderr|
  stdin.sync=true
  #stdout.sync=true
  Thread.start do
    while line = gets
      stdin.print line
    end
  end
  Thread.start do
    while line=stderr.gets
      puts ansi_red+line.chomp+ansi_clear
    end
  end
  #stdin.puts "ls -al"
  #stdin.puts "cd /mnt/fat/4tt"
  #stdin.puts "ls -al"
  #stdin.puts "exit"
  while line = stdout.gets
    print line
  end
}
#system "stty echo -isig"
------------------------------------------------------------------------


mais, avec ssh (dans le code ci-dessus, il suffit de remplacer "telnet
-l root 169.254.0.2 23" par "ssh -t TT" (TT est dans la config ; même
ip que telnet), je peux toujours être en interactif comme en direct
avec Terminal.app avec le gros bémol que, ssh me disant :
Pseudo-terminal will not be allocated because stdin is not a terminal.
(sans doute est-ce pour éviter un trou de sécurité...)
je n'ai plus ni prompt ni colorisation ni message de logout.


--
yvon
_______________________________________________
archives :
http://listes.patpro.net/list/sshfr.fr.html
http://listes.patpro.net/mailman/listinfo/script_shell_fr