sudoを使用する場合、エイリアスは使用できません


161

私は今日エイリアスをいじっていましたが、エイリアスを使用している間は利用できないようですsudo

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

使用中にエイリアスを使用できない理由はありますsudoか?


あなたは/に/ルート.bashrcの中にそれらのエイリアスを宣言しました
ルチアーノFacchinelli

2
@LucianoFacchinelli:/root/.bashrcsudoを介してコマンドを実行するときに読み取られません。
フリム


@Flimm:どうsudo -iですか?
Evi1M4chine

回答:


251

に次の行を追加します~/.bashrc

alias sudo='sudo '

bashマニュアルから:

エイリアスを使用すると、単純なコマンドの最初の単語として使用されている場合、単語の代わりに文字列を使用できます。シェルは、aliasおよびunalias組み込みコマンドで設定および設定解除できるエイリアスのリストを保持しています。

各単純コマンドの最初の単語は、引用符で囲まれていない場合、エイリアスがあるかどうかが確認されます。その場合、その単語はエイリアスのテキストに置き換えられます。文字「/」、「$」、「 `」、「=」、および上記のシェルメタ文字または引用文字は、エイリアス名に表示されない場合があります。置換テキストには、シェルメタキャラクターを含む有効なシェル入力を含めることができます。置換テキストの最初の単語はエイリアスがテストされますが、展開されるエイリアスと同じ単語は2回展開されません。これは、たとえばlsを "ls -F"にエイリアスでき、Bashは置換テキストを再帰的に展開しようとしないことを意味します。エイリアス値の最後の文字がスペースまたはタブ文字である場合、エイリアスに続く次のコマンドワードもエイリアス展開についてチェックされます

(エンファシス鉱山)。
Bashはコマンドの最初の単語のエイリアスのみをチェックし、その後の単語はチェックされません。つまり、などのコマンドでは、エイリアスsudo llの最初の単語(sudo)のみがbashによってチェックされ、ll無視されます。sudoエイリアス値の末尾にスペースを追加することで、bashにエイリアスの次の単語(つまり)をチェックするように指示できます。


18
かなりいい解決策。
-ulidtko

基本的に問題は、sudoがエイリアスのチェックを行わないようにプログラムされているため、llが見つからないという事実に要約されますか?
kemra102

2
ドキュメントを読むことは明らかに多くのメリットがあります:
biocyberman

4
たとえばsudoフラグを使用すると、これは壊れsudo -H llますか?
マークE.ハセ

1
@mehaaseはい、試しましたが壊れました。
user31389

5

私はそのためのBash関数を作成しましたsudo

指定されたコマンドのエイリアスがあるかどうかを確認しsudo、その場合のリテラルコマンドの代わりにエイリアスコマンドを実行します。

ワンライナーとしての私の機能は次のとおりです。

sudo() { if alias "$1" &> /dev/null ; then $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}" ; else command sudo $@ ; fi }

またはきれいにフォーマット:

sudo() { 
    if alias "$1" &> /dev/null ; then 
        $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}"
    else 
        command sudo "$@"
    fi 
}

それを.bashrcファイルに追加することができます。ソースを忘れずに、または後でターミナルセッションを再起動して変更を適用してください。


これがsudo -H llでも機能する場合は素晴らしいでしょう。
uav

3

エイリアスはユーザー固有です-で定義する必要があります /root/.bashrc


3
それらは既に/root/.bashrcの下にあるため、問題ではありません
-kemra102

1
この回答のようにのみ、rootとしてシェル自体を実行している状況で正しいでしょうsudo -ssudo -i(とのみ、rootシェルを取得するために、それ自体で実行している場合ではないsudo -s command...またはsudo -i command...フォーム)、またはsudo bashあるいはsudo su、またはあなたの状況'ルートログインを有効にし、そのようにルートシェルを使用します。非ルートユーザーがsudo command...自分のシェルから実行する場合、エイリアスの展開は自分の非ルートシェルによって行われます。sudoそれ自体はエイリアスを展開しないため、質問説明されている状況に適用されるように、この答えは間違っています。
エリアケイガン

3

@Alvinsの答えは最短です。間違いない!:-)

しかし、コマンドで再定義する必要のないsudoエイリアスコマンド実行するコマンドラインソリューションを考えsudoましたalias

興味のある人のための私の提案は次のとおりです。

解決

type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\`).*(?=')" | xargs sudo

llコマンドの場合

type -a ll | grep -o -P "(?<=\`).*(?=')" | xargs sudo

説明

エイリアスがある場合(などll)、コマンドtype -aはエイリアス表現を返します:

$type -a ll
ll is aliased to `ls -l'

