簡単な質問があります。
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
)。\n
od
これをよりよく見ることができます
$ a=$(printf "hellooooo\r again,\rgeorge\r\n")
$ echo "$a"
これは上書きされたテキストの終わりを残すからです。
georgen,o
eval
実際にコマンドを非表示にすることはできませんが、表示される方法で使用しない限り、その出力だけが(十分な文字で覆われていると確信している場合にのみ)使用できます(しかし通常はeval
そうではありません)。推奨)。より危険なトリックはCSSを使用したコマンドのブロックウェブサイトからコピーして貼り付けられるように設計されています。