bash サブシェルのエクスポート変数 [閉じる]

bash サブシェルのエクスポート変数 [閉じる]

不要な質問でしたら申し訳ありませんが、インターネット上であちこちで検索してみましたが、残念ながら私との関係では順序がかなり複雑です。

root権限でコマンドを実行できるように、sudoコマンドにパスワードを接続しようとしています。

 echo 'PASSWORD' | sudo -S [...]

これは私にとって効果的です。

ただし、独自のパイプを含むコマンドに対するroot権限が必要な場合は問題が発生します。

 echo 'PASSWORD' | sudo -S printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat /dev/sd* -

したがって、サブシェルコマンドを試してみました。

echo 'PASSWORD' | sudo -S bash -c 'printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat /dev/sd* -'

残念ながら、引用符はprintfコマンドの引用符と競合するため、使用できません。

この問題を解決するために、いくつかの括弧を使ってみました。これはうまくいきます:

echo 'PASSWORD' | sudo -S bash -c '(printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat /dev/sd* -)'

ただし、以前に生成された変数を使用するには、その変数をエクスポートするのが困難になります。

 export storage="/dev/sda"
 echo 'PASSWORD' | sudo -S bash -c '(printf '%s' "OTHER_PASSWORD" | cryptsetup --batch-mode --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 3000 luksFormat $storage -)'

 ERROR: Device - doesn't exist or access denied.

この問題を解決する簡単な方法はありますか?

ベストアンサー1

変数は一重引用符で拡張されません。

sudo -S bash -c '(printf '%s' "OTHER_PASSWORD" | ... luksFormat $storage -)'
                                                                ~~~~~~~~

二重引用符は、%s実際には文字列が引用されていないことを意味します(ここで強調表示された構文に表示されます)。しかし、幸いにも%s特別な意味がないので、これは重要ではありません。

おすすめ記事