Ich habe eine kurze Frage.
Ist es normal, dass bash (ich verwende 4.4.11) keine Zeilen / Texte anzeigt, die getrennt sind / mit Plain enden \r
?
Ich war etwas überrascht, dieses Verhalten zu sehen:
$ a=$(printf "hello\ragain\rgeorge\r\n")
$ echo "$a"
george
Aber "Hallo nochmal" Text ist immer noch da, irgendwie "versteckt":
$ 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
Und sobald wir nur mit Bash spielen, ist das in Ordnung ... Aber ist dies ein potenzielles Sicherheitsrisiko? Was ist, wenn der Inhalt der Variablen "a" aus der Außenwelt stammt und "schlechte Befehle" enthält, anstatt nur Hallo?
Ein weiterer Test, diesmal etwas unsicher:
$ 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>
Stellen Sie sich ein verstecktes rm
statt eines versteckten vor ls
.
Gleiches Verhalten bei Verwendung von echo -e:
$ a=$(echo -e "ls;\rGeorge\r\n"); echo "$a"
George
Bin ich es, der etwas falsch macht ...?
quelle
bash
hat. Es liegt ganz beim Terminal, wie der Wagenrücklauf "angezeigt" wird oder wie die überschriebenen Zeichen angezeigt werden. Zum Beispiel wäre es durchaus gültig, wenn ein Terminal-\r|
als etwas angezeigt würde, das einem Pluszeichen ähnelt, und nicht nur als Pipe.bash
schreibt nur Bytes in eine Datei; Es liegt an jedem, der diese Bytes liest, sie zu interpretieren.printf
, die ein bash Befehl eingebaut ist (auch wenn es existiert auch als eigenständiges ausführbaren), interpretiert die\r
(eine Folge von zwei Bytes0x5c
und0x72
und erzeugt den Wagenrücklauf (ein Byte:0x0d
.) Dann, ja, das Endgerät interpretiert das Byte0x0d
auf besondere Weise, interpretiert aber nicht die ursprüngliche Zeichenfolge\r
.In der Unix-Welt ist ein Wagenrücklauf (üblicherweise wie
\r
in Programmiersprachen codiert ) ein unauffälliges Steuerzeichen. Sie können Wagenrückläufe innerhalb einer Textzeile haben, wie jedes andere Zeichen außer einem Zeilenvorschub (auch Zeilenumbruch genannt ), der das Ende einer Zeile markiert.Insbesondere in einem Bash-Skript ist ein Wagenrücklauf ein gewöhnliches Wortbestandteil wie Buchstaben und Ziffern. Ein besonderer Effekt des Wagenrücklaufs kommt vom Terminal, nicht von der Schale.
Ein Wagenrücklauf ist ein Steuerzeichen . Wenn Sie es auf einem Terminal drucken, führt das Terminal anstelle eines Glyphen einen Spezialeffekt aus. Bei einem Wagenrücklauf besteht der Spezialeffekt darin, den Cursor an den Anfang der aktuellen Zeile zu bewegen. Wenn Sie also eine Zeile drucken, die einen Wagenrücklauf in der Mitte enthält, wird die zweite Hälfte über die erste Hälfte geschrieben.
Einige andere Steuerzeichen haben Spezialeffekte: Das Rücktastezeichen bewegt den Cursor um eine Position nach links. Das Klingelzeichen bewirkt, dass das Terminal einen Ton abgibt oder auf andere Weise die Aufmerksamkeit des Benutzers auf sich zieht. Der Escape-Charakter startet eine Escape-Sequenz, die alle Arten von Spezialeffekten haben kann.
Wenn Sie eine nicht vertrauenswürdige Ausgabe anzeigen, müssen Sie Steuerzeichen bereinigen oder maskieren. Nicht nur der Wagen kehrt zurück, sondern auch einige andere, insbesondere der Fluchtcharakter, der alle möglichen negativen Auswirkungen haben kann. Siehe Kann das "Cating" einer Datei ein potenzielles Sicherheitsrisiko darstellen? und Wie vermeide ich Fluchtsequenzangriffe in Terminals? für mehr zum Thema.
quelle
Sie können die Wagenrückläufe in einer Bash-Variablen anzeigen, indem Sie die
printf
Funktion mit einem%q
Format verwenden.Quellen und weiterführende Literatur:
quelle