Stdin et stdout

Fermé
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012 - 27 avril 2011 à 04:00
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012 - 12 mai 2011 à 19:37
Bonjour,

Pour pouvoir utiliser la commande rvlc en script, (relative aux commandes de vlc), on m'a dit que cette commande lit ses instructions de stdin et fait le output en stdout.
Seulement voilà, j'avoue que je n'ai aucune idée sur ces deux trucs en linux, (fichiers, bibliothèque ...)
Si peut m'expliquer ce dont il s'agit.
Merci pour vos réponses et bonne journée

19 réponses

mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 7 748
Modifié par mamiemando le 27/04/2011 à 08:51
Concrètement il s'agit d'un concept commun à la plupart des langages de programmation (c, shell, java...).

Sous linux, contrairement à windows, ces concepts sont visibles dans ton arborescence :
- /dev/stdout représente la sortie standard,
- /dev/stderr représente la sortie d'erreur standard,
- /dev/stdin représente l'entrée standard.

Il s'agit donc de concept modélisés par des fichiers (certes un peu spéciaux, mais des fichiers). C'est quelque chose de classique sous linux, les fichiers peuvent modéliser des concepts en plus de modéliser des fichiers ou des dossiers. Ainsi la notion de fichiers est plus vaste sous linux que sous windows.
http://www.mistra.fr/tutoriel-linux-types-fichiers.html

Quand tu lances un processus, par exemple la commande :

passwd


... qui permet de changer ton mot de passe, celle-ci te demande ton mot de passe.
- Elle écrit ce message dans stdout (ce qui le fait apparaître dans la console).
- Puis elle te demande de saisir ton ancien mot de passe. Celui-ci est lu sur stdin.
- Ensuite elle te demande ton nouveau mot de passe (message écrit sur la sortie standard), en vue de le lire sur l'entrée standard...
- Mais si tu te plantes à un moment (mot de passe incorrect, trivial etc...), un message d'erreur est écrit sur la sortie d'erreur standard (qui apparaît également sur la console, mais qui correspond bien à un autre flux).

Souvent une commande utilise implicitement l'entrée et les deux sorties standards. Quand on veut lire ou écrire ailleurs, il faut faire une redirection, ce qui se fait en shell avec les opérateurs :
- 1>, 1>> (redirection de la sortie standard), (s'écrivent aussi > et >>)
- 2>, 2>> (redirection de la sortie d'erreur standard),
- < (redirection de l'entrée standard)

Exemple :

Supposons que je fasse un fichier toto.txt contenant :

mon_ancien_mot_de_passe 
mon_nouveau_mot_de_passe 
mon_nouveau_mot_de_passe


... je peux lancer :

passwd < toto.txt 1> out.txt 2> err.txt


Ma saisie sera lue dans toto.txt au lieu du clavier. Le résultat sera dispatché entre out.txt (ce qui se passe bien) et err.txt (les erreurs).

D'ailleurs l'opérateur | qu'on voit sous linux n'est ni plus ni moins qu'une redirection d'un flux qui aurait du être écrit sur la sortie standard d'un processus P1 sur l'entrée d'un processus P2 (P1 | P2).

Exemple :

df -h 
df -h | grep tmpfs


Le processus grep ne laisse passer que les lignes qui sortent de df -h qui arrivent sur son entrée et qui contiennent tmpfs.

Est-ce que c'est plus clair ?

Bonne chance
7
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
8 mai 2011 à 13:49
Salut,

J'ai peut être un début de réponse à ton problème ;-))

Depuis hier j'ai essayé pas mal de choses, fichier en entrée, pipe, fifo, tty, pts, etc. mais sans grand succès.

A force d'écumer le web et les forums de vlc, j'ai fini par trouver les "sockets" (non pas des chaussettes ;-) ), qui combinés à la commande netcat font apparemment l'affaire.

Donc dans un terminal tu lances ton 'rvlc" comme suit :

rvlc --rc-unix=socket1
ou
vlc --intf rc --rc-unix=socket1

Et dans un autre terminal tu tapes :

echo 'add ton_fichier.flv' | nc -U socket1
CTRL+C pour sortir

Puis :

echo 'info' | nc -U socket1
CTRL+C pour sortir

Voilà, il suffit maintenant de trouver comment enchainer ces commandes et/ou comment en sortir du moins pour les enchainer. En les lançant en arrière-plan ça devrait le faire...

;-))
2
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
8 mai 2011 à 14:24
Bon je me suis amusé...

