OVH Cloud OVH Cloud

sortie d'un telnet

13 réponses
Avatar
Fred
Bonjour,

j'ai un petit soucis avec telnet.

Je souhaite rediriger la sortie complète vers un fichier résultat.
J'obtiens un résultat satisfaisant avec telnet toto > résultat
Cependant, à la fin de mon script, j'ai la ligne "Connection closed by
foreign host" qui s'affiche.
Je la trouve interessante car dans le cas où le routeur distant ne
répond pas au telnet, la ligne suivante s'affiche :telnet: connect to
address 10.33.21.24: No route to host
mais pas dans le fichier résultat...

Comment faire pour récupérer cette ligne dans mon fichier résultat ?

Merci beaucoup

Fred

10 réponses

1 2
Avatar
Jean-Jacques Puig
On 2004-02-05, Fred wrote:
Bonjour,

j'ai un petit soucis avec telnet.

Je souhaite rediriger la sortie complète vers un fichier résultat.
J'obtiens un résultat satisfaisant avec telnet toto > résultat
Cependant, à la fin de mon script, j'ai la ligne "Connection closed by
foreign host" qui s'affiche.
Je la trouve interessante car dans le cas où le routeur distant ne
répond pas au telnet, la ligne suivante s'affiche :telnet: connect to
address 10.33.21.24: No route to host
mais pas dans le fichier résultat...

Comment faire pour récupérer cette ligne dans mon fichier résultat ?


Je ne suis pas sûr que ma réponse correspondra exactement à ton attente,
mais tu peux essayer de récupérer aussi la sortie d'erreur.

Un truc du genre 'telnet toto 2>&1 1> resultat' pourrait marcher.

--
Jean-Jacques Puig

[homepage] http://www-lor.int-evry.fr/~puig/

Avatar
Denis L'Excellent
Fred wrote:

Comment faire pour récupérer cette ligne dans mon fichier résultat ?

Merci beaucoup

Fred


Tu tapes telnet toto > résultat 2> résultat pour rediriger aussi les
erreurs dans ton fichier (le pointeur 2 désignant la sortie standard en
erreur qui par défaut est ta console)

--
AAB Lyon 2003
Sans L'Excellence ...

Avatar
Stephane Chazelas
2004-02-5, 10:27(+00), Jean-Jacques Puig:
[...]
Un truc du genre 'telnet toto 2>&1 1> resultat' pourrait marcher.


Non, ça ça redirige la sortie d'erreur vers la sortie standard
(le terminal à ce moment là), puis, la sortie standard vers
"resultat".

telnet toto > resultat 2>&1

(voir aussi la commande script).

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Stephane Chazelas
2004-02-05, 11:29(+01), Denis L'Excellent:
[...]
Tu tapes telnet toto > résultat 2> résultat pour rediriger aussi les
erreurs dans ton fichier (le pointeur 2 désignant la sortie standard en
erreur qui par défaut est ta console)


Non, ça, ça ouvre le fichier deux fois, donc, les messages de
stdout et stderr vont se marcher dessus (en gros ya deux
curseurs indépendants sur le même fichier).

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Denis L'Excellent
Stephane Chazelas wrote:

2004-02-05, 11:29(+01), Denis L'Excellent:
[...]
Tu tapes telnet toto > résultat 2> résultat pour rediriger aussi les
erreurs dans ton fichier (le pointeur 2 désignant la sortie standard en
erreur qui par défaut est ta console)


Non, ça, ça ouvre le fichier deux fois, donc, les messages de
stdout et stderr vont se marcher dessus (en gros ya deux
curseurs indépendants sur le même fichier).


Rhoo la honte, désolé, je ne répondrais plus, il y a des gens bien mieux
placés que moi pour ça ....

--
AAB Lyon 2003
Sans L'Excellence ...


Avatar
Nicolas.MICHEL
Stephane Chazelas wrote:

2004-02-5, 10:27(+00), Jean-Jacques Puig:
[...]
Un truc du genre 'telnet toto 2>&1 1> resultat' pourrait marcher.


Non, ça ça redirige la sortie d'erreur vers la sortie standard
(le terminal à ce moment là), puis, la sortie standard vers
"resultat".

telnet toto > resultat 2>&1

(voir aussi la commande script).


si je comprends bien, bash évalues les redirections de droite à gauche ?

Donc dans le poste de Hugolino, le mois dernier,
Message-ID:
à la question "que fait :
/etc/init.d/fetchmail awaken >/dev/null 2>&1 || /etc/init.d/fetchmail
start"

il commence par exécuter fetchmail awaken , puis il lance fetchmail
start s'il y a une erreur, puis il redirige l'erreur sur stdout, puis il
envoie stdout (stderr inclus) vers /dev/null ?

Si c'est ça, alors j'ai compris le principes :)
--
S'il n'y a pas de solutions, c'est qu'il n'y a pas de problèmes
iChat/AIM : michelnicolas


