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


9

私がカスタマイズされている.bashrc具体的には、エイリアスの数とllし、export LS_OPTIONS='--color=auto'

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

sudo envショーHOME=/rootSHELL=/bin/bash

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

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


@ daniel- gelling-私はいつもこのQがXY問題であると感じてきました-meta.stackexchange.com/questions/66377/what-is-the-xy-problem。タイトルは、彼らが何かを望んでいることを示して/root/.bashrcいますが、実際にはQはこのファイルのエイリアスです-これはこれでは不可能です-unix.stackexchange.com/questions/1496/…
slm

@slm私が求めているのは、bashrcにメソッドを追加することです。個人用の.bashrcファイルと、rootの.bashrcファイルで、の-rオプションを「無効にする」ために行ったのと同じcrontabですcrontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}。これはどちらかのユーザーとしてログインしたときに機能しますが、実行するsudo crontab -rとまだ実行されます。
Daniel Gelling

@DanielGelling-私の答えがあなたのシナリオでうまくいくかどうかを確認してください。
slm

回答:


6

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

次のコードをに追加sudo lsすることで、エイリアスを展開できます.bashrc

alias sudo='sudo '

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

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

Defaults env_keep += "LS_COLORS"

これらの設定をsudo ll使用すると、使い慣れた色が表示されます。

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


3

回答してくれた方、ありがとうございman sudoます。

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

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

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


2

バックグラウンド

この質問は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、少なくとも以下を読み取るようにBashを誘導できます$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

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

参考文献


ええ、多少の違いはありますが、ここでは詳しく説明しません;-)。とにかく、私が質問のコメントで述べた状況を手伝っていただけませんか。sudoで関数を使用する.bashrc。特に-rからオプションを削除しますcrontabか?
Daniel Gelling

わかりました、しかしこれは私が実行しなければならないことを意味します:sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'単純なのではなくsudo echo $brc_smurf_env
Daniel Gelling

削除することができますalias。それは単にそれらを表示するためでした。削除する必要がありますsudo bash -ci 'shopt -s expand_aliases; <cmds>'
slm

rootのcrontabを編集するためだけに入力するのは大変です。そのエイリアスを作成しましょう:-P
Daniel

@DanielGelling-うん、シェルの腸のすべての楽しみへようこそ。
slm

0

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


0

/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

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

sudo -i  コマンド引数

ただし、そこでは機能しませんが、で使用できるようにする場合は、簡単に関数に変換できますsudo -i

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


ここにはいくつかの問題があります。いくつかはsudoの動作に、いくつかはbash自体の動作に...

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

一つの方法は次のように実行するだろうsudo shか、sudo bash現代的なのに、sudo(私はsudoのを1.8.19p1でこれをテストしています)のオプションを持っている-sし、-iその目的のために。

したがって、1回の試行は次のようなものになりますsudo -s ll(これはsudo bash -c 'll'$SHELLBashであると想定した場合と同じrcfileです。起動ファイルを読み込まない非ログインモード。基本的には、シェルスクリプトを記述し#!/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 ...。)

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

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

(bashがインタラクティブだった場合は、初期化ファイルを読み取るのに十分なため、ログインシェルは必要ありませんでしたが、これ-lはそれらを読み取る必要があります。)

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

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

したがって、エイリアスの代わりに関数llとして定義した場合、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ため、追加のボーナスになります。

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


DV-私はこれがすでにここにあるものよりも状況を改善しているようには感じません。
slm

1
@slm私は私の答えは何かを追加していると思います。以前の答えから関数sudo -i command argumentsを実行し、エクスポートされた変数を利用できるようにするためのフォームについて言及していないためです。しかし、私の回答がおそらく長すぎて、その情報がそこにいくらか埋もれていたのはわかります。そこで、TL; DRを追加して要約します(調査の技術的な詳細は保持したままです)。もう一度見てください。/root/.bashrc
filbranden
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.