$ cat foo.sh     # Le script
#! /bin/bash

while read line
do
echo "${line}"
sleep 5
done < fich

$ cat fich     # Le fichier de commande
add never_say_no_to_panda.flv
info
stats
info
stats


$ ./foo.sh | nc -U socket1     # La commande

Bien sûr au-préalable il faut avoir lancé :
vlc --intf rc --rc-unix=socket1

Et c'est nickel, les infos arrivent toutes les 5 secondes ;-))
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
10 mai 2011 à 23:34
Bonsoir
Merci à zipe31 pour l'aide précieuse qu'il m'a fournie.
Si j'ai bien compris ton message, je dois lancer la commande
vlc --intf rc --rc-unix=socket1
dans un terminal
puis exécuter le script que tu m'as écrit.
C'est ça ??
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
10 mai 2011 à 23:40
Si j'ai bien compris ton message, je dois lancer la commande
vlc --intf rc --rc-unix=socket1
dans un terminal

Oui. Ou
rvlc --rc-unix=socket1


puis exécuter le script que tu m'as écrit.
Oui. Mais aussi adapter le fichier qui est lu dans le script à tes besoins.
Le script est à lancé comme suit :
./foo.sh | nc -U socket1

La version de "netcat" (nc) doit être la version BSD avec l'option "-U", les version de base ou GNU n'ont pas ce paramètre ;-(
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012 > albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
Modifié par albert40 le 11/05/2011 à 01:03
Dois-je comprendre que ça marche pas sur ubuntu ou bien que je dois changer un paramètre quelquepart ??
Autre chose, est-il possible avec cette méthode de rediriger le flux de sortie de la commande rvlc (via > ) ??
Le nom du fichier script est bien foo.sh ??
Est ce que je dois créer un fichier fich ??
Merci pour votre aide
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
Modifié par zipe31 le 11/05/2011 à 08:11
Dois-je comprendre que ça marche pas sur ubuntu ou bien que je dois changer un paramètre quelquepart ??
Si si ça doit marcher sur Ubuntu il n'y a pas de raison... la seule condition c'est d'avoir le paquet "netcat-openbsd" (ou similaire). Sur ma Mandriva c'était le paquet "netcat-traditional" qui était installé par défaut mais il n'avait pas l'option "-U" (pour l'usage des sockets) et il en est de même pour le paquet "netcat-gnu", donc à toi de chercher le bon paquet dans les dépôts d'Ubuntu...


Autre chose, est-il possible avec cette méthode de rediriger le flux de sortie de la commande rvlc (via > ) ??
Ça je ne sais pas. Il faut faire des test. Ce n'était pas non plus la condition de ta demande d'origine ;-\


Le nom du fichier script est bien foo.sh ??
Oui. Mais tu l'appelles comme tu veux, y compris en tant que fonction à l'intérieur d'un script, car si on se réfère à ta demande initiale, tu voulais une fonction dans un script existant. Par contre le script est à adapter à tes besoins, là je n'ai donné qu'un exemple pour illustrer la méthode et qui colle un peu à ta demande.


Est ce que je dois créer un fichier fich ??
Pas nécessairement, tu peux utiliser les redirections d'entrée depuis une variable (<<<${variable}). Par contre le fichier ou la variable devra contenir les commandes à envoyer au travers du socket...


Édit : Je viens de faire un test pour la redirection dans un fichier et apparemment ça marche :
 ./foo.sh | nc -U socket1 | tee -a fichier.log

Édit² : netcat-openbsd pour Ubuntu Oneiric
(This package contains the OpenBSD rewrite of netcat, including support for IPv6, proxies, and Unix sockets.)
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
1 mai 2011 à 01:14
Bonsoir
Tout d'abord merci pour cette longue explication ça a été vraiment très enrichissant.
Personnellement j'ai demandé des informations à propos de stdin et stdout car je veux utiliser les utliser dans un script basé sur la commande rvlc. Cette commande, issue du logiciel VLC (le célèbre) permet d'afficher sur console des informations pertinentes à propos du flux que vlc est entrain de lire. Pour la direction du flux de sortie ça a bien marché: quand je "pointe" la sortie vers un fichier texte j'obtiens mes informations sur ce fichier. Le problème qui persiste encore est l'entrée.
D'abord, un premier problème est que rvlc considère EOF comme la commande shutdown. Et donc lorsque j'ai orienté le flux d'entrée vers un fichier input qui contenait la commande help. La sortie était le résultat de cette fonction et la sortie (non désirée) du menu de rvlc.
D'un autre coté, au fait ce que je veux faire dans mon programme c'est de taper périodiquement la commande info dans rvlc.
Et là j'avoue que je ne sais pas comment m'y prendre.
Si quelqu'un peut m'aider sur ce point
0
mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 7 748
Modifié par mamiemando le 1/05/2011 à 12:05
Pour la direction du flux de sortie ça a bien marché: quand je "pointe" la sortie vers un fichier texte j'obtiens mes informations sur ce fichier. Le problème qui persiste encore est l'entrée.

Ok

D'abord, un premier problème est que rvlc considère EOF comme la commande shutdown. Et donc lorsque j'ai orienté le flux d'entrée vers un fichier input qui contenait la commande help. La sortie était le résultat de cette fonction et la sortie (non désirée) du menu de rvlc.

Ok je vois... En fait c'est assez normal comme comportement. La commande rvlc exécute les commandes qu'elle reçoit en paramètre. Quand elle n'en a plus elle considère qu'elle a fait ce qu'elle devait faire et quitte en partant du principe que dans ton script, tu veux enchaîner avec d'autres commandes shell.

En d'autres terme il ne faut pas chercher à aller à l'encontre du comportement de rvlc sur EOF car il est normal.

D'un autre coté, au fait ce que je veux faire dans mon programme c'est de taper périodiquement la commande info dans rvlc.
Et là j'avoue que je ne sais pas comment m'y prendre.
Si quelqu'un peut m'aider sur ce point


Il y a plusieurs écoles.

1) Dans ton cas tu peux écrire une boucle en shell avec un sleep qui attendra entre deux collectes de points.

# 10 jobs toutes les 2 secondes 
for i in $(seq 1 10) 
do 
  echo "job " $i 
  # ici tu appelles ta commande rvlc
  sleep 2 
done 


On peut imaginer faire une boucle infinie en réécrivant la boucle par exemple avec un while (cf tutoriel bash).

2) Autre solution tu utilises cron pour planifier ton job avec une période donnée. Lis ces trois articles au préalable :
http://doc.ubuntu-fr.org/cron
http://doc.ubuntu-fr.org/anacron
http://doc.ubuntu-fr.org/fcron

