AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 61321
Accepted
Tanktalus
Tanktalus
Asked: 2009-09-02 12:44:48 +0800 CST2009-09-02 12:44:48 +0800 CST 2009-09-02 12:44:48 +0800 CST

如何通过 sudo 传递别名

  • 772

我有一个别名,可以将一些参数传递给我经常使用的工具。有时我自己运行,有时在 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 能够找到的地方。但有时别名非常方便,所以这是不得已而为之。

shell
  • 12 12 个回答
  • 20349 Views

12 个回答

  • Voted
  1. Slizzered
    2010-09-08T13:58:37+08:002010-09-08T13:58:37+08:00

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

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

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

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

    • 52
  2. Insyte
    2009-09-02T14:36:28+08:002009-09-02T14:36:28+08:00

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

    正确的方式

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

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

    例子:

    insyte$ alias sid='sudo id'
    insyte$ sid
    uid=0(根) gid=0(根) 组=0(根)
    

    简单的方法

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

    root# echo 'alias fb="echo foo bar"' >> /root/.bashrc
    根#退出
    出口
    insyte$ sudo -i
    根#fb
    富吧
    
    • 12
  3. Best Answer
    Tanktalus
    2009-09-02T14:55:37+08:002009-09-02T14:55:37+08:00

    我希望我可以将两个答案标记为“正确”。结合Insyte的正确方法,嗯,有见地的帖子,与Bill Weiss的 awk(或 cut)解决方案,我想出了这个:

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

    现在我将把它放入我的 .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"
     }
    

    这意味着我只需将“s”放在整个命令的前面。代替:

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

    我只是在前面添加了 s。

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

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

    谢谢!

    • 4
  4. Dennis Williamson
    2009-09-02T21:32:58+08:002009-09-02T21:32:58+08:00

    只需有两个别名并使用一个变量

    我看不到使用的原因,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'
    

    现在你有pdandspd加上ctand 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
  5. KitsuneYMG
    2011-03-09T13:25:55+08:002011-03-09T13:25:55+08:00

    来自http://www.shellperson.net/using-sudo-with-an-alias/

    alias sudo='sudo '
    
    • 4
  6. Zoredache
    2009-09-02T13:17:00+08:002009-09-02T13:17:00+08:00

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

    #!/bin/bash
    exec perl -Ilib -I/home/myuser/lib -d $*
    
    • 3
  7. Bill Weiss
    2009-09-02T13:58:48+08:002009-09-02T13:58:48+08:00

    这很粗糙,但在这里有效:

    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
  8. rafsoaken
    2009-10-03T01:21:44+08:002009-10-03T01:21:44+08:00

    为您选择的别名和命令添加“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;
    
    • 3
  9. sixerjman
    2011-06-23T07:35:13+08:002011-06-23T07:35:13+08:00

    正如多次发布的那样,在“.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.**
    
    • 3
  10. geocar
    2009-09-02T14:41:37+08:002009-09-02T14:41:37+08:00

    你想要这样的东西:

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

相关问题

  • 如何在 Mac OS X 上的 shell 脚本中检索绝对文件名?

  • 强制 rsync 进入非交互模式

  • ssh 中类似 Bash 的命令替换或如何从 ssh *client* 请求内容?

  • unlink 和 rm 有什么区别?

  • 如何将 VAR 从子 shell 导出到父 shell?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve