如何通过 sudo 传递别名

如何通过 sudo 传递别名

我有一个别名,它将一些参数传递给我经常使用的工具。有时我以自己的身份运行,有时在 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 别名得到充分利用(以防我以后需要调整它),尽管我的一些尝试一点也不简洁。我的最后手段是将它放入 shell 脚本中,并将其放在 sudo 能够找到的地方。但别名有时非常方便,所以这是最后的手段。

答案1

A非常在 Archlinux-Wiki 中可以找到优雅的解决方案:

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

将所有别名传递给sudo

来源:http://wiki.archlinux.org/index.php/Sudo#Passing_aliases

答案2

我不太清楚你想做什么。我有两种方法:

正确的方式

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

然后执行pd ./mytool将以 root 身份执行你的调试命令,但仍然保留 sudo 的好处(审计跟踪,不在 root shell 之外操作)。

例子:

insyte$别名sid='sudo id'
insyte$ sid
uid=0(根) gid=0(根) groups=0(根)

简单的方法

将别名添加到 root并在您使用 sudo 切换到 root 时.bashrc使用。sudo -i

root# echo ‘别名 fb="echo foo bar"’ >> /root/.bashrc
root#退出
出口
insyte$ sudo -i
根# fb
富吧

答案3

答案4

我希望我能把两个答案标记为“正确”。结合正确的方法英赛特嗯,很有见地的帖子,其中包含来自的 awk(或 cut)解决方案比尔·韦斯,我想到了这个:

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

现在我只需将其放入 .bashrc 或类似文件中的 shell 函数中,然后创建我想要以 root 身份运行的所有别名的“s”版本。

更新:略作修改丹尼斯·威廉森的简单功能使其更易于使用:

 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'

我完成了。当然,计算机做了更多的工作,但这就是计算机的用途。:-)

谢谢!

相关内容