Bonne chance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
1 mai 2011 à 18:21
Ok je vois bien maintenant le comportement de rvlc et d'ailleurs ça ne pose plus problème qu'il sort du programme après.
La seule difficulté qui me reste c'est de créer la boucle.
La difficulté vient du fait que je ne dois pas seulement entrer la commande rvlc toute seule,
mais plutôt la commande rvlc, suivie d'une commande add /nom/du/flux ; suivie de info ; (et suivie notamment de shutdown ou quit)
et ça j'avoue que je ne sais pas comment m'y prendre car d'un coté :
1-si j'écris les commandes add, info dans un fichier input (dans deux lignes distinctes) lui considère le tout comme une seule commande et donc renvoie un message d'erreur et se ferme
2- Si j'essaie d'utiliser n'importe quel outil de planification de commandes disponible dans le terminal, je ne sais pas où insérer les "sous-commandes" que je veux exécuter après avoir lance rvlc (add, info ..)
Si vous pouvez m'aider sur ce point précis
0
mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 7 748
1 mai 2011 à 23:47
Ok je vois bien maintenant le comportement de rvlc et d'ailleurs ça ne pose plus problème qu'il sort du programme après.

Je pense même que tu as compris que ce n'était pas un "problème" mais le comportement que rvlc était sensé avoir ;-)

La seule difficulté qui me reste c'est de créer la boucle.[...]

