/root/.bashrc の sudo コマンド使用設定を作成する方法

/root/.bashrc の sudo コマンド使用設定を作成する方法

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

残念ながらと一緒に使うとうまくいかなかったのでsudoこれも修正しましたが/root/.bashrcあまり差がないようです。

sudo envディスプレイHOME=/rootSHELL=/bin/bash

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

私はbashこれがインタラクティブに実行されたときにのみ発生することを知っているので、それをカスタマイズする方法に関する別の提案で開いています。

答え1

sudoシェルコマンドの代わりに実行可能ファイルを実行します。したがって、エイリアスについては知りません。sudo ls同様に実行すると、ユーザーが持つエイリアスはsudo /bin/ls使用されません。ls

sudo ls以下を に入れてエイリアスを拡張できます.bashrc

alias sudo='sudo '

末尾のスペースに注意してください。エイリアス拡張に次の単語を使用し続けるようにシェルに指示しますsudo。 sudoの後にエイリアスを拡張することは、エイリアスの種類によっては常に良い考えではないかもしれません。

また、sudoは環境からほとんどの変数を削除します。alias ls='ls $LS_OPTIONS'これはコマンドを拡張するときにシェルが使用するシェル変数なので、同じエイリアスには影響しません(エクスポートは.bashrc効果がありません)。ただし、これはコマンドで使用される変数に影響します。たとえば、LS_COLORSsudoの設定を編集して、特定の環境変数を維持するようにsudoを設定できます。実行しvisudo、次の行を追加します。

Defaults env_keep += "LS_COLORS"

この設定では、sudo llおなじみの色が得られます。

またはsudo -s。シェルは設定ファイル(~/.bashrcbashの場合)をロードします。 sudoの設定方法に従ってHOMEホームディレクトリに設定する/root。を使用してホームディレクトリをrootに設定できますsudo -Hs。代わりに元のホームディレクトリを保持するには、を実行しますsudo env HOME="$HOME" bash

答え2

答えてくださった方々に感謝し、man sudoもっと注意深く読んでみるように誘導しました。

sudo -s コマンドを指定しないと、対話型シェルが実行されます。

このインタラクティブシェルは/root/.bashrc私のカスタマイズを使用するので含まれています。

コマンドを別々に入力する必要がありますが、大丈夫です。

答え3

背景

私はいつもこの問題が次のように感じました。XYの問題。タイトルは、それらがそれから何でも取得したいことを示唆しています/root/.bashrcが、実際の問題はファイルのエイリアスです。これは不可能であると広く知られている。私のBashスクリプトがエイリアスを認識しないのはなぜですか?

基本的に、あなたのエイリアスは移植性がsudoないため、他の場所では選択されないように設計されています。これが私がエイリアスについて感じる方法です。

ご使用の環境のいずれも、特定のコンピューターで実行できるスクリプトやソフトウェアによって想定されるべきではありません。ただし、場合によっては、$HOME/.bashrc他のユーザーが対話型シナリオで悪用したい特定のユーザーアカウントにエイリアスがある可能性があることがわかります。

単純に、Bashインタープリターにログインプロセス中に見つかったエイリアスを使用するときに直面する一般的なシェル動作以上に拡張するように指示するだけですsudo

はい

設定

/root/.bashrcこれを設定するために、rootユーザーとファイルに次のエイリアス、環境変数、および関数を追加しました/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 -ciBashに少なくとも私たちの内容を読むように指示できます$HOME/.bashrc

$ 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

いいえ。繰り返しますが、これは意図的に設計されています。私たちはしないでください。多くの「安全対策」を無効にする必要があります。もう一つの「セキュリティ」は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

長すぎる。

これにより、環境変数+エイリアスにアクセスできます/root/.bashrc

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

テイクアウト

この方法はコンテンツをアクティブにします/root/.bashrcが、コンテンツを選択しません/root/.bash_profile

引用する

答え4

重要な要約:以下sudo -iを実行できます。機能/root/.bashrcエイリアスではなく定義し、このファイルからエクスポートされた変数にアクセスします。

Sudo-私 コマンドパラメータ

しかし、エイリアスはここでは機能しませんがsudo -i

完全な分析と詳細については、読んでください。


これにはいくつかの問題があります。いくつかはsudoの仕組みに、いくつかはbash自体の仕組みです。

sudoデフォルトではコマンドのみが検索され、シェルは無視されるため、エイリアスsudo ll(または関数)を使用するには、プロセスの一部としてシェルが呼び出されることを確認する必要があります。ll$PATH

sudo sh1つの方法はorのようなものを実行することですsudo bash。ただし、最新sudoバージョン(Sudo 1.8.19p1でテスト中)にはオプションがあり、-sこの-i目的に使用されます。

したがって、試みは次のようになります。 (Bashにいると仮定すると、sudo -s ll同じで言及した内容に基づいているようです。)しかし、それはうまくいきません。非対話型でシェルを起動するからです。 、非ログインモード、起動ファイルを読みません。これは、シェルスクリプトの作成と実行と本質的に同じです。このスクリプトではエイリアス(および関数)にアクセスできません...sudo bash -c 'll'$SHELLrcfile#!/bin/bash~/.bashrc

-i以下はログインシェルを作成するオプションです。これがより有望な理由は〜するスタートアップファイルをお読みください!しかし、sudo -i ll(と同じsudo bash -l -c 'll')はまだ機能していません。それでは、これはどのように可能ですか?したエイリアスの定義を読んでくださいll

さて、次の説明は、シェルが対話型でない限り、基本的にbashはエイリアスを拡張しないことです。シェルはsudo -i(またはbash -lログインシェルですが、まだ対話できません。

したがって、次のステップはインタラクティブシェル、それから働く:

sudo bash -i -c 'll'

(また所有ログインそしてインタラクティブまた良いです。もちろんbash -l -i -c ...動作します。 )

もう1つのオプションは引き続き使用することです。ログインシェル(非対話型)ですが、エイリアスを拡張するように明示的に要求するため、この方法も機能します。

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

(バッシュの場合インタラクティブ不要ログインシェルは初期化ファイルを読み取るのに十分ですが、このファイルは読み取る必要があり-lます。 )

これはかなり長いコマンドラインです...そして完全なシェルコマンドを引用する必要があるため、引数を使用してエイリアスを呼び出す場合はすべてを文字列に変換する必要があります...それで、使用するのはやや厄介です。 ..

前に、私はエイリアスと機能…この機能は実際にはより便利なので、意図的なものです。定義を取得する限り、シェルで関数を実行するために特別なもの(たとえば、対話型シェルがある場合や特定のオプション設定)は必要ありません。

llしたがって、次のように定義すると機能-iエイリアスの代わりにsudoのショートカットで直接使用できます。

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これは追加ボーナスです。

この回答と説明が役立つことを願っています。

関連情報