web-dev-qa-db-ja.com

Sudoコマンドで/root/.bashrcの設定を使用するにはどうすればよいですか

.bashrcをいくつかのエイリアス、特にllexport LS_OPTIONS='--color=auto'でカスタマイズしました

残念ながら、これをSudoと一緒に使用すると機能しないため、/root/.bashrcも変更しましたが、これによる違いはないようです。

Sudo envHOME=/rootおよびShell=/bin/bashを表示します

/root/.bashrcの設定を使用するSudoコマンドを取得するにはどうすればよいですか?

これはbashがインタラクティブに実行された場合にのみ発生することを理解しているため、カスタマイズ方法に関する他の提案を受け入れます。

9
Milliways

答えてくれてありがとうman Sudoより慎重に。

Sudo -sコマンドが指定されていない場合、対話型シェルが実行されます。

このインタラクティブシェルは/root/.bashrcしたがって、私のカスタマイズが含まれます。

コマンドを個別に入力する必要がありますが、これで問題ありません。

3
Milliways

Sudoは、シェルコマンドではなく実行可能ファイルを実行します。したがって、エイリアスについてはわかりません。 Sudo lsを実行すると、Sudo /bin/lsのようになり、lsエイリアスが使用されなくなります。

Sudo lsに次のように入力すると、.bashrcにエイリアスを展開させることができます。

alias Sudo='Sudo '

末尾のスペースに注意してください。これは、Sudoの後に続くWordでエイリアスの展開を続けるようにシェルに指示します。 Sudoの後にエイリアスを拡張することは必ずしも良い考えとは限らないことに注意してください。それは、どのような種類のエイリアスを持っているかによって異なります。

さらに、Sudoはほとんどの変数を環境から削除します。これはalias ls='ls $LS_OPTIONS'のようなエイリアスには影響しません。これは、シェルがコマンドを展開しているときにシェルによって使用されるシェル変数であるためです(.bashrcからのエクスポートは意味がありません)。ただし、LS_COLORSなど、コマンドで使用される変数に影響します。設定を編集して特定の環境変数を保持するようにSudoを設定できます:visudoを実行して行を追加します

Defaults env_keep += "LS_COLORS"

これらの設定で、Sudo llは使い慣れた色を提供します。

または、Sudo -sを使用してルートシェルを実行することもできます。このシェルは構成ファイルをロードします(bashの場合は~/.bashrc)。 Sudoの構成方法に応じて、HOMEをホームディレクトリに設定したままにするか、/rootに変更します。 Sudo -Hs;を使用して、ホームディレクトリを強制的にルートディレクトリに設定できます。逆に、元のホームディレクトリを保持するには、Sudo env HOME="$HOME" bashを実行します。

バックグラウンド

この質問は XY問題 だといつも感じていました。タイトルは、彼らが/root/.bashrc以外のものを望んでいることを示していますが、実際の質問は、このファイルのエイリアスです-これは、これによって不可能であると広く信じられています- なぜ私のBashスクリプトは認識しないのですか?エイリアス?

あなたのエイリアスはSudoや他の場所では持ち運びできないので、それらがピックアップされないのは基本的に設計によるものであり、これも同様に私の意見です。

ユーザーの環境にあるものは、スクリプトや、特定のボックスで実行される可能性のあるソフトウェアによって想定されるべきではありません。ただし、特定のユーザーアカウントの$HOME/.bashrcにエイリアスがあり、他のユーザーがインタラクティブなシナリオで活用したいシナリオがあることは理解しています。

そのためには、Bashインタープリターに、Sudoを使用するときに実行される通常のシェル動作の外で、ログインプロセス中に検出したエイリアスを展開するように指示するだけです。

セットアップ

設定を行うために、ルートユーザーの/root/.bashrcファイルと/root/.bash_profileファイルに次のエイリアス、環境変数、関数を追加しました。

$ grep smurf ~/.bashrc
alias brc_smurf='echo "ran alias from /root/.bashrc"'
export brc_smurf_env='var from /root/.bashrc'
bpf_smurf_func() { echo 'ran func from /root/.bash_profile'; }

$ grep smurf ~/.bash_profile
alias bpf_smurf='echo "ran alias from /root/.bash_profile"'
export bpf_smurf_env='var from /root/.bash_profile'
brc_smurf_func() { echo 'ran func from /root/.bashrc'; }

