如何通过sudo传递别名

我有一个别名,通过一些parameter passing给我经常使用的工具。 有时我像自己一样跑步,有时在sudo下跑步。 不幸的是,当然,sudo不能识别别名。

有没有人有一个关于如何通过别名通过?

在这种情况下,当我正在debugging时,我有一些perl选项:

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

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

 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别名被完全使用(以防我稍后需要调整),尽pipe我的一些尝试并不简单。 我最后的手段是把它放在shell脚本中,并把它放在sudo能find的地方。 但别名有时候非常方便,所以这是最后的手段。

    一个非常优雅的解决scheme可以在Archlinux-Wiki中find:

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

    将所有别名传递给sudo

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

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

    正确的方式

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

    然后执行pd ./mytool将以root pd ./mytool执行你的debugging命令,但是仍然保留了sudo的好处(审计追踪,不是在一个root shell下运行)。

    例:

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

    简单的方法

    将别名添加到根目录的.bashrc并在sudo到root的时候使用sudo -i

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

    只要有两个别名,并使用一个variables

    我没有看到使用awkcut的原因,除非只定义一次核心别名,以便修改。 如果是这样的话,那么这个工作:

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

    这是一个简单的function,使上面的别名对:

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

    使用:

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

    现在你有pdspd加上ctsct

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

    我希望我能把两个答案标记为“正确的”。 将Insyte的这个洞察力强的post与Bill Weiss的awk(或cut)解决scheme结合起来,我想出了这个:

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

    现在,我将把它放到我的.bashrc中的一个shell函数中,然后创build所有我希望以root身份运行的别名的“s”版本。

    更新 : 丹尼斯·威廉姆森的简单function稍作修改,使其更容易使用:

      salias() { local ac 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' 

    我完成了。 当然,电脑做了更多的工作,但这是一台电脑的用途。 🙂

    谢谢!

    简单地修改包含选项的脚本,然后将其放置在常规帐户和根目录的文件夹之一中的某个位置是不是更容易? 它真的不需要太多的脚本。

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

    这很粗糙,但在这里工作:

     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}') abc" foo bar abc houdini@clanspum:~/ > fb foo bar houdini@clanspum:~/ > fb abc foo bar abc 

    在你的~/.bashrc 添加一个“sudo”前缀到选定的别名和命令 ,如下所示:

     #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; 

    发布了几次,在“.bashrc”中执行:

    别名sudo ='sudo'

    之所以被解释为“男子气概”和“帮助别名”:

    别名:别名[-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.** 

    你想要这样的东西:

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

    我不知道这是在生产箱上做的最明智的事情,但在当地使用

     alias sudo="sudo -E" 

    -E( 保留环境 )选项将覆盖sudoers(5)中的env_reset选项)。 只有当匹配命令具有SETENV标签或在sudoers(5)中设置了setenv选项时才可用。

    你可以将别名添加到根目录的.bashrc,或者只需在命令之前通过sudo执行.bashrc?

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