.bashrc
をいくつかのエイリアス、特にll
とexport LS_OPTIONS='--color=auto'
でカスタマイズしました
残念ながら、これをSudo
と一緒に使用すると機能しないため、/root/.bashrc
も変更しましたが、これによる違いはないようです。
Sudo env
はHOME=/root
およびShell=/bin/bash
を表示します
/root/.bashrc
の設定を使用するSudo
コマンドを取得するにはどうすればよいですか?
これはbash
がインタラクティブに実行された場合にのみ発生することを理解しているため、カスタマイズ方法に関する他の提案を受け入れます。
答えてくれてありがとうman Sudo
より慎重に。
Sudo -s
コマンドが指定されていない場合、対話型シェルが実行されます。
このインタラクティブシェルは/root/.bashrc
したがって、私のカスタマイズが含まれます。
コマンドを個別に入力する必要がありますが、これで問題ありません。
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
$
この動作は、エイリアスにアクセスできると期待してはいけないというヒントです。しかし、私たちは続けます...
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
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
が正常に実行されました。
上記の方法を使用している場合、これらも同様に機能するはずです。
$ Sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env'
ran alias from /root/.bashrc
var from /root/.bashrc
これらも期待どおりに機能します。
$ 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
のコンテンツは取得しません。
TL; DR:Sudo -i
を使用して、関数で定義された/root/.bashrc
(エイリアスではない)を実行し、そのファイルからエクスポートされた変数にアクセスすることもできます。
須藤 -私コマンド引数
ただし、エイリアスはそこで機能しませんが、Sudo -i
で使用できるようにしたい場合は、エイリアスを関数に簡単に変換できます。
完全な分析と詳細については、以下をお読みください。
ここにはいくつかの問題があります。いくつかはSudoがどのように機能するか、いくつかはbash自体がどのように機能するかです...
デフォルトでは、Sudo
はコマンドのみを検索してシェルをバイパスするため、Sudo ll
を実行すると、$PATH
のいずれかのディレクトリにll
実行可能ファイルがある場合にのみ機能します。したがって、エイリアス(または関数)を使用するには、プロセスの一部としてシェルが呼び出されるようにする必要があります。
1つの方法は、Sudo sh
やSudo bash
などを実行することですが、最近のSudo
(Sudo 1.8.19p1でこれをテストしています)には、そのためのオプション-s
および-i
があります。
したがって、1回の試行はSudo -s ll
(Sudo bash -c 'll'
がBashであると想定すると$Shell
に相当します。これは、先ほどお話ししたrcfile
に基づいているようです)ですが、Shellを非対話型、非ログインモード。起動ファイルを読み取りません。基本的には、シェルスクリプトを記述し、#!/bin/bash
を使用して実行する場合と同じです。 ~/.bashrc
にあるエイリアス(および関数)は、そのスクリプトからアクセスできません...
その次は、ログインシェルを作成する-i
オプションです。起動ファイルを読み取りますので、これはより有望です!それでも、Sudo -i ll
(Sudo bash -l -c 'll'
と同等)はまだ機能しません。それで、didがll
エイリアスの定義を読み取ることを考えると、それはどのように可能ですか?
さて、ここでの次の説明は、シェルがインタラクティブな場合を除いて、デフォルトではbashはエイリアスを展開しないということです... Sudo -i
(またはbash -l
)で開始されるこのシェルはloginシェルですが、まだインタラクティブではありません。
したがって、次のステップはinteractiveシェルを取得することで、が機能します:
Sudo bash -i -c 'll'
(loginとinteractiveの両方を使用しても問題ありませんが、もちろん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
から直接アクセスできる必要があります。これは追加のボーナスです。
この回答と説明がお役に立てば幸いです。
/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
#
/ etc/sudoersファイルには多数の設定があり、Sudoコマンドを実行するときの環境を設定します(たとえば、PATHに信頼できる場所のみがあることを確認する)が、これから何を望んでいるかに依存します。シェルで実際のコマンドを実行して環境をセットアップする必要がある場合は、目的を達成できない可能性があります。 sudoingは特にrootログインシェルを提供しないので、通常のプロファイルをセットアップしません。