1) Il suffit d'invoquer rvlc en plusieurs temps et de regarder son code d'exécution. Tout programme renvoie un code d'exécution, par convention 0 quand tout va bien et une valeur entière non nulle sinon (qui permet de retrouver dans le man la cause de l'erreur). Ton shell stocke le résultat de la dernière commande dans la variable $?.

Exemple :

(mando@aldur) (~) $ touch toto.txt
(mando@aldur) (~) $ echo $?
0
(mando@aldur) (~) $ rm toto.txt 
(mando@aldur) (~) $ echo $?
0
(mando@aldur) (~) $ rm toto.txt 
rm: impossible de supprimer « toto.txt »: Aucun fichier ou dossier de ce type
(mando@aldur) (~) $ echo $?
1


Il suffit de faire pareil avec rvlc. Concrètement le test en shell s'écrira :

#!/bin/sh

rvlc ....
if [ $? -neq 0 ]
then
  echo "La dernière commande a échoué" 1>&2
  # La valeur derrière exit correspond au code d'exécution
  # de notre programme. On quitte !
  exit 1
fi

# Fin du programme, tout va bien on quitte
exit 0


2) Dans un outil cron tu peux invoquer un script shell créé par tes soins et qui contiendra toutes les instructions que tu veux. Il n'y a donc pas de réelles contraintes non plus avec cette méthode.

Bonne chance
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
5 mai 2011 à 14:00
Bonjour
Pour la méthode utilisant Cron vous avez dit qu'il n'y a pas de réelles contraintes,; au fait ce qui m'intrigue c'est comment écrire dans le shell les "sous commandes" de rvlc (à savoir add /nom/du/fichier et la commande info)
Apparemment je ne peux pas rediriger l'entrée vers un fichier input les contenant.
Si vous avez une idée comment écire ce script
0
mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 7 748
Modifié par mamiemando le 5/05/2011 à 19:13
Méthode 1 : en injectant un fichier avec l'opérateur shell "<"

ma_commande < un_fichier_qui_contient_ce_que_j_aurais_tapé


Exemple :

On écrit dans fichier.txt

toto   
tata   
titi


... puis on lance :

grep "toto" < fichier.txt


(la grep "toto" ne laisse passer que les lignes contenant toto reçues qu'elle reçoit en entrée).

Je rappelle au passage que la capacité d'une commande à traiter /dev/stdin permet de l'utiliser dans un pipe (|), et c'est pour ça qu'on peut écrire par exemple :

cat fichier.txt | grep "toto"


Ceci signifie que pour chaque ligne du flux engendré par cat (qui va sortir de cat et entrer dans grep), grep ne laisse passer que les les lignes contenant la sous chaîne toto.

Méthode 2 : à la volée avec l'opérateur shell "<<"

ma_commande << EOF   
ce_que_j_aurais_tape1   
ce_que_j_aurais_tape2   
ce_que_j_aurais_tape3   
EOF


Exemple :

grep "toto" << EOF   
tata   
toto   
titi   
EOF


Bonne chance
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
5 mai 2011 à 21:51
Bonsoir
Malheureusement aucune ce des méthodes ne semble marcher pour le rvlc quand je mets plus d'une commande : soit dans le fichier input, soit à la volée avec l'opérateur shell.
Voilà la sortie que je récupère quand je mets un fichier input contenant deux commandes
par exemple si mon fichier input contient :
help
description

Je récuprère le message d'erreur suivant :
Error in 'help
description' libvlc's "help
description" is not a command
Unknown command 'help
description'. Type 'help' for help.

De même quand je tape
rvlc <<EOF
help
description
EOF

J'obtiens l'erreur suivante:
 Error in 'help
description' libvlc's "help
description" is not a command
Unknown command 'help
description'. Type 'help' for help.

A vrai dire ce qui m'irrite dans ce cas c'est que je n'ai besoin de faire entrer au rvlc que deux commandes. Et là je ne comprends même pas son fonctionnement vis-à-vis de la redirection de l'entrée.
J'ai aussi essayé de séparer les deux lignes par des caractères spéciaux: ";" "&&", ...
rien ne marche : il prend toujours tout le fichier comme une seule entrée.
Vous avez une solution à ce problème s'il vous plaît ??
0
mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 7 748
6 mai 2011 à 08:48
Ah mais attends j'ai peut être mélangé deux fils de discussion. Comment fais-tu pour passer des instructions à rvlc, pour moi rvlc se comportait comme une sorte de pseudo environnement dans lequel tu tapais des instructions (comme ftp, mysql etc...). Je cite :

mais plutôt la commande rvlc, suivie d'une commande add /nom/du/flux ; suivie de info ; (et suivie notamment de shutdown ou quit)

Du coup que tapes-tu exactement dans ton terminal pour le moment pour faire ceci ?
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
6 mai 2011 à 14:12
Pour faire ceci voilà ce que je fais :
Premièrement je tape rvlc dans la console et on m'affiche ceci :
VLC media player 1.1.4 The Luggage (revision exported)
Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
[0xa0b597c] [rc] lua interface: Listening on host "*console".
VLC media player 1.1.4 The Luggage
Interface de commande à distance initialisée, tapez « help » pour obtenir de l'aide.

Puis on me donne la main pour entrer une commande. Je tape après
> add /home/assia/Téléchargements/Going.flv
(remarque : il y a le symbole >)
Et on m'affiche ceci
> [flv @ 0xa0ef770]Estimating duration from bitrate, this may be inaccurate
[flv @ 0xb7215090]Estimating duration from bitrate, this may be inaccurate

Puis on me donne la main pour taper une autre commande. Là je tape
info
(ici il y a pas de symbole >)
Puis on m'affiche les infos:
+----[ Flux 0 ]
|
| Type : Vidéo
| Débit d'images : 25
| Résolution : 640x480
| Codec : H264 - MPEG-4 AVC (part 10) (avc1)
|
+----[ Flux 1 ]
|
| Type : Audio
| Fréquence d'échantillonnage: 44100 Hz
| Canaux : Stéréo
| Codec : MPEG AAC Audio (mp4a)
|
+----[ end of stream info ]

Voilà en gros ce que je fais dans la console et ce que je faire dans un script.
Une dernière question, puisque la redirection du flux d'entrée ne semble pas marcher je pense à utiliser un simulateur de clavier (xdotool ou autre). A votre avis est ce que ça pourrait marcher ??
Merci pour votre aide
0
mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 7 748
6 mai 2011 à 14:53
Ben normalement tu mets :

add /home/assia/Téléchargements/Going.flv
info


dans par exemple /home/assia/rvlc.txt et normalement ensuite :

rvlc < /home/assia/rvlc.txt


Tu peux essayer ceci aussi (ça peut marcher si rvlc est codé sur le même principe que grep) :

cat /home/assia/rvlc.txt | rvlc


Bonne chance
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
6 mai 2011 à 19:33
Bonjour
pour la première méthode voilà ce que j'obtiens comme résultat : (je ne vais copier que l'erreur)
> [0x8c6be3c] filesystem access error: cannot open file /home/assia/Téléchargements/Going.flv
info (No such file or directory)
[0x8c6be3c] main access error: La lecture du fichier a échoué 
[0x8c6be3c] main access error: VLC n'a pas pu ouvrir le fichier « /home/assia/Téléchargements/Going.flv
info ».

Sinon pour la deuxième que vous m'avez proposée voilà la sortie que je récupère :
VLC media player 1.1.4 The Luggage (revision exported)
Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
[0x9f5a7e4] [rc] lua interface: Listening on host "*console".
VLC media player 1.1.4 The Luggage
Interface de commande à distance initialisée, tapez « help » pour obtenir de l'aide.
> 