grepあなたがアクセント`その場合のアポストロフィ'の間のテキストを選択ls -l

そしてxargs、選択したテキストls -lをのパラメーターとして実行しますsudo

はい、少し長くなりますが完全にきれいです ;-) sudoエイリアスとして再定義する必要はありません。


3
ビルトインを使用した場合aliasは、出力がよりきれいになるため、よりシンプルになる場合があります。alias ll出力alias ll='ls -ahlF'
ムル

@muruの提案を組み込んだバージョンは次のとおりalias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudoです。
ACK_stoverflow

最初の質問のポイントは、sudo -i最初にエイリアスコマンドを実行する必要はなく、すぐに実行することで作業を節約することだったと思います。このような複雑なコマンドを使用すると、それは無効になります。前者を実行するだけで、はるかに迅速に実行できます。
Evi1M4chine

1

私は別の素晴らしい解決策を持っています、それは少し信頼を追加します:

sudoタブを押すと、bash補完を使用して、背後の単語をエイリアスで自動的に置き換えます。

これをとして保存すると/etc/bash_completion.d/sudo-alias.bashcomp、シェルの対話型起動時に自動的にロードされるはずです。

_comp_sudo_alias() { from="$2"; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$/\1/" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

次に、新しいターミナルにログインすると、準備完了です。


特に補完を目的としたエイリアスのリストを取得する方法があります。compgen -a
muru

@muru:ありがとう、しかしこの場合、キーではなく値が必要です。したがって、入力されたエイリアスは置き換えられます。エイリアスを入力し(のようにsudo ll)、[TAB↹]を押すと、スクリプトはllエイリアスの割り当てのリストを見つけて、割り当てられているものを切り取り、それを挿入します。(だから、例えばsudo ls -lahvF --color=auto --time-style=long-iso。)
Evi1M4chine

0

sudoエイリアスとして追加する必要のない別のソリューションがあります。Linux Mint 17.3を実行していますが、Ubuntuにかなり似ているはずです。

ルートになっている場合、.profileホームディレクトリから実行されます。ルートの下のホームディレクトリがわからない場合は、次の方法で確認できます。

sudo su
echo $HOME

ご覧のとおり、のホームはrootです/root/。その内容を確認してください:

cd $HOME
ls -al

.profileファイルがあるはずです。ファイルを開き、次の行を追加します。

if [ "$BASH" ]; then
    if [ -f ~/.bash_aliases];then
        . ~/.bash_aliases 
    fi
fi

基本的に、このbashスクリプトは、というファイルをチェックします.bash_aliases。ファイルが存在する場合、ファイルを実行します。

.profileファイルを保存し、エイリアスを作成します.bash_aliases。エイリアスファイルが既に用意されている場合は、この場所にファイルをコピーします

ターミナルを再起動すると、準備完了です!


0

トップ投票の答えは素晴らしいものです。ただしsudo -i、sudoプロンプト(#)を入力して昇格すると、使用するエイリアスがありません。

#プロンプトでエイリアス(およびその他すべて)を使用するには、次を使用します。

sudo cp "$PWD"/.bashrc /root/.bashrc

「$ PWD」は自動的に「/ home / YOUR_USER_NAME」に展開されます


0

@ WinEunuuchs2Unix:$PWD「現在の作業ディレクトリ」に展開します。あなたが欲しいと思います$HOME

また、ほとんどの場合、別のルート.bashrcファイルを用意するのがおそらく最善です。実際、私はそれを実際のファイルに/rootして、ユーザーのホームディレクトリ(例:)でソフトリンクし.bashrc_root、ユーザーの.bashrcファイルから取得します。しばらくして、この特権ユーザーアカウントが存在しなくなって.bashrcも、他のユーザーがルートファイルを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.