これらの作業を何もせずに(驚きなし):

$ Sudo brc_smurf
Sudo: brc_smurf: command not found

$ Sudo bpf_smurf
Sudo: bpf_smurf: command not found

aliasコマンドをSudoで実行すると、エイリアスが表示されないことがわかります。

$ Sudo alias
$

この動作は、エイリアスにアクセスできると期待してはいけないというヒントです。しかし、私たちは続けます...

ステップ#1-表示されるエイリアス

bash -ciを実行すると、少なくとも$HOME/.bashrcを読み取るようにBashを誘導できます。

$ Sudo bash -ci 'alias' | grep smurf
alias brc_smurf='echo "ran alias from /root/.bashrc"'

かっこいいので、実行できるでしょうか?

$ Sudo bash -ci 'alias; brc_smurf'
bash: alias; brc_smurf: No such file or directory

ステップ#2-shopt -s expand_aliases

いいえ。繰り返しになりますが、これは仕様によるものであり、想定していないことを行っているため、無効にする必要のある「安全」がいくつかあります。もう1つの「安全性」はBashです。

$ Sudo bash -ci 'shopt -s expand_aliases; alias; brc_smurf'
alias brc_smurf='echo "ran alias from /root/.bashrc"'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
ran alias from /root/.bashrc

ここでは、/root/.bashrcからのメッセージを確認できます。rootユーザーのエイリアスbrc_smurfが正常に実行されました。

ステップ#3-環境変数はどうですか?

上記の方法を使用している場合、これらも同様に機能するはずです。

$ Sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env'
ran alias from /root/.bashrc
var from /root/.bashrc

ステップ#4-関数はどうですか?

これらも期待どおりに機能します。

$ Sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env;brc_smurf_func'
ran alias from /root/.bashrc
var from /root/.bashrc
ran func from /root/.bashrc

TLDR;

これを行うと、/root/.bashrcから環境変数+エイリアスにアクセスできます。

$ Sudo bash -ci 'shopt -s expand_aliases; <cmds>'

奪う

このメソッドは/root/.bashrcのコンテンツを有効にしますが、/root/.bash_profileのコンテンツは取得しません。

参考文献

2
slm

TL; DR:Sudo -iを使用して、関数で定義された/root/.bashrc(エイリアスではない)を実行し、そのファイルからエクスポートされた変数にアクセスすることもできます。

須藤 -私コマンド引数

ただし、エイリアスはそこで機能しませんが、Sudo -iで使用できるようにしたい場合は、エイリアスを関数に簡単に変換できます。

完全な分析と詳細については、以下をお読みください。


ここにはいくつかの問題があります。いくつかはSudoがどのように機能するか、いくつかはbash自体がどのように機能するかです...

デフォルトでは、Sudoはコマンドのみを検索してシェルをバイパスするため、Sudo llを実行すると、$PATHのいずれかのディレクトリにll実行可能ファイルがある場合にのみ機能します。したがって、エイリアス(または関数)を使用するには、プロセスの一部としてシェルが呼び出されるようにする必要があります。

1つの方法は、Sudo shSudo bashなどを実行することですが、最近のSudo(Sudo 1.8.19p1でこれをテストしています)には、そのためのオプション-sおよび-iがあります。

したがって、1回の試行はSudo -s llSudo bash -c 'll'がBashであると想定すると$Shellに相当します。これは、先ほどお話ししたrcfileに基づいているようです)ですが、Shellを非対話型、非ログインモード。起動ファイルを読み取りません。基本的には、シェルスクリプトを記述し、#!/bin/bashを使用して実行する場合と同じです。 ~/.bashrcにあるエイリアス(および関数)は、そのスクリプトからアクセスできません...

その次は、ログインシェルを作成する-iオプションです。起動ファイルを読み取りますので、これはより有望です!それでも、Sudo -i llSudo bash -l -c 'll'と同等)はまだ機能しません。それで、didllエイリアスの定義を読み取ることを考えると、それはどのように可能ですか?

さて、ここでの次の説明は、シェルがインタラクティブな場合を除いて、デフォルトではbashはエイリアスを展開しないということです... Sudo -i(またはbash -l)で開始されるこのシェルはloginシェルですが、まだインタラクティブではありません。

したがって、次のステップはinteractiveシェルを取得することで、が機能します