Le fonctionnement est tel que je n'ai fait que taper rvlc.
Sauf que tout ce que je tape (après > ) n'est pas pris en considération par rvlc.
0
mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 7 748
7 mai 2011 à 00:47
Bah c'est bien la première méthode qu'il faut utiliser. Et si elle plante c'est que le fichier /home/assia/Téléchargements/Going.flv n'existe pas apparemment...
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
7 mai 2011 à 01:54
Non non c'est pas que le fichier n'existe pas. C'est que rvlc lit TOUT ce qu'il y a dans le input comme une seule commande.
C'est comme ça que le rvlc marche (malheureusement). On ne peut que lui faire entrer les commandes une par une.
Actuellement je pense que malheureusement la réalisation d'un script utilisant rvlc n'est pas possible avec deux commandes. J'essaie de chercher dans d'autres pistes, comme par exemple l'utilisation des simulateurs de clavier ou bien chercher les informations que je veux via d'autres moyens: méta données d'un flux dvbs.
Si vous pouvez m'aider dans ces deux points.
0
mamiemando Messages postés 33073 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 avril 2024 7 748
7 mai 2011 à 23:59
À ce moment là invoque plusieurs fois rvlc avec dans fichier1...fichiern la bonne commande ?

for i in $(seq 1 10)
do
  #invoque rvlc < fichier1, ... rvlc < fichier10
  rvlc < fichier$i
done


Non ?
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
Modifié par albert40 le 11/05/2011 à 12:29
Bonjour zipe31
Au fait je viens de réinstaller le paquet netcat-openbsd mais malheureusement je n'arrive toujours pas à activer l'option -U. Quelle manoeuvre supplémentaire pour l'activer ??
Edit 1 : Je viens de tester ces deux "premières" commandes dans deux terminals :
rvlc --rc-unix=socket1

echo 'help' | nc -U socket1

et ça ne marche pas malheureusement. (je pense que le résultat attendu est d'écrire help dans la première console)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
11 mai 2011 à 12:22
Il n'y a rien à activer, juste l'utiliser sur la ligne de commande.

Que te renvoie la commande :

nc --help
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
11 mai 2011 à 12:30
voilà ce qu'elle me renvoie:
nc: invalid option -- '-'
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
11 mai 2011 à 12:44
Edit : et voilà ce que j'obtiens en utilisant la commande
nc -U
tout court :
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

Je dois faire quoi pour activer cette commande ??
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
11 mai 2011 à 13:10
usage: nc [-46DdhklnrSt U uvzC] [-i interval] [-P proxy_username] [-p source_port]

L'option existe.

Je dois faire quoi pour activer cette commande ??
Sûrement créer le socket avant.

Il faut lancer la commande "rvlc --rc-unix=socket1" ou "socket1" est le nom qu'on donne au socket qui sera créé pour l'occasion.
Ensuite dans un autre terminal et depuis le répertoire où a été lancée la commande précédente, lancer le script au travers du "pipe" avec la référence au socket...

Donc dans un terminal :

rvlc --rc-unix=socket1

Puis dans un autre :

cd /le_même/répertoire
./foo.sh | nc -U socket1
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
11 mai 2011 à 13:22
Tout d'abord merci pour la réponse.
Au fait ce que je fais actuellement c'est créer le socket1 (depuis le dossier personnel) et dans un autre terminal je lande la commande
echo 'help'  | nc -U socket1
(toujours depuis le dossier personnel).
Si j'ai bien compris normalement ça doit écrire help dans le premier terminal; mais malheureusement ce n'est pas le cas.
Pouvez-vous m'aider sur ce point ??
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
Modifié par zipe31 le 11/05/2011 à 18:11
Petite démonstration en direct live ;-))

En italique les commentaires
En gras les commandes
En normal l'affichage


# listing du répertoire (la vidéo, le script et le fichier de commandes) 
$ ls 
fich  foo.sh*  never_say_no_to_panda.flv 

# le contenu du script 
$ cat foo.sh  
#! /bin/bash 

while read line 
do 
echo "${line}" 
sleep 5 
done < fich 

# le contenu du fichier de commandes 
$ cat fich  
add never_say_no_to_panda.flv 
info 
stats 
quit 

# je lance vlc en mode remote command avec un socket et en arrière-plan (&) 
## dans le but de rester sur le même terminal 
$ vlc --intf rc --rc-unix=socket1 & 
[1] 5027 

# donc on voit bien le "job" qui a été créé ([1] 5027) 
$ VLC media player 1.0.6 Goldeneye
Interface de commande à distance initialisée, « h » pour obtenir de l'aide. 

# listing du répertoire avec le socket en plus (socket1=) 
$ ls 
fich  foo.sh*  never_say_no_to_panda.flv  socket1= 

# je lance le script en demandant l'affichage à l'écran en même temps  
## que la redirection dans un fichier de log (fichier.log) 
$ ./foo.sh | nc -U socket1 | tee -a fichier.log 
Trying to add never_say_no_to_panda.flv to playlist. 
add: returned 0 (no error) 
status change: ( new input: never_say_no_to_panda.flv ) 
status change: ( audio volume: 256 ) 
status change: ( play state: 3 ) 
+----[ Flux 1 ] 
|  
| Type : Audio 
| Codec : mp4a 
| Canaux : Stéréo 
| Fréquence déchantillonnage: 44100 Hz 
| Extension AAC: SBR 
|  
+----[ Flux 0 ] 
|  
| Type : Vidéo 
| Codec : h264 
| Résolution : 426x320 
| Résolution daffichage : 426x320 
| Débit dimages : 30 
|  
+----[ end of stream info ] 
+----[ begin of statistical info ] 
+-[Entrée] 
| octets lus en entrée :      304 kO 
| débit en entrée      :    269 kO/s 
| octets lus en demux  :      286 kO 
| debit en demux       :    318 kO/s 
| 
+-[Décodage vidéo] 
| vidéo décodée        :   114 
| trames affichées     :   129 
| trames perdues       :     0 
| 
+-[Décodage audio] 
| audio décodé         :   164 
| buffers joués        :   164 
| buffers perdus       :     0 
| 
+-[Diffusion] 
| paquets envoyés      :     0 
| octets envoyés       :        0 kO 
| débit émission       :      0 kO/s 
| 
+----[ end of statistical info ] 
stats: returned 0 (no error) 
quit: returned 0 (no error) 
status change: ( stop state: 0 ) 
status change: ( stop state: 0 ) 
status change: ( quit ) 
[1]+  Done                    vlc --intf rc --rc-unix=socket1 

# le script s'est achevé, les commandes ont bien été transmises y compris 
## la commande d'arrêt (quit) qui a pour effet de mettre un terme au job et  
### donc d'arrêter la vidéo 
#### nouveau listing du répertoire. Le socket n'est plus là mais le fichier de log oui. 
$ ls 
fich  fichier.log  foo.sh*  never_say_no_to_panda.flv 

# contenu du fichier de log 
$ cat fichier.log  
Trying to add never_say_no_to_panda.flv to playlist. 
add: returned 0 (no error) 
status change: ( new input: never_say_no_to_panda.flv ) 
status change: ( audio volume: 256 ) 
status change: ( play state: 3 ) 
+----[ Flux 1 ] 
|  
| Type : Audio 
| Codec : mp4a 
| Canaux : Stéréo 
| Fréquence déchantillonnage: 44100 Hz 
| Extension AAC: SBR 
|  
+----[ Flux 0 ] 
|  
| Type : Vidéo 
| Codec : h264 
| Résolution : 426x320 
| Résolution daffichage : 426x320 
| Débit dimages : 30 
|  
+----[ end of stream info ] 
+----[ begin of statistical info ] 
+-[Entrée] 
| octets lus en entrée :      304 kO 
| débit en entrée      :    269 kO/s 
| octets lus en demux  :      286 kO 
| debit en demux       :    318 kO/s 
| 
+-[Décodage vidéo] 
| vidéo décodée        :   114 
| trames affichées     :   129 
| trames perdues       :     0 
| 
+-[Décodage audio] 
| audio décodé         :   164 
| buffers joués        :   164 
| buffers perdus       :     0 
| 
+-[Diffusion] 
| paquets envoyés      :     0 
| octets envoyés       :        0 kO 
| débit émission       :      0 kO/s 
| 
+----[ end of statistical info ] 
stats: returned 0 (no error) 
quit: returned 0 (no error) 

# vérification que le job s'est bien arrêté 
$ jobs 
$

Zen my nuggets ;-)
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
11 mai 2011 à 22:52
Bonsoir
J'ai essayé de reproduire un peu ce que vous avez fait dans le dernier message et malheureusement ça ne donne pas le même résultat :(
# Premièrement le contenu du fichier :
$ ls
fich  foo.sh  Going.flv

# Le contenu de fich
$ cat fich
add Going.flv 
info 
stats 
quit

