14

ユーザーアカウントを作成するbashスクリプトを書いています。ユーザー名とパスワードのハッシュは、特定の基準に基づいてファイルから取得されます。パスワード ハッシュには、当然、ハッシュのフィールドを区切る「$」が含まれます (例: $1${SALT}$...)。

useradd問題は、「$」フィールドが変数として補間されないようにするために、パスワード ハッシュを一重引用符で囲む必要がある -p オプションです。変数を渡すとき、それを適切に補間するには、引用符を二重にする必要があります。一重引用符は、変数を文字列として扱います。

ただし、変数を二重引用符で囲んで渡すと、変数が展開され、各 '$' が変数であるかのように扱われ、パスワードが正しく設定されないことを意味します。さらに悪いことに、一部の変数には中かっこ ('{' または '}') が含まれているため、さらに問題が発生します。

このような値を渡し、シェルによって変更されることなく完全に補間されるようにするにはどうすればよいですか?

補間されたすべての変数をそのまま使用した特定のコード行の例:

# Determine the customer we are dealing with by extracting the acryonym from the FQDN
CUSTACRO=$(${GREP} "HOST" ${NETCONF} | ${AWK} -F "." '{print $2}')

# Convert Customer acronym to all caps
UCUSTACRO=$(${ECHO} ${CUSTACRO} | ${TR} [:lower:] [:upper:])

# Pull the custadmin account and password string from the cust_admins.txt file
PASSSTRING=$(${GREP} ${CUSTACRO} ${SRCDIR}/cust_admins.txt)

# Split the $PASSSTRING into the custadmin and corresponding password
CUSTADMIN=$(${ECHO} ${PASSSTRING} | ${CUT} -d'=' -f1)
PASS=$(${ECHO} ${PASSSTRING} | ${CUT} -d'=' -f2)

# Create the custadmin account
${USERADD} -u 20000 -c "${UCUSTACRO} Delivery Admin" -p "${PASS}" -G custadmins ${CUSTADMIN}

編集: より多くのコンテキストのためにコードを拡張しました。

4

1 に答える 1

27

に割り当てるときは一重引用符を使用します$PASS。二重引用符は、変数を再帰的に展開しません。

観察:

$ foo=hello
$ bar=world
$ single='$foo$bar'
$ double="$foo$bar"
$ echo "$single"
$foo$bar
$ echo "$double"
helloworld

引用符は、シェルがリテラル文字列を解析する方法にのみ影響します。シェルが変数の「内部」を参照するのは、引用符をまったく使用していないときだけであり、その場合でも単語分割とワイルドカード展開のみを行います。

于 2013-11-05T01:14:59.510 に答える