Je suis bien conscient que je vais devoir décoder les différents protocole (ethernet, IPv4, ICMP), au même titre que j'ai du encodé mon packet ethernet (OSI Layer 2 oblige).
Les sources sur internet ne m'ont pas aidé et la plus part utilise directement l'icmp, pas l'ethernet.
En fait, si ce que tu souhaites faire est bien un ping (au sens ICMP), je ne pense pas qu'il soit nécessaire (ni même vraiment souhaitable d'ailleurs) de descendre jusqu'à la couche Ethernet.
Une solution à base de socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) doit fonctionner. (ce qui correspond probablement à ce que tu as trouvé sur le net ?)
Mais comme tu veux que le paquet ICMP echo sorte par la bonne interface, il suffit juste de faire un bind() de cette socket sur l'adresse IP de l'interface de sortie à utiliser. (Tu peux mettre 0 pour le port dans ce cas)
C'est d'ailleurs exactement ce que fait ping avec l'option -I chez moi (visible avec strace). Je pense que c'est l'option dont parle Neox.
Ainsi tu ne "descends" pas en dessous de la couche IP, et donc grâce au modèle OSI :
tu ne présupposes plus rien quant au type de réseau de niveau 2 (qui n'a pas à être Ethernet forcément)
si c'est de l'Ethernet, tu n'as pas à gérer des adresses MAC, il y aura résolution ARP
les 2 machines n'ont plus à être sur le même réseau de niveau 2, si demain tu insères un routeur intermédiaire par exemple
Ça pourrait déjà bien simplifier les choses, y compris pour le décodage de la réponse.
Sinon, pour voir les paquets réseau qui sortent et rentrent, rien de tel que wireshark, ou tout simplement tcpdump. Par exemple dans ton cas :
tcpdump -v -n -e icmp
En espérant ne pas répondre trop à côté de a plaque :)
je ne suis pas un spécialiste du shell, donc le reste est à prendre avec des pincettes :)
d'après le shebang, tu utilises bash
comme tu utilises le flag "/g" de sed, je suppose que tu veux remplacer toutes les occurrences et non pas seulement la première (même si dans ton cas précis ça ne change rien)
Deux petits détails, à mon avis :
sed n'est pas ce que tu cherches je pense, car il s'attend à avoir une regex et non une chaine de caractères basique (comme le fait remarquer biband)
Je suis aussi d’accord avec biband sur un autre point : tu as des soucis "d'échappement". Àmha bash, ou n'importe quel shell d'ailleurs, ne t'aide pas trop sur ce point.
Il faut noter que les doubles quotes (") et les simples quotes (') n'ont pas la même signification pour bash (cf. http://wiki.bash-hackers.org/syntax/quoting). Dans ton cas, tu aurais tout intérêt je pense à utiliser du strong quoting donc des simples quotes, pour éviter les problèmes liés au backslash, qui lui aussi a une signification spéciale.
Pour la substitution en elle-même, si on considère que sed n'est pas la solution, et que tu utilises bash, ce dernier te permet de faire une substitution basique (http://tldp.org/LDP/abs/html/string-manipulation.html - "Substring replacement")
Dernier point, je pense que le "exit" à la fin de ton script n'a pas d'effet particulier s'il n'y a plus de code derrière. Il n'est donc pas nécessaire dans ce cas.
Le script pourrait alors s'écrire :
#!/bin/bashstring1='c:\windows\toto'string2=rien
echo"remplace '$string1' par '$string2'"echo${string1//"$string1"/$string2}
mkfifo permet de créer un tube nommé : ton moyen de communication.
Le tail -f permet d'éviter la "fin de fichier" qui survient lorsque le echo ferme son côté du tube.
Si tu veux vraiment en faire quelque chose qui ressemble plus à un service, nohup peut t'intéresser aussi pour le rendre insensible à une déconnexion du terminal.
La commande pour formater est mauvaise. On formate une partition, pas le disque entier. Donc plutot sdb1 que sdb.
S'il existe une table de partition sur le device, alors je suis d'accord avec toi. Mais, ce n'est pas indispensable à priori, et sauf erreur, tu peux très bien formater directement celui-ci sans qu'il dispose d'une table de partition. Le système de fichier occupe alors la totalité de l'espace disponible et tu peux y accéder directement avec /dev/sdb par exemple.
Comme une disquette il y a quelques années finalement ;)
Several partitioning schemes are used by pre-formatted devices. There are two main schemes used by vendors. First puts file system (most commonly FAT32) directly on the device without any partitions, effectively making it start from sector 0, without any additional boot sectors, headers or partitions. Second one, uses DOS partition table (and MBR code), with single (first) partition spanning entire device. […]
Les fabricants de clés USB utiliseraient donc majoritairement, au choix, les 2 possibilités suivantes :
Un système FAT32 directement dès le premier secteur sans table de partition,
Une table de partition de type DOS, et une partition unique utilisant l'espace complet.
Elle n'est plus reconnue ailleurs non plus, ni la chaine ni Windows… (mais ça c'était prévisible ;) )
Ça ne sent pas très bon tout ça :)
Personnellement, vu le prix d'une clé USB aujourd'hui, je ne prendrais pas de risque avec une clé en laquelle je n'ai plus confiance : je la remplacerais.
Quitte à continuer de chercher / bricoler par ailleurs sur celle qui est défectueuse :)
Est-ce que la clé fonctionne toujours sur la chaîne hifi, ou sur une autre machine / os ?
Comme le suggère lolop, elle est peut-être défectueuse tout simplement :(
Par curiosité, quel résultat donne la commande suivante, quand la clé est branchée ? :
stat /dev/sdb
En vérifiant qu'elle n'est pas déjà montée, on ne sait jamais (liste obtenue avec mount), tu peux tenter de remettre à zéro le premier secteur, puis recréer une table de partitions (mais ça sent aussi le "Aucun médium trouvé" à plein nez…)
dd if=/dev/zero of=/dev/sdb bs=512 count=1
fdisk /dev/sdb
-> o w
Attention encore une fois : si ces manips sont faites sur le mauvais disque, ça peut faire mal !
Enfin, es-tu sûr qu'il n'y a pas de messages d'erreur dans dmesg après l'affichage d'un "aucun médium trouvé" ?
/dev/sdb: DOS/MBR boot sector
/dev/stdin: Microsoft Windows XP/VISTA bootloader BOOTMGR
As-tu des messages d'erreurs d'entrées / sorties dans dmesg ?
Sinon, si tu ne souhaites pas récupérer les éventuelles données sur ta clé, tu peux essayer de la formater en vfat par exemple pour repartir proprement :
mkfs.vfat /dev/sdb
Attention, évidemment :
--> S'assurer que c'est bien ta clé USB qui est en /dev/sdb et non pas un autre disque !
La plupart du temps, le plus simple est de regarder la page de manuel associée à la commande.
Sur ma distribution par exemple, la commande man scp me donne entre autres :
-p Preserves modification times, access times, and modes from the original file.
Donc pour répondre à ta question, cette commande permet en effet de conserver les dates et heures de modification, mais aussi les modes (Par exemple droits en écriture / lecture / exécution cf. man chmod).
En revanche, je pense que le propriétaire et le groupe des fichiers copiés ne sont pas ceux de la machine depuis laquelle tu fais la copie, mais correspondent au compte que tu utilises pour te connecter à la machine distante via scp.
Par exemple, si l'utilisateur toto qui veut copier le fichier fichier1 sur la machine host fait la commande suivante :
scp -p fichier1 tutu@host:/tmp
Alors le propriétaire du fichier1 copié sur host dans /tmp ne sera pas toto, mais tutu.
La notion "d'utilisateur commun" n'existe donc pas.
[^] # Re: le Principe...
Posté par bernie . En réponse au message [Résolut] Recevoir une réponse a mon ping (en C). Évalué à 1.
En relisant mieux la question, je me rends compte que j'ai plutôt bien réussi à répondre à côté de la plaque :)
Donc on oublie ma réponse précédente, désolé pour le bruit…
[^] # Re: le Principe...
Posté par bernie . En réponse au message [Résolut] Recevoir une réponse a mon ping (en C). Évalué à 3.
Bonjour alpha_one_x86,
En fait, si ce que tu souhaites faire est bien un ping (au sens ICMP), je ne pense pas qu'il soit nécessaire (ni même vraiment souhaitable d'ailleurs) de descendre jusqu'à la couche Ethernet.
Une solution à base de
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
doit fonctionner. (ce qui correspond probablement à ce que tu as trouvé sur le net ?)Mais comme tu veux que le paquet ICMP echo sorte par la bonne interface, il suffit juste de faire un
bind()
de cette socket sur l'adresse IP de l'interface de sortie à utiliser. (Tu peux mettre0
pour le port dans ce cas)C'est d'ailleurs exactement ce que fait ping avec l'option
-I
chez moi (visible avec strace). Je pense que c'est l'option dont parle Neox.Ainsi tu ne "descends" pas en dessous de la couche IP, et donc grâce au modèle OSI :
Ça pourrait déjà bien simplifier les choses, y compris pour le décodage de la réponse.
Sinon, pour voir les paquets réseau qui sortent et rentrent, rien de tel que wireshark, ou tout simplement tcpdump. Par exemple dans ton cas :
En espérant ne pas répondre trop à côté de a plaque :)
# Autre approche, toujours avec bash
Posté par bernie . En réponse au message Problème avec les antislash et sed. Évalué à 4.
Salut Kangs,
je ne suis pas un spécialiste du shell, donc le reste est à prendre avec des pincettes :)
Deux petits détails, à mon avis :
Il faut noter que les doubles quotes (") et les simples quotes (') n'ont pas la même signification pour bash (cf. http://wiki.bash-hackers.org/syntax/quoting). Dans ton cas, tu aurais tout intérêt je pense à utiliser du strong quoting donc des simples quotes, pour éviter les problèmes liés au backslash, qui lui aussi a une signification spéciale.
Pour la substitution en elle-même, si on considère que sed n'est pas la solution, et que tu utilises bash, ce dernier te permet de faire une substitution basique (http://tldp.org/LDP/abs/html/string-manipulation.html - "Substring replacement")
Dernier point, je pense que le "exit" à la fin de ton script n'a pas d'effet particulier s'il n'y a plus de code derrière. Il n'est donc pas nécessaire dans ce cas.
Le script pourrait alors s'écrire :
Résultat :
# mkfifo + tail -f ?
Posté par bernie . En réponse au message exposer un script comme un service. Évalué à 3.
Cela pourrait peut-être faire l'affaire :
mkfifo permet de créer un tube nommé : ton moyen de communication.
Le tail -f permet d'éviter la "fin de fichier" qui survient lorsque le echo ferme son côté du tube.
Si tu veux vraiment en faire quelque chose qui ressemble plus à un service, nohup peut t'intéresser aussi pour le rendre insensible à une déconnexion du terminal.
[^] # Re: Système de fichier ?
Posté par bernie . En réponse au message Formater une clé USB non reconnue.... Évalué à 2. Dernière modification le 24 février 2014 à 11:13.
S'il existe une table de partition sur le device, alors je suis d'accord avec toi. Mais, ce n'est pas indispensable à priori, et sauf erreur, tu peux très bien formater directement celui-ci sans qu'il dispose d'une table de partition. Le système de fichier occupe alors la totalité de l'espace disponible et tu peux y accéder directement avec /dev/sdb par exemple.
Comme une disquette il y a quelques années finalement ;)
D'après [Wikipedia]
Les fabricants de clés USB utiliseraient donc majoritairement, au choix, les 2 possibilités suivantes :
[^] # Re: Système de fichier ?
Posté par bernie . En réponse au message Formater une clé USB non reconnue.... Évalué à 1.
Ça ne sent pas très bon tout ça :)
Personnellement, vu le prix d'une clé USB aujourd'hui, je ne prendrais pas de risque avec une clé en laquelle je n'ai plus confiance : je la remplacerais.
Quitte à continuer de chercher / bricoler par ailleurs sur celle qui est défectueuse :)
[^] # Re: Système de fichier ?
Posté par bernie . En réponse au message Formater une clé USB non reconnue.... Évalué à 1.
Est-ce que la clé fonctionne toujours sur la chaîne hifi, ou sur une autre machine / os ?
Comme le suggère lolop, elle est peut-être défectueuse tout simplement :(
Attention encore une fois : si ces manips sont faites sur le mauvais disque, ça peut faire mal !
# Système de fichier ?
Posté par bernie . En réponse au message Formater une clé USB non reconnue.... Évalué à 2. Dernière modification le 23 février 2014 à 15:03.
Bonjour,
Que donnent les commandes :
Chez moi, par exemple j'obtiens :
As-tu des messages d'erreurs d'entrées / sorties dans dmesg ?
Sinon, si tu ne souhaites pas récupérer les éventuelles données sur ta clé, tu peux essayer de la formater en vfat par exemple pour repartir proprement :
Attention, évidemment :
--> S'assurer que c'est bien ta clé USB qui est en /dev/sdb et non pas un autre disque !
# Ton nouvel ami : man
Posté par bernie . En réponse au message Demande de confirmation sur un argument de la commande "scp". Évalué à 1.
Bonjour,
La plupart du temps, le plus simple est de regarder la page de manuel associée à la commande.
Sur ma distribution par exemple, la commande
man scp
me donne entre autres :Donc pour répondre à ta question, cette commande permet en effet de conserver les dates et heures de modification, mais aussi les modes (Par exemple droits en écriture / lecture / exécution cf. man chmod).
En revanche, je pense que le propriétaire et le groupe des fichiers copiés ne sont pas ceux de la machine depuis laquelle tu fais la copie, mais correspondent au compte que tu utilises pour te connecter à la machine distante via scp.
Par exemple, si l'utilisateur toto qui veut copier le fichier
fichier1
sur la machinehost
fait la commande suivante :Alors le propriétaire du
fichier1
copié surhost
dans/tmp
ne sera pas toto, mais tutu.La notion "d'utilisateur commun" n'existe donc pas.
En espérant répondre à ta question
# lsb_release
Posté par bernie . En réponse au message commande de reconnaissance de la distribution hôte. Évalué à 6.
lsb_release pourrait probablement faire l'affaire :
C'est peut-être même relativement standard :
http://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/lsbrelease.html