# contenu du script
$ cat foo.sh
#! /bin/bash 

while read line 
do 
echo "${line}" 
sleep 5 
done < fich 

# Je lance rvlc en second plan via la commande que tu m'as donnée
$ vlc --intf rc --rc-unix=socket1 &
[1] 3728
assia@assia-Aspire-one:~/scripting$ VLC media player 1.1.4 The Luggage (revision exported)
Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
[0x8c8cf44] [rc] lua interface: Listening on host "*console".
VLC media player 1.1.4 The Luggage
Interface de commande à distance initialisée, tapez « help » pour obtenir de l'aide.
# je lance la commande pour exécuter le script
$ ./foo.sh | nc -U socket1 | tee -a fichier.log
Malheureusement je ne récupère rien dans la sortie :(
Autre remarque: quand je tape ls comme vous l'avez fait pour voir le socket, ça ne marche que la première fois : si je lande ls une deuxième fois, le socket n'apparaît plus.
Merci pour votre aide
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
12 mai 2011 à 07:40
# je lance la commande pour exécuter le script
Avant regarde que le "socket" est bien créé.
Est-ce que ton script est exécutable au moins ?

si je lance ls une deuxième fois, le socket n'apparaît plus.
Quand ? A partir d'où ?

Avant de lancer la simulation comme je l'ai fait, essaye d'abord chaque partie individuellement pour voir si ça marche et au cas où ça bloque, essaie d'abord d'élucider chaque problème un par un avant de vouloir passer à la phase finale :-\

Commence par les étapes de ce thread et si ça marche on avisera...
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
12 mai 2011 à 15:35
Bonjour
J'ai commencé d'abord par ouvrir deux terminaux. Dans le premier terminal je tape :
$ rvlc --rc-unix=socket1
et je récupère la sortie suivante :
VLC media player 1.1.4 The Luggage (revision exported)
Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
[0x87aca44] [rc] lua interface: Listening on host "*console".
VLC media player 1.1.4 The Luggage
Interface de commande à distance initialisée, tapez « help » pour obtenir de l'aide.

Puis dans un autre terminal je tape la commande suivante :
echo 'help' | nc -U socket1

Là normalement je pense que je dois récupérer la commande help dans le premier terminal mais malheureusement ce n'est pas le cas.
Sinon pour les deux terminaux je suis dans le dossier personnel pour les deux ??
Que dois-je faire à votre avis ??
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
12 mai 2011 à 15:49
Normalement l'aide devrait s'afficher dans le 2nd terminal, celui où a été lancée la commande " echo 'help' | nc -U socket1".

Le socket est bien créé ?

Après il y a ce message qui me dérange :
Blocked: call to unsetenv("DBUS_ACTIVATION_ADDRESS")
Blocked: call to unsetenv("DBUS_ACTIVATION_BUS_TYPE")
[0x87aca44] [rc] lua interface: Listening on host "*console".

Mais je ne sais qu'en penser, ni si c'est réellement bloquant ;-(

Désolé mais là je ne sais plus quoi tenter ;-(
0
albert40 Messages postés 48 Date d'inscription vendredi 18 mars 2011 Statut Membre Dernière intervention 8 novembre 2012
12 mai 2011 à 15:57
Ok une dernière petite remarque quand même :)
la version de vlc que tu utilises est vlc 1.0.6
Est ce que tu sais comment je peux me procurer cette version ??
(apparemment c'est la seule différence qui peut être la cause ...)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
12 mai 2011 à 16:02
Je ne pense pas que la version soit un problème ;-\

http://www.videolan.org/vlc/download-ubuntu.html

Ubuntu Lucid Lynx 10.04 LTS

VLC version 1.0.6 in Ubuntu 10.04 is out-of-date. We recommend you install VLC 1.1.x manually.

If you wish to install VLC 1.0.6 anyway, please refer to the instructions above for Ubuntu 10.10. Note that there will be some bugs; you are on your own.

At your OWN risks, install VLC from PPA:
Command line way

    % sudo add-apt-repository ppa:lucid-bleed/ppa
    % sudo apt-get update
    % sudo apt-get install vlc vlc-plugin-pulse mozilla-plugin-vlc

0