Avatar
Stephane Chazelas
2004-02-5, 13:31(+01), Nicolas MICHEL:
[...]
telnet toto > resultat 2>&1

(voir aussi la commande script).


si je comprends bien, bash évalues les redirections de droite à gauche ?


??? Ben non, de gauche à droite (attention, le '|' n'est pas
(qu')un opérateur de redirection). On le refait au ralenti:

Dans cmd > file 2>&1

Au départ:
fd1 (stdout) associé au terminal
fd2 (stderr) associé au terminal

puis, après "> file"
fd1 (stdout) associé au fichier "file"
fd2 (stderr) pas changé (terminal)

pui, après "2>&1"
fd1 (stdout) pas changé ("file")
fd2 (stderr) associé à la même chose que 1 (&1), c'est à dire
"file" [internally au moyen d'une dupplication de fd, ce qui
fait qu'un seul curseur sur le fichier est partagé pour les fd 1
et 2].

Si ça avait été lu à l'envers, on aurait eu: fd2 associé à la
même chose que 1 (terminal), puis fd 1 associé (re-affecté, ça
n'influe pas sur ce sur quoi est ouvert le fd 2) au fichier
"file".

[...]
Si c'est ça, alors j'ai compris le principes :)


C'était pas ça.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]


Avatar
Fred
Merci beaucoup, ca fonctionne très bien

fred

2004-02-5, 13:31(+01), Nicolas MICHEL:
[...]

telnet toto > resultat 2>&1

(voir aussi la commande script).


si je comprends bien, bash évalues les redirections de droite à gauche ?



??? Ben non, de gauche à droite (attention, le '|' n'est pas
(qu')un opérateur de redirection). On le refait au ralenti:

Dans cmd > file 2>&1

Au départ:
fd1 (stdout) associé au terminal
fd2 (stderr) associé au terminal

puis, après "> file"
fd1 (stdout) associé au fichier "file"
fd2 (stderr) pas changé (terminal)

pui, après "2>&1"
fd1 (stdout) pas changé ("file")
fd2 (stderr) associé à la même chose que 1 (&1), c'est à dire
"file" [internally au moyen d'une dupplication de fd, ce qui
fait qu'un seul curseur sur le fichier est partagé pour les fd 1
et 2].

Si ça avait été lu à l'envers, on aurait eu: fd2 associé à la
même chose que 1 (terminal), puis fd 1 associé (re-affecté, ça
n'influe pas sur ce sur quoi est ouvert le fd 2) au fichier
"file".

[...]

Si c'est ça, alors j'ai compris le principes :)



C'était pas ça.





Avatar
Nicolas.MICHEL
Stephane Chazelas wrote:

pui, après "2>&1"
fd1 (stdout) pas changé ("file")
fd2 (stderr) associé à la même chose que 1 (&1), c'est à dire
"file" [internally au moyen d'une dupplication de fd, ce qui
fait qu'un seul curseur sur le fichier est partagé pour les fd 1
et 2].


ok, là je comprends mieux.
2>&1 envoie stderr (/dev/fd/2 chez moi) non-pas sur stdout, mais sur la
même dirrection que lui. Il y a donc "deux flux" allant au même endroit,
et non "un flux" contennant à la fois stdout et stderr.

Celà n'explique pas ce que fait le || dans ce cas :
commande >/dev/null 2>&1 || autre commande
mais je suppose qu'il dévie le flux d'erreur qui allait vers /dev/null
pour le lire et l'envoyer ensuite là où il allait précédement, soit sur
/dev/null ?

--
S'il n'y a pas de solutions, c'est qu'il n'y a pas de problèmes
iChat/AIM : michelnicolas

Avatar
Stephane Chazelas
2004-02-5, 16:54(+01), Nicolas MICHEL:
[...]
Celà n'explique pas ce que fait le || dans ce cas :
commande >/dev/null 2>&1 || autre commande
[...]


Pour le coup, "||" n'a rien à voir avec un opérateur de
redirection.

"> file 2>&1", c'est comme d'hab, (redirige stdout et stderr de
cmd1 sur une ouverture en écriture de /dev/null)

"||", ça a rapport avec les codes de retour (l'exit status
envoyé lors du exit(), et récupéré par le shell par un waitpid)
pas les file descriptors.

cmd1 || cmd2

(deux commandes avec chacunes leurs redirections if any)

Le shell lance cmd1, attend qu'elle se termine, récupère son
exit status. Et ssi ce exit status est différent de 0, alors il
lance cmd2 (avec && c'est si exit status == 0). Attention, dans:

cmd1 || cmd2 && cmd3

faut lire

( cmd1 || cmd2 ) && cmd3

c.a.d. que si l'exit status de cmd1 est 0, cmd2 n'est pas lancé,
mais cmd3 si (&& et || sont d'égale precedence).

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

1 2