IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Netcat : Problème de compréhension ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Par défaut Netcat : Problème de compréhension ?
    Bonjour,

    Je suis en train de réaliser un petit programme pour me familiariser avec la commande netcat. Je débute en bash et tout n'est pas très claire!
    En fait je veux créer un programme qui permet d'interroger un serveur avec des commandes basiques (afficher les fichiers distants, upload, recherche...).

    J'informe l'utilisateur que la commande est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect mode ip port [fichier]
    3 modes :
    • afficher : affiche la liste des fichiers du serveur distant
    • upload (parametre fichier necessaire) : upload le fichier sur le serveur distant
    • recherche (parametre fichier necessaire) : recherche sur le serveur distant si le fichier existe

    Puis je lui demande de faire une saisie que j'interprète à l'aide d'un sed pour extraire dans des variables différentes les informations mode, ip, port et fichier.

    J'ai ouvert deux terminaux, dans le premier je crée un serveur local sur le port 8080 (dans home/users/moi/serveur):
    et dans le deuxième (/home/users/moi/client) j'exécute mon programme.

    Admettons que je saisisse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect afficher localhost 8080
    .
    Ma question : pourquoi ma ligne n'affiche pas les fichiers de home/users/moi/serveur ?

    Merci beaucoup.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    cette commande dirige la sortie standard de nc vers l'entrée standard de ls :


    celle-ci envoie la commande ls -l vers nc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nc $ip $port <<eof
    ls -l
    eof
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Par défaut
    Bonjour,

    Merci pour cette précision, je comprends, je prenais le problème à l'envers...

    Du coup devrait me renvoyer la liste des fichiers du serveur distant ? pourtant non... comme si ls -l n'était pas interpréter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./programme.sh: line 9: ls: No such file or directory

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    pourquoi modifier la ligne que j'ai donnée ?

    quel interpréteur de commande utilises-tu ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Par défaut
    Voici mon fichier modeafficher.sh qui s'occupe de gérer le mode "afficher" (ce script est normalement appelé par le fichier "main" de mon programme) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #/bin/bash
    ip=$1
    port=$2
    echo "Connexion au serveur $ip:$port ..."
    nc $ip $port <ls -l
    Dans un premier terminal, je crée un serveur local (nc -l 8080)
    Dans le deuxième : ./modeafficher.sh localhost 8080

    et le terminal me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./modeafficher.sh: line 9: ls: No such file or directory

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    < envoie le contenu d'un fichier vers l'entrée standard d'une commande. (il faut lire un tuto !)

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    nc $ip $port < <(ls -l)
    cf. man bash /Substitution de processus
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Par défaut
    Salut,

    Effectivement encore une erreur de ma part.

    Cependant pourquoi remplaces-tu $ip et $port par -ip et -port ?

    De plus, je ne sais pas pourquoi, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nc $ip $port < <(ls -l)
    n'affiche pas les fichiers du serveur distant. Je suis un peu perdu!

  8. #8
    Membre confirmé Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Par défaut
    Bonjour,

    As-tu essayé avec la première solution proposée par N_Bah?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nc -ip -port <<eof
    ls -l
    eof

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Par défaut
    Bonjour,

    Oui, ca ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nc : interval cannot be negative

  10. #10
    Membre confirmé Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Par défaut
    Tu as bien remplacé les "-" par des "$" ?

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Par défaut
    Après une petite après midi de recherche et de compréhension, je suis parvenu a faire ce que je voulais! Ces concepts sont maintenant plus claires dans ma tête!

    Effectivement, j'ai gardé le code ci-dessus, et j'ai créé un serveur qui interprète les commandes qu'on lui envoie à l'aide d'un tube :

    Lancement du serveur à l'aide de : netcat -l -p 8080 < tmp | ./serveur.sh > tmp

    Code serveur.sh : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while read cmd
    do
        if [[ $cmd == "ls" ]]; then
            echo "Fichiers sur le serveur : "
            ls
        fi
    done
    .

    Maintenant que j'arrive à "communiquer" avec mon serveur, comment je peux faire pour travailler sur des fichiers distants ?
    Actuellement j'arrive à afficher des fichiers distants, me balader dans l'arboresence distante, mais si je veux par exemple faire une recherche dans un fichier, ou meme modifier un fichier, je ne vois pas du tout comment faire à l'aide de netcat et d'un tube.

    Vous auriez quelques pistes ?

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Cependant pourquoi remplaces-tu $ip et $port par -ip et -port ?
    aucune idée
    un copier-coller irréfléchi ?

    mais c'est bien $, j'ai corrigé, désolé.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Membre confirmé Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Par défaut
    Mon dieu, je viens de te rédiger un beau message, et au moment de valider, demande d'authentification (alors que c'était déjà fait), et ensuite erreur web...

    Bon ben je recommence

    Donc je disais que je suis novice, mais que ma réponse permettra au moins de up ton sujet !

    Concernant la solution que tu nous as communiqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while read cmd
    do
        if [[ $cmd == "ls" ]]; then
            echo "Fichiers sur le serveur : "
            ls
        fi
    done
    Visiblement, tu liste les "commandes" que le client peut éventuellement envoyer au serveur et tu les interprètes.
    Je connais pas netcat, mais concernant la communication serveur/client, d'après moi, ça pue un peu si je peux me permettre.

    J'aimerais donc revenir sur la première solution proposée. Je pense avoir la réponse !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nc $ip $port <<< (ls -l)
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nc $ip $port << EOF
    ls -l
    EOF
    Mais un unique < ne peut pas fonctionner. Pourquoi
    En gros, si on résume les 3 opérateurs de redirection d'entrée :

    • < nom_de_fichier envoie le contenu du fichier "nom_de_fichier" ;
    • <<EOF envoie le contenu des lignes suivante (jusqu'au prochain EOF) ;
    • <<< expression envoie "expression".


    Je voudrais justement souligner que pour le cours présent sur le site (clin d'oeil à Idriss si tu nous lis), il manque un gros chapitre sur les redirections des entrées et sorties (<, >, et |). C'est dommage car il me semble que ça envoi du lourd

    Voilà, j'espère que ça aide, sinon corrigez moi

  14. #14
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour,

    En gros, si on résume les 3 opérateurs de redirection d'entrée :

    < nom_de_fichier envoie le contenu du fichier "nom_de_fichier" ;
    <<EOF envoie le contenu des lignes suivante (jusqu'au prochain EOF) ;
    <<< expression envoie "expression".
    J'aimerais en rajouter une 4ème: la substitution de processus.
    < <(commande) récupère la sortie de commande et la considère comme un fichier réinjecté en entrée.

  15. #15
    Membre confirmé Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    J'aimerais en rajouter une 4ème: la substitution de processus.
    < <(commande) récupère la sortie de commande et la considère comme un fichier réinjecté en entrée.
    Comme quoi, y en a des choses à dire là dessus

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Par défaut
    Salut,

    Merci nanooby pour ta réponse.

    Citation Envoyé par nanooby Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nc $ip $port <<< (ls -l)
    Je viens de faire un test, ça ne fonctionne pas chez moi. Ça marche chez toi ?

    Sinon, je viens de tester , ça fonctionne mais pas dans le bon sens :
    1 : je lance un serveur sur mon terminal "serveur" (/home/moi/serveur)
    2 : j'exécute cette commande dans mon terminal "client"(/home/moi/client)
    Résultat : la liste des fichiers du dossier client s'affiche dans le terminal serveur! Or je voudrai l'inverse : afficher la liste des fichiers du dossier serveur dans le terminal client.

    Du coup, j'ai essayé aussi de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo `nc $1 $2 < <(ls -l)`
    mais le résultat est identique, tout s'affiche dans le terminal serveur, et j'ai une ligne vide dans le terminal client...
    une idée ?

  17. #17
    Membre confirmé Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Par défaut
    J'ai eu le même soucis dans mes vieux TP, je cherche, si je trouve je te post ça de suite

    Edit : Pour le <<<, on peut essayer de faire la même chose avec des pipes :

    Edit2 : le proxy bloque dropbox, j'ai pas accès à mes cours/TD/TP
    Si personne ne te réponds d'ici là, je chercherai ce soir

    Edit3 : lors de mes TP, on utilisait des sockets. Je ne connais pas netcat, mais pour les sockets, le principe était de lancer la commande sur le serveur, mais d'en rediriger la sortie vers la socket pour faire l'affichage côté client. Essayes de bien regarder la commande netcat, et de chercher un bon tuto

  18. #18
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    ???
    côté client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    portRecept=12345
    portEnvoi=1234
    nc -l -p $portRecept >/chemin/fichier.log &
    nc $adrServeur $portEnvoi <<<'ls'
    cat /chemin/fichier.log
    côté serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    portRecept=1234
    portEnvoi=12345
    nc -l -p $portRecept | sh | nc $adrClient $portEnvoi
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  19. #19
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 15
    Par défaut
    Bonjour bonjour,

    @nanooby merci beaucoup pour tes recherches! Effectivement c'est peut-être un moyen, mais j'aimerai bien faire ça avec netcat..si jamais je ne parviens à rien je me tournerai vers les sockets.

    @N_Bah: Merci pour ces lignes. Pas sûr d'avoir tout compris, peux tu confirmer ?
    1 (client) on enregistre tout ce qui arrive par le port de reception dans fichier.log
    2 (client) on envoie une commande, par exemple 'ls'
    3 (serveur) on reçoit ce qui arrive (ici 'ls'), on traite, et on redirige vers le port de sortie
    4 (client) la sortie de 'ls' arrive dans fichier.log
    5 (client) on affiche fichier.log

    Du coup j'ai essayé d'implémenter ca avec deux terminaux, mais j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nc: Adress already in use
    Je ne savais pas bien quoi mettre pour $adrClient et $adrServeur , du coup vu que c'est la même machine j'ai mis 'localhost' pour les deux. Je pense que le souci vient là... vrai?

  20. #20
    Membre confirmé Avatar de nanooby
    Homme Profil pro
    IT Consultant
    Inscrit en
    Mai 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : IT Consultant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2014
    Messages : 103
    Par défaut
    Je dirais plutôt que c'est l'un des ports que tu utilises pour l'adresse localhost qui est déjà utilisé par un autre processus

Discussions similaires

  1. [Débutant] problème de compréhension
    Par Sylvester dans le forum Général Java
    Réponses: 18
    Dernier message: 21/07/2005, 09h16
  2. Réponses: 5
    Dernier message: 11/04/2005, 10h21
  3. [C#] Problème de compréhension de System.Convert ET Provider
    Par papouAlain dans le forum Windows Forms
    Réponses: 5
    Dernier message: 18/11/2004, 21h52
  4. onclipevent (problème de compréhension)
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 24/09/2003, 15h09
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo