sudoを介してエイリアスを渡す方法


32

よく使用するツールにいくつかのパラメーターを渡すエイリアスがあります。時々私は自分自身として、時にはsudoの下で走ります。残念ながら、もちろん、sudoはエイリアスを認識しません。

エイリアスを渡す方法についてのヒントはありますか?

この場合、デバッグするときにperlのオプションがたくさんあります。

alias pd='perl -Ilib -I/home/myuser/lib -d'

時には、ルートとしてツールをデバッグする必要があるため、実行する代わりに:

pd ./mytool --some params

sudoで実行する必要があります。私は多くの方法を試しました:

sudo eval $(alias pd)\; pd ./mytool --some params
sudo $(alias pd)\; pd ./mytool --some params
sudo bash -c "$(alias pd)\; pd ./mytool --some params"
sudo bash -c "$(alias pd); pd ./mytool --some params"
sudo bash -c eval\ "$(alias pd)\; pd ./mytool --some params"
sudo bash -c eval\ "'$(alias pd)\; pd ./mytool --some params'"

私の現在のpdエイリアスが(後で調整する必要がある場合に)完全に使用されることを保証する、すてきで簡潔な方法を望んでいましたが、私の試みのいくつかはまったく簡潔ではありませんでした。私の最後の手段は、それをシェルスクリプトに入れ、sudoが見つけられる場所に置くことです。ただし、エイリアスは非常に便利な場合があるため、最後の手段です。

回答:


50

非常にエレガントなソリューションをArchlinux-ウィキで見つけることができます:

alias sudo='sudo '
# whitespace ---^

すべてのエイリアスをに渡しますsudo

ソース:http : //wiki.archlinux.org/index.php/Sudo#Passing_aliases


16
これは素晴らしいトリックです!不思議なことに、bashのマンページのエイリアスセクションからの説明:A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
ラッセルデイビス

1
これは本当に受け入れられた答えであるべきです。
エイドリアン・フリューワース

これが機能に対して機能しないのは残念です。
Ciro Santilli新疆改造中心法轮功六四事件

2
注: -passthroughトリックを同時に維持したいのに、オプションsudo再度渡す必要があると仮定しますsudo。これを行うこともできます\sudo。再びオプションを使用するには、を使用します。バックスラッシュはエイリアスを上書きします。(多くの人はそれについて知らないようです)。この方法で、警告なしでファイルを削除することもできます(危険!)、を入力するだけで、一般的に指定されているをオーバーライドできます。alias rm='rm -i'.bash-aliases\rm file-to-delete
構文エラー

11

あなたが何をしようとしているのか、私にはよくわかりません。私は2つの方法を見ることができます:

正しい方法

alias pd='sudo perl -Ilib -I/home/myuser/lib -d'

その後実行 pd ./mytoolとデバッグコマンドがルートとして実行されますが、sudo(監査証跡、ルートシェルからの操作ではない)の利点は維持されます。

例:

insyte $エイリアスsid = 'sudo id'
insyte $ sid
uid = 0(root)gid = 0(root)groups = 0(root)

簡単な方法

エイリアスをルートに追加し、ルートにsudo .bashrcするsudo -iたびに使用します。

root#echo 'alias fb = "echo foo bar"' >> /root/.bashrc
root#exit
出口
insyte $ sudo -i
ルート#fb
フーバー

4

2つのエイリアスを持ち、変数を使用するだけです

使用する理由がわかりません。awkまたはcut、変更しやすくするためにコアエイリアスを1回だけ定義する必要がある場合を除きます。その場合、これは動作します:

# ... in .bashrc ...
pd='perl -Ilib -I/home/myuser/lib -d'
alias pd="$pd"
alias spd="sudo $pd"

上記のようなエイリアスペアを作成する単純な関数を次に示します。

mkap () {
    alias $1=$2
    alias s$1="sudo $2"
}

使用するには:

mkap pd 'perl -Ilib -I/home/myuser/lib -d'
mkap ct 'cat'

これでpdspdプラスctとがありsctます。

$ ct /etc/shadow
cat: /etc/shadow: Permission denied
$ sct /etc/shadow
[sudo] password for dennis:
root:[censored]...
$ alias
alias ct='cat'
alias pd='perl -Ilib -I/home/myuser/lib -d'
alias sct='sudo cat'
alias spd='sudo perl -Ilib -I/home/myuser/lib -d'

4

2つの答えを「正しい」とマークできたらいいのにと思います。Insyteの正しい方法、洞察力に富んだ投稿、Bill Weissのawk(またはcut)ソリューションを組み合わせて、私はこれを思いつきました。

alias spd="sudo $(alias pd | cut -d\' -f2)"

次に、これを.bashrcなどのシェル関数に入れて、ルートとして実行したいすべてのエイリアスの「s」バージョンを作成します。

