如何通过 sudo 传递别名

Tan*_*lus 32 shell alias sudo

我有一个别名,可以将一些参数传递给我经常使用的工具。有时我以自己的身份运行,有时在 sudo 下运行。不幸的是,当然,sudo 无法识别别名。

有没有人有关于如何传递别名的提示?

在这种情况下,我在调试时有很多 perl 选项:

alias pd='perl -Ilib -I/home/myuser/lib -d'
Run Code Online (Sandbox Code Playgroud)

有时,我必须以 root 身份调试我的工具,所以,而不是运行:

pd ./mytool --some params
Run Code Online (Sandbox Code Playgroud)

我需要在 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'"
Run Code Online (Sandbox Code Playgroud)

我希望有一个不错的、简洁的方法来确保我当前的 pd 别名被充分使用(以防我以后需要调整它),尽管我的一些尝试根本不简洁。我最后的手段是将它放入一个 shell 脚本中,并将它放在 sudo 能够找到的地方。但是别名有时非常方便,所以它是最后的手段。

Sli*_*red 52

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

alias sudo='sudo '
# whitespace ---^
Run Code Online (Sandbox Code Playgroud)

可以将所有别名传递给sudo.

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

  • 这是一个很棒的技巧!出于好奇,bash 联机帮助页中别名部分的解释:`值中的尾随空格会导致在扩展别名时检查下一个单词的别名替换。` (17认同)
  • __注意:__ 假设您确实需要再次将 __option__ 传递给 `sudo`,同时想要保留该 `sudo`-passthrough 技巧。甚至可以这样做:要再次使用选项,请使用`\sudo`。反斜杠将*覆盖*别名。(很多人似乎不知道这一点)。这样,您甚至可以(*危险!*)删除文件而不会*任何*警告,覆盖通常在`.bash-aliases`中指定的`alias rm='rm -i'`,只需键入`\rm file-删除`。 (2认同)

Ins*_*yte 12

我不太清楚你要做什么。我可以看到两种方式:

正确的方式

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

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

例子:

insyte$ 别名 sid='sudo id'
插入$ sid
uid=0(root) gid=0(root) 组=0(root)

简单的方法

将别名添加到 root.bashrcsudo -i在您 sudo 到 root 时使用。

root# echo 'alias fb="echo foo bar"' >> /root/.bashrc
根#退出
出口
insyte$ sudo -i
根# fb
富吧


Tan*_*lus 4

我希望我能将两个答案标记为“正确”。将Insyte的、嗯、富有洞察力的帖子中的正确方法与Bill Weiss的 awk(或 cut)解决方案相结合,我想出了这个:

alias spd="sudo $(alias pd | cut -d\' -f2)"
Run Code Online (Sandbox Code Playgroud)

现在我只需将其放入 .bashrc 或其他内容中的 shell 函数中,然后创建我希望以 root 身份运行的所有别名的“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"
 }
Run Code Online (Sandbox Code Playgroud)

这意味着我只需在整个命令前面加上“s”即可。代替:

alias pd='perl -Ilib -I/home/myuser/lib -d'
Run Code Online (Sandbox Code Playgroud)

我只是在前面加了s。

salias pd='perl -Ilib -I/home/myuser/lib -d'
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

  • 为什么不是 Slizzered 的答案?`alias sudo="sudo "` 工作完美。 (3认同)