zshスクリプトのセキュリティ構成ファイルの生成

zshスクリプトのセキュリティ構成ファイルの生成

作業中のzshシェルスクリプトのいくつかのデフォルト変数を保存したいと思います。source私のスクリプトで1行を使用することはうまくいくことを知っていますが、最も安全な方法ではありません。

すべてのユーザーの最大の互換性を確保するために、zsh(具体的にはAmazon Linux 2)でネイティブに提供されているツールを使用してテキストファイルから行を安全に読み取り、設定ファイルから事前設定された変数セットを抽出する方法はありますか?

テキストファイル自体はハッシュされないことを知っていますが、それは私の問題ではありません。私の目標は、誰かが設定ファイルにマルウェアを挿入し、それをスクリプトとして扱う可能性を避けることです。

ベストアンサー1

zshが提供する文字列操作機能に加えて、それを容易にするzshのどの機能も考えられません。パラメータ拡張

config以下は、次の制約を使用してKEY = VALUE行を連想配列に解析するいくつかのコードです。

  • キーにはASCII文字、数字、下線のみを含めることができます。キーは数字で始まるか空にすることはできません。
  • 値には、改行およびヌルバイトを除くすべてのバイト文字列を含めることができます。これには、UTF-8などのマルチバイトエンコーディングに誤ったシーケンスが含まれる可能性があります。
  • 空の行(ASCII水平スペースのみを含む行)とコメント行(スペースとaで始まる行#)は無視されます。
  • いかなる種類の拡張もありません。変数の置換もなく、引用もなく、空白の削除もありません。
function parse_config {
  emulate -LR zsh
  setopt extended_glob
  local n=0 line lines
  local LC_ALL=C
  lines=("${(@f)$(<$1)}")
  for line in "${(@)lines}"; do
    ((++n))
    line=${line##[$' \t']##}
    if [[ -z $line || $line == \#* ]]; then
      continue
    elif [[ $line = *$'\0'* ]]; then
      echo >&2 "$1:$n:Null character in configuration file"
      config=()
      return 1
    elif [[ $line == [A-Z_a-z][0-9A-Z_a-z]#\=* ]]; then
      config[${line%%=*}]=${line#*=}
    else
      echo >&2 "$1:$n:Syntax error in configuration file"
      config=()
      return 1
    fi
  done
}

次の関数を呼び出します。

set -e
typeset -A config
parse_config /path/to/config/file

echo "Configuration dump:"
for k in ${(ko)config}; do
  print -lr "$k=$config[$k]"
done

おすすめ記事