BASHとキャリッジリターン動作

BASHとキャリッジリターン動作

簡単な質問があります。
Bash(4.4.11を使用している)では、通常の区切り/終了行/テキストを表示しないのが正常ですか\r

私はこの行動を見て少し驚きました。

$ a=$(printf "hello\ragain\rgeorge\r\n")
$ echo "$a"
george

しかし、「hello」テキストはまだ「非表示」になっています。

$ 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

bashだけプレイしても大丈夫です。しかし、潜在的なセキュリティリスクはありますか?変数「a」の内容が外部の世界から来ており、「hello」の代わりに「間違ったコマンド」が含まれている場合はどうなりますか?

もう一つのテストです。今回は少し安全ではありません。

$ 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

私は何が間違っていた...?

ベストアンサー1

「hello」を印刷してecho "$a"から行の先頭に戻り(これがまさにそのことです\r)、「もう一度」を印刷し、再び戻り、「george」を印刷し、再び戻って次の行に移動します(\n)。これはすべて正常ですが、チェフナBashとは何の関係もなく、Bash以外の端末によって解釈されます(これがコマンドをパイプに渡すと出力全体が得られる理由です\r)。\nod

これをよりよく見ることができます

$ a=$(printf "hellooooo\r  again,\rgeorge\r\n")
$ echo "$a"

これは上書きされたテキストの終わりを残すからです。

georgen,o

eval実際にコマンドを非表示にすることはできませんが、表示される方法で使用しない限り、その出力だけが(十分な文字で覆われていると確信している場合にのみ)使用できます(しかし通常はevalそうではありません)。推奨)。より危険なトリックはCSSを使用したコマンドのブロックウェブサイトからコピーして貼り付けられるように設計されています。

おすすめ記事