J'ai une petite question.
Est-il normal que bash (j'utilise 4.4.11) n'affiche pas les lignes / texte séparés / fin avec plain \r
?
J'ai été un peu surpris de voir ce comportement:
$ a=$(printf "hello\ragain\rgeorge\r\n")
$ echo "$a"
george
Mais le texte "bonjour encore" est toujours là, en quelque sorte "caché":
$ echo "$a" |od -w32 -t x1c
0000000 68 65 6c 6c 6f 0d 61 67 61 69 6e 0d 67 65 6f 72 67 65 0d 0a
h e l l o \r a g a i n \r g e o r g e \r \n
Et dès que nous jouons avec bash, c'est bien ... Mais est-ce un risque potentiel pour la sécurité? Et si le contenu de la variable "a" venait du monde extérieur et incluait de "mauvaises commandes" au lieu de juste bonjour?
Un autre test, un peu incertain cette fois:
$ a=$(printf "ls;\rGeorge\n")
$ echo "$a"
George
$ eval "$a"
0 awkprof.out event-tester.log helloworld.c oneshot.sh rightclick-tester.py tmp uinput-simple.py
<directory listing appears with an error message at the end for command George>
Imaginez un caché rm
au lieu d'un caché ls
.
Même comportement lors de l'utilisation d'écho -e:
$ a=$(echo -e "ls;\rGeorge\r\n"); echo "$a"
George
Est-ce moi qui fait quelque chose de mal ...?
la source
bash
; c'est entièrement au terminal comment "afficher" le retour chariot, ou comment afficher les caractères écrasés. Par exemple, il serait parfaitement valable qu'un terminal s'affiche-\r|
comme quelque chose ressemblant à un signe plus, plutôt qu'à un simple tuyau.bash
écrit juste des octets dans un fichier; c'est à celui qui lit ces octets de les interpréter.printf
qui est un bash intégré dans la commande (bien qu'il existe aussi comme un exécutable autonome), interprète la\r
(une séquence de deux octets:0x5c
et0x72
et produit le retour de chariot (un seul octet:0x0d
.) Ensuite, oui, le terminal interprète l'octet0x0d
d'une manière particulière, mais il ne l' interprète pas la chaîne d' origine\r
.Dans le monde Unix, un retour chariot (généralement codé comme
\r
dans les langages de programmation) est un caractère de contrôle banal. Vous pouvez avoir des retours chariot à l'intérieur d'une ligne de texte, comme tout autre caractère en dehors d'un saut de ligne (également appelé retour à la ligne ), qui marque la fin d'une ligne.En particulier, dans un script bash, un retour chariot est un caractère constituant un mot ordinaire, comme les lettres et les chiffres. Tout effet spécial du retour chariot provient du terminal et non de la coque.
Un retour chariot est un caractère de contrôle . Lorsque vous l'imprimez sur un terminal, au lieu d'afficher un glyphe , le terminal effectue un effet spécial. Pour un retour chariot, l'effet spécial est de déplacer le curseur au début de la ligne courante. Ainsi, si vous imprimez une ligne contenant un retour chariot au milieu, l'effet est que la seconde moitié est écrite sur la première moitié.
Plusieurs autres caractères de contrôle ont des effets spéciaux: le caractère de retour arrière déplace le curseur vers la gauche d'une position. Le caractère de cloche amène le terminal à émettre un son ou à attirer autrement l'attention de l'utilisateur. Le personnage d'échappement commence une séquence d'échappement qui peut avoir toutes sortes d'effets spéciaux.
Si vous affichez une sortie non approuvée, vous devez nettoyer ou échapper les caractères de contrôle. Non seulement les retours chariot, mais aussi plusieurs autres, en particulier le caractère d'échappement, qui peuvent provoquer toutes sortes de mauvais effets. Voir «Attraper» un fichier peut-il représenter un risque de sécurité potentiel? et Comment éviter les attaques de séquence d'échappement dans les terminaux? pour en savoir plus sur le sujet.
la source
Vous pouvez afficher les retours chariot dans une variable bash en utilisant la
printf
fonction avec un%q
format.Sources et lectures complémentaires:
la source