次のスニペットを検討してください。
$ 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
次に始めます(追加の改行といくつかの太字を追加)。
単語が引用符で囲まれていないチルダ(
~
)で始まる場合、引用符で囲まれていない最初のスラッシュの前のすべての文字(または引用符で囲まれていないスラッシュがない場合はすべての文字)は、チルダプレフィックスとして扱われます。チルダプレフィックスに引用されていない文字がある場合、チルダプレフィックスでチルダの後に続く文字は、可能なログイン名と見なされます。
このログイン名が空の文字列の場合、チルダはシェルパラメータの値に置き換えられます
HOME
。HOME
設定されていない場合、シェルを実行しているユーザーのホームディレクトリが置き換えられます。それ以外の場合、チルダプレフィックスは指定されたログインに関連付けられているホームディレクトリに置き換えられます。
つまり、~
$ HOMEが空でない場合は$ HOMEに展開されます。
sudo
With が$HOME
なければ実際にです。-E
-E
~
さらに、これは注目に値します。ほとんどのシェルはユーザーのホームディレクトリに展開でき、実際には拡張されますが、すべてのプログラムが拡張するわけではありません。実際、ほとんどのプログラムはこれを行いません。実際には、そのタスクではなく、チルダ、変数、グローブ、その他の拡張を実行するためにシェルに依存します。今後彼らは議論の余地がありません。
Q:sudo-edコマンドに私の変数を渡し、〜を/ rootとして評価させることはできますか?
いくつかの方法があり、それぞれに長所と短所があります。そのうちのいくつかは次のとおりです。
unset HOME
走る前にsudo -E
。HOME=/root
実行する前に設定してくださいsudo -E
。例えばHOME=/root sudo -E bash -c 'echo $xx ~'
sudoと共有する変数をファイルに書き込みます。たとえば、実行したい項目を実行する前に、これを実行するシェルスクリプトを実行したり
declare -p var1 var2 var3 > /tmp/myvars.sh
実行しsudo
たりできます。-E
source /tmp/myvars.sh
sudo
または設定を有効にする
env_keep
- このオプションを有効または無効にすることなく、実行時に常に保持される変数を定義できます。/etc/sudoers
/etc/sudoers.d/*
sudo
-E
(@ MichaelHomer経由)オプションを使用して
sudo
HOME-H
を次に設定します。対象ユーザーのホームディレクトリを選択し、--preserve-env=xx
sudoに変数を渡すように指示しますxx
(このオプションはコンマ区切りの環境変数名のリストを使用します)。man sudo
詳細より。すべてのユーザーが環境を保護する権利があるわけではありません。望むよりman sudoers
。
sudo
環境変数がデフォルトで維持されないのには、妥当な理由があります。セキュリティに重大な影響を与える多くの環境変数があり、誤って使用すると、ユーザーやグループがアクセスしないコンテンツへのルート(または他のUID)アクセス権を取得できます。