BASH 和回车行为

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 来屏蔽打算从网站复制和粘贴的命令

  • 请注意,这实际上与 `bash` 没有任何关系。如何“显示”回车符或如何显示被覆盖的字符完全取决于*终端*。例如,终端将 `-\r|` 显示为类似于加号的东西,而不仅仅是管道,这将是完全有效的。 (2认同)

Gil*_*il' 11

在 Unix 世界中,回车(通常\r用编程语言编码)是一个不起眼的控制字符。您可以在一行文本中使用回车符,就像除换行符(也称为换行符)之外的任何其他字符一样,它标志着一行的结束。

特别是,在 bash 脚本中,回车是一个普通的单词组成字符,如字母和数字。回车的任何特殊效果都来自终端,而不是来自外壳。

回车符是一个控制字符。当您将其打印到终端时,终端会执行一些特殊效果,而不是显示字形。对于回车,特殊效果是将光标移动到当前行的开头。因此,如果打印一行中间包含回车符,则效果是后半部分覆盖了前半部分。

其他几个控制字符具有特殊效果:退格字符将光标向左移动一个位置。铃铛字符使终端发出声音或以其他方式吸引用户的注意力。转义字符开始一个可以有各种特殊效果的转义序列

如果显示不受信任的输出,则需要擦除或转义控制字符。不仅是回车,还有其他几个,特别是转义字符,它会导致各种不良影响。请参阅“cat-ing”文件是否存在潜在安全风险?以及如何避免终端中的转义序列攻击?有关该主题的更多信息。