Bashのチルダ拡張と変数

Bashのチルダ拡張と変数

次のスニペットを検討してください。

$ export xx=foo
$ sudo bash -c 'echo $xx ~'
/root

それは問題ではありません。私たちはxxを見ることができません。

ただし、公開すると次のようになります。

$ sudo -E bash -c 'echo $xx ~'
foo /home/xropi

多くの人が言うが、~エイリアスではありませんが、環境の一部です。- 金利オリジナルが公開されているため評価を延期できません。

sudo-edコマンドに私の変数を渡し、〜を/ rootとして評価できますか?

sudoで実行するときにこれを取得したいと思います。

foo /root

ベストアンサー1

チルダがどのように機能するかについての理解は不完全です。表示man bashと検索Tilde Expansion

次に始めます(追加の改行といくつかの太字を追加)。

単語が引用符で囲まれていないチルダ(~)で始まる場合、引用符で囲まれていない最初のスラッシュの前のすべての文字(または引用符で囲まれていないスラッシュがない場合はすべての文字)は、チルダプレフィックスとして扱われます。

チルダプレフィックスに引用されていない文字がある場合、チルダプレフィックスでチルダの後に続く文字は、可能なログイン名と見なされます。

このログイン名が空の文字列の場合、チルダはシェルパラメータの値に置き換えられますHOMEHOME設定されていない場合、シェルを実行しているユーザーのホームディレクトリが置き換えられます。

それ以外の場合、チルダプレフィックスは指定されたログインに関連付けられているホームディレクトリに置き換えられます。

つまり、~$ HOMEが空でない場合は$ HOMEに展開されます。

sudoWith が$HOMEなければ実際にです。-E-E

~さらに、これは注目に値します。ほとんどのシェルはユーザーのホームディレクトリに展開でき、実際には拡張されますが、すべてのプログラムが拡張するわけではありません。実際、ほとんどのプログラムはこれを行いません。実際には、そのタスクではなく、チルダ、変数、グローブ、その他の拡張を実行するためにシェルに依存します。今後彼らは議論の余地がありません。


Q:sudo-edコマンドに私の変数を渡し、〜を/ rootとして評価させることはできますか?

いくつかの方法があり、それぞれに長所と短所があります。そのうちのいくつかは次のとおりです。

  1. unset HOME走る前にsudo -E

  2. HOME=/root実行する前に設定してくださいsudo -E。例えばHOME=/root sudo -E bash -c 'echo $xx ~'

  3. sudoと共有する変数をファイルに書き込みます。たとえば、実行したい項目を実行する前に、これを実行するシェルスクリプトを実行したりdeclare -p var1 var2 var3 > /tmp/myvars.sh実行しsudoたりできます。-Esource /tmp/myvars.shsudo

  4. または設定を有効にするenv_keep- このオプションを有効または無効にすることなく、実行時に常に保持される変数を定義できます。/etc/sudoers/etc/sudoers.d/*sudo-E

  5. (@ MichaelHomer経由)オプションを使用してsudoHOME-Hを次に設定します。対象ユーザーのホームディレクトリを選択し、--preserve-env=xxsudoに変数を渡すように指示しますxx(このオプションはコンマ区切りの環境変数名のリストを使用します)。man sudo詳細より。すべてのユーザーが環境を保護する権利があるわけではありません。望むよりman sudoers

sudo環境変数がデフォルトで維持されないのには、妥当な理由があります。セキュリティに重大な影響を与える多くの環境変数があり、誤って使用すると、ユーザーやグループがアクセスしないコンテンツへのルート(または他のUID)アクセス権を取得できます。

おすすめ記事