更新Dennis Williamsonの単純化された関数を少し変更して、少し使いやすくしました:

 salias()
 {
   local a c
   a=$(echo "$1" | cut -f1 -d=)
   c=$(echo "$1" | cut -f2- -d=)
   alias $a="$c"
   alias s$a="sudo $c"
 }

これは、コマンド全体の前に「s」を置くだけでよいことを意味します。の代わりに:

alias pd='perl -Ilib -I/home/myuser/lib -d'

sを前に追加するだけです。

salias pd='perl -Ilib -I/home/myuser/lib -d'

これで完了です。確かに、コンピューターはもう少し仕事をしますが、それがコンピューターの目的です。:-)

ありがとう!


あなたは、マーキングのようにそれらは:)修正の一種である、受け入れられたとしてマーク物事(またはそれにできるはずである)ことができます
ビル・ワイス

正しい-2 つの回答を正しいものとしてマークしたい:-P
タンクタル

3
Slizzeredの答えはなぜですか?alias sudo="sudo "完璧に動作します。
trusktr


3

オプションを含むスクリプトを単純にハックしてから、通常のアカウントとルートのパスであるフォルダーのいずれかに配置する方が簡単ではないでしょうか?それは本当に多くのスクリプトを必要としません。

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*

実際には、$ *ではなく "$ @"である必要があり、それが私が一般的に回避しようとする理由の一部です。;-)動作しますが、それはそれが含むものに比べて多くのディスクスペースを無駄にします。
タンクタル2009

3

これは大雑把ですが、ここでは機能します。

houdini@clanspum:~/ > alias fb
fb='echo foo bar'
houdini@clanspum:~/ > alias fb | awk -F\' '{print $2}'
echo foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}')"
foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}') a b c"
foo bar a b c
houdini@clanspum:~/ > fb
foo bar
houdini@clanspum:~/ > fb a b c
foo bar a b c

ここに不完全なソリューションを貼り付け、修正するために編集しました。現在のものは正しいです。ここで何が起こっているのかを説明するコメントへの最初の人に無料でupvote :)
ビル・ワイス

私はawkよりも簡単な方法を望んでいましたが、!=現実を時々期待します;-)どうやら、「cut -f2 -d \ '」はawkと同じように機能し、少し短くなります。
タンクタル2009

ええ、カットは機能します、私はいつもそれを忘れます。
ビルヴァイス

3

「sudo」プレフィックスを選択したエイリアスに追加し、~/.bashrc同様にコマンド追加します:

#a regular alias
alias pd='perl -Ilib -I/home/myuser/lib -d'

#sudofy (command id, alias pd - add others to this list)
for cmd in id pd;
      do alias "s$cmd"="sudo $cmd";
done;

それはうまくいきません-それが私が始めたところです。やってみた?
タンクタルス2009年

素敵なコンセプト。でもalias sudo="sudo "簡単だと思います。
trusktr

3

数回投稿したように、「。bashrc」で行います:

エイリアスsudo = 'sudo'

理由は「man bash」および「help alias」で説明されています。

alias:alias [-p] [name [= value] ...]エイリアスを定義または表示します。

Without arguments, `alias' prints the list of aliases in the reusable
form `alias NAME=VALUE' on standard output.

Otherwise, an alias is defined for each NAME whose VALUE is given.
**A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.**

1

次のようなものが必要です:

(alias; echo "exec < /dev/tty") | sudo bash  -i

私は間違っているかもしれませんが、ISTR bash -i(i =インタラクティブ)はv4.0のみです。そのため、bashv3 がまだ実行されている古いサーバーでは、これはおそらく失敗します。しかし、私は間違っていることを証明だれでも、先に行く;)
でSyntaxError

@syntaxerror-間違って覚えています。-iBourneシェルです。参照:pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
geocar

うわー、6歳以上の投稿についてはすぐに返事を受け取ることを期待していなかった...どうしてそうだ、私#!/bin/bash -iはシバンの後、それを明らかに同じではない(?)と混同したかもしれない。スクリプトで(「ライブ」コマンドラインではなく)使用historyして、長い話を短くするbash-iはなくするにはオプション必要になりますが、「のみ」bashv3がインストールされているサーバーで作業することはできませんでした。そして、それは事実です。
構文エラー

1

プロダクションボックスで行うのが最も賢明かどうかはわかりませんが、ローカルで使用しています

alias sudo="sudo -E"

-E(環境を保存)オプションは、sudoers(5)のenv_resetオプションをオーバーライドします。一致するコマンドにSETENVタグがあるか、senvers(5)でsetenvオプションが設定されている場合にのみ使用できます。


-1

エイリアスをルートの.bashrcに追加するか、コマンドの前にsudoを介して.bashrcを実行するだけですか?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)

1
ええと、これもほとんど機能しませんでした。実際には、上記で試したことのいくつかにかなり近いですが、実際のシェル/ sudo構文からはさらに離れています。
タンクタル2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.