web-dev-qa-db-ja.com

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

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

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

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

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

ツールをrootとしてデバッグする必要がある場合があるので、実行する代わりに:

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が見つけられる場所に置くことです。しかし、エイリアスは非常に便利な場合があるため、最後の手段です。

32
Tanktalus

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

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

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

UpdateDennis 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'

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

ありがとう!

4
Tanktalus

veryエレガントなソリューションはArchlinux-Wikiにあります:

alias Sudo='Sudo '
# whitespace ---^

すべてのエイリアスをSudoに渡すように機能します。

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

50
Slizzered

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

正しい方法

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

次にpd ./mytoolを実行すると、デバッグコマンドがrootとして実行されますが、Sudoの利点は維持されます(監査証跡であり、ルートシェル以外では動作しません)。

例:

 insyte $ alias sid = 'Sudo id' 
 insyte $ sid 
 uid = 0(root)gid = 0(root)groups = 0(root)

簡単な方法

Rootの.bashrcにエイリアスを追加し、sudoを実行してrootになるたびにSudo -iを使用します。

 root#echo 'alias fb = "echo foo bar"' >> /root/.bashrc
root# exit 
 exit 
 insyte $ Sudo -i 
 root#fb 
 foo bar 
11
Insyte
4
KitsuneYMG

2つのエイリアスがあり、変数を使用するだけ

変更を簡単にするためにコアエイリアスを1回だけ定義する必要がない限り、awkまたはcutを使用する理由はわかりません。その場合、これは機能します:

# ... 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'

これでpdspdctsctが追加されました。

$ 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'

「Sudo」接頭辞を追加選択したものにエイリアスANDコマンド内から~/.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;
3
rafsoaken

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

#!/bin/bash
exec Perl -Ilib -I/home/myuser/lib -d $*
3
Zoredache

これは大雑把ですが、ここで動作します:

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
3
Bill Weiss

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

エイリアスSudo = 'Sudo'

「man bash」と「help alias」で説明されている理由:

エイリアス:エイリアス[-p] [名前[=値] ...]エイリアスを定義または表示します。

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.**
3
sixerjman

あなたはこのようなものが欲しい:

(alias; echo "exec < /dev/tty") | Sudo bash  -i
1
geocar

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

alias Sudo="Sudo -E"

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

1
Eddie B