Bashスクリプトは-fステートメントを使用して自動的に美しくなります。

Bashスクリプトは-fステートメントを使用して自動的に美しくなります。

自動化された "beautify"スクリプトを使用しようとしています。declare -f function

簡単に言うと:bashスクリプトが与えられたら、foobashで以下を実行して「自動」インデントすることができます。 MAGIC () { ...here you copy/paste the whole foo script... ; } ; declare -f MAGIC

入力として提供するすべてのスクリプトに対してこれを行うサンプルスクリプトを以下に含めました。

私の質問は:インクルード機能を使用する際の主な考慮事項は何ですかdeclare -f

  • 特別な危険がありますか?
  • 入れ子になった関数の数に制限はありますか? (スクリプトで関数を使用でき、インデントするのはうまくいきますが、いくつのステップまで行くことができますか?)
  • 「これはできないでしょうか/それを説明できないでしょうか/...」? (awkスクリプトが良くなり、少しインデントされているようです(基本スクリプトはスクリプトの残りの部分と一致します)... しかし、問題を引き起こす可能性がある(他の)要素は何ですか?
  • 一部の情報が失われますか?私は気づきました:空の行とコメント()を削除しますが# ...、他に何を削除/修正しますか?

以下の「indent」スクリプトを使用して複数のbashスクリプトを再インデントする前に、あなたの意見を聞きたいです。

これは私の最初の試みです。コメント(および上記の質問に対する回答)を歓迎します。

#!/usr/bin/bash
 # parameters:  $@ = bash (only) scripts that need reindentations.

for script in "$@" ; do
  tmpfile="${script}.BEAUTIFY.tmp"
  finalfile="${script}.BEAUTIFY"
  # optionnal temporisation...
  echo "I am about to create ${script}.BEAUTIFY from the bash (I hope) script: ${script} . Press return if OK, ctrl-C if not"
  read temporisation
  # we output the following commands into a pipe to a subshell bash:
  { sleep 1
    echo "
      # declare surrounding function . The script has to be bash, but can contain also functions, etc.
      # Will lose # comments and blank lines, but maybe also other things... hence the Question on unix.se
      ODBEAUTIFIER () {
      $(cat "$script")
      }
      #  print if via declare -f, to pretiffy it
      declare -f ODBEAUTIFIER > \"${tmpfile}\"
      #  then get rid of the surrounding ODBEAUTIFIER function:
      tail -n +3 \"${tmpfile}\" | tac | tail -n +2 | tac | sed -e 's/    //' > \"${finalfile}\"
      #  and displays the resulting file
      ls -l \"${script}\" \"${finalfile}\"
      \rm \"${tmpfile}\" ; # that rm has a backslash to avoid aliases to rm -i
      "
   } | bash ; #  that sub- bash receives the input and interprets it
done

コメント/編集:「-fを宣言すると#で始まるコメントが失われます」を防ぐための回避策がありますが、多くの警告と危険があります。 (難しくても解決方法に関する注意事項を多く引用しましたが、上記の内容はまったく質問の要点ではないので削除することをお勧めします。気になる方は前の編集内容を参考にしてください^^)

答え1

スクリプトを関数として読み込み、それを別のシェルにパイプする場合、セキュリティ上のリスクがあります。入力ファイルに矛盾が含まれている場合は、次のすべての}エントリが実行され、出力から省略されます。

一致の失敗は、誤って}または悪意を持って発生する可能性があります。一般的に、bashは構文エラーを報告しますが、攻撃者は他の未完了関数でファイルを終了して(未処理のスクリプトを実行しているユーザーから)このエラーを隠すことができます。

}
echo "insert shellcode here" > ~/RCFILE
function end_func {
    true

あまり重要ではありません:

  • で始まるコメントが失われると言われました#。これにはオープンが含まれるため、#!/bin/...出力ファイルが実行されないことがあります。

  • sed -e 's/ //'すべての行から最初の4つのスペースを削除します。人々は通常最初の4つのスペースdeclare。ただし、declareここでは文書行の前にスペースを挿入しないため、元の文書から他のスペースを削除することがあります。

  • head -n -1代わりにを使用することも、sをtac | tail -n +2 | tacすべて削除して使用することもできます。tailsed '1,2d;$d'

関連情報