Geo*_*iou 14 bash special-characters shell-script newlines
我有一个简单的问题。
bash(我使用的是 4.4.11)不显示分隔/以纯文本结尾的行/文本是否正常\r
?
看到这种行为,我有点惊讶:
$ a=$(printf "hello\ragain\rgeorge\r\n")
$ echo "$a"
george
Run Code Online (Sandbox Code Playgroud)
但是“你好再次”文本仍然存在,不知何故“隐藏”:
$ 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
Run Code Online (Sandbox Code Playgroud)
只要我们玩 bash 就可以了……但这是否存在潜在的安全风险?如果变量“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>
Run Code Online (Sandbox Code Playgroud)
想象一个 hiddenrm
而不是 hidden ls
。
使用 echo -e 时的行为相同:
$ a=$(echo -e "ls;\rGeorge\r\n"); echo "$a"
George
Run Code Online (Sandbox Code Playgroud)
是我做错了吗……?
Ste*_*itt 22
您echo "$a"
打印“你好”,然后返回到行首(这是什么\r
),打印“再次”,再次返回,打印“乔治”,再次返回,然后转到下一行(\n
)。这一切都是完全正常的,但正如chepner指出的那样,它与 Bash 没有任何关系:\r
并且\n
由终端解释,而不是由 Bash 解释(这就是为什么当您将命令通过管道传输到 时会获得完整输出od
)。
你可以更好地看到这一点
$ a=$(printf "hellooooo\r again,\rgeorge\r\n")
$ echo "$a"
Run Code Online (Sandbox Code Playgroud)
因为这将留下覆盖文本的结尾:
georgen,o
Run Code Online (Sandbox Code Playgroud)
但是,您不能真正使用它来隐藏命令,只能使用它们的输出(并且仅当您可以确保用足够的字符覆盖时),除非eval
按照您显示的方式使用(但eval
通常不建议使用)。一个更危险的技巧是使用 CSS 来屏蔽打算从网站复制和粘贴的命令。
Gil*_*il' 11
在 Unix 世界中,回车(通常\r
用编程语言编码)是一个不起眼的控制字符。您可以在一行文本中使用回车符,就像除换行符(也称为换行符)之外的任何其他字符一样,它标志着一行的结束。
特别是,在 bash 脚本中,回车是一个普通的单词组成字符,如字母和数字。回车的任何特殊效果都来自终端,而不是来自外壳。
回车符是一个控制字符。当您将其打印到终端时,终端会执行一些特殊效果,而不是显示字形。对于回车,特殊效果是将光标移动到当前行的开头。因此,如果打印一行中间包含回车符,则效果是后半部分覆盖了前半部分。
其他几个控制字符具有特殊效果:退格字符将光标向左移动一个位置。铃铛字符使终端发出声音或以其他方式吸引用户的注意力。转义字符开始一个可以有各种特殊效果的转义序列。
如果显示不受信任的输出,则需要擦除或转义控制字符。不仅是回车,还有其他几个,特别是转义字符,它会导致各种不良影响。请参阅“cat-ing”文件是否存在潜在安全风险?以及如何避免终端中的转义序列攻击?有关该主题的更多信息。
归档时间: |
|
查看次数: |
54810 次 |
最近记录: |