У мене є одне швидке запитання.
Це нормально, що bash (я використовую 4.4.11) не відображає рядки / текст, який відокремлений / закінчується простим \r
?
Я трохи здивувався, побачивши таку поведінку:
$ a=$(printf "hello\ragain\rgeorge\r\n")
$ echo "$a"
george
Але текст "привіт знову" все ще є, якось "прихований":
$ 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
І як тільки ми просто граємо з башем, це добре .... Але це потенційний ризик для безпеки? Що робити, якщо вміст змінної "a" походить із зовнішнього світу та містить "погані команди" замість просто привіт?
Ще один тест, трохи незахищений цього разу:
$ 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>
Уявіть приховане rm
замість прихованого ls
.
Така ж поведінка при використанні echo -e:
$ a=$(echo -e "ls;\rGeorge\r\n"); echo "$a"
George
Це я щось робить не так ...?