Sudo bash -i -c 'll'

logininteractiveの両方を使用しても問題ありませんが、もちろんbash -l -i -c ...動作します。)

別の方法として、loginシェル(非対話型)を使い続けるが、明示的にエイリアスを展開するように要求することで、これも機能します。

Sudo bash -l -O expand_aliases -c 'll'

(bashがinteractiveの場合、loginシェルは必要ありませんでした、それだけで初期化ファイルを読み取るのに十分ですが、これにはそれらを読み取るために-lが必要です。

これらはかなり長いコマンドラインです。また、シェルコマンド全体を引用符で囲む必要があるため、引数付きのエイリアスを呼び出す場合は、すべてを文字列に変換する必要があります...なので、使いにくい...

以前、私はエイリアスとfunctions...について話していたことに注意してください...関数は実際にはここではるかに便利なので、それは意図的でした。定義を取得している限り、シェルで関数を実行するために特別なもの(インタラクティブなシェルを使用する、特定のオプションを設定するなど)は必要ありません。

したがって、llをエイリアスの代わりにfunctionとして定義した場合、Sudoの-iショートカットで直接使用できます。

Sudo -i ll

また、引数付きのより長いコマンドラインがある場合は、ここでも直接渡すことができます。

Sudo -i ll -C -R /etc

Sudo bash -i -c 'll -C -R /etc'と比較してください。)

関数はさらに柔軟性が高く、通常は保守が簡単です...通常、エイリアスを関数に変換するのは簡単です。唯一の注意点は、余分な引数を取ることが期待される"$@"を常に使用することです(通常、最後にエイリアス。)

たとえば、次のエイリアス:

alias ll='ls $LS_OPTIONS -l'

この関数に変えることができます:

ll () {
    ls $LS_OPTIONS -l "$@"
}

これらは、ほとんどの目的で同等です。そして、前述のように、関数はSudo -iから直接アクセスできる必要があります。これは追加のボーナスです。

この回答と説明がお役に立てば幸いです。

0
filbranden

/root/.bashrcを次のように編集するとします。

$ Sudo su -
Password: ******
# cat ~/.bashrc

echo "root bashrc file was read"
PATH=~/bin:$PATH
echo "$PATH"
export USERVAR=set
echo "$USERVAR"

umask 022
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'

ログアウトして再度ログインし、bashにファイルを読み取らせます。

# exit
$ Sudo su -
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@here:~# alias l
alias l='ls $LS_OPTIONS -lA'
root@here:~# 

ご覧のとおり、ファイルが読み取られ、PATHが変更され、エイリアスが設定されています。あなたが要求するようにすべてが機能しています。

ただし、Sudoは期待どおりに機能しません。

root@here:~# exit
$ Sudo env | grep USERVAR              # no output 
$ Sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

PATHは変更されていません。 sudoersでパスを変更する方法はあるかもしれませんが、そうしないことを強くお勧めします。とにかく、エイリアス、関数、その他の変更は、PATHのみを変更しても適用されません。ファイルを入手する必要があります。すべてのスクリプトまたはコマンドに対してこれを行うと、コンピューターに実際の利点なしにさらに多くの作業を実行するように要求します。スクリプトはエイリアスを使用しません(スクリプト内でエイリアスを実際に使用することはできません)。

だから、ログインするだけで、.bashrcファイルが自動的に読み込まれ、機能します。

次のようにbashを開始できます:

$ Sudo bash
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@mail:/home/isaac/me/temp/clocks-master#

しかし、上記のように、pwd(作業ディレクトリ)は変更されていません。さらに詳しく調べても、他の一部の設定は変更されていません。これが、正しいコマンドを使用する理由です。

$ Sudo su -

そのコマンドが長すぎて入力できない場合は、そのコマンドが使用されるユーザー(rootではなく)にエイリアスまたは関数を作成します。

$ alias mysu='Sudo su -'
$ mysu
# 
0
Isaac

/ etc/sudoersファイルには多数の設定があり、Sudoコマンドを実行するときの環境を設定します(たとえば、PATHに信頼できる場所のみがあることを確認する)が、これから何を望んでいるかに依存します。シェルで実際のコマンドを実行して環境をセットアップする必要がある場合は、目的を達成できない可能性があります。 sudoingは特にrootログインシェルを提供しないので、通常のプロファイルをセットアップしません。

0
hvindin