【问题标题】:Emulating sudo's behaviour with su用 su 模拟 sudo 的行为
【发布时间】:2014-06-21 10:23:23
【问题描述】:

我正在尝试围绕su 编写一个包装器,使其更像sudo,以便su_wrapper foo bar baz == su -c "foo bar baz"

但是,我不确定如何解决这个问题。我想出了这个:

su_wrapper ()
{
  su -c "$@"
}

但是,在上面,只能有一个参数;这会因多个参数而失败(因为su 将它们视为自己的参数)。

还有一个问题:由于参数是通过shell传递的,我想我必须明确指定shell以避免其他问题。也许我想做的可以用伪bash(!)表示为su -c 'bash -c "$@"'

那么,我怎样才能让它接受多个参数呢?

【问题讨论】:

  • 你的动机是什么?...
  • @shx2,我真的厌倦了在使用 su 时必须引用一些东西,而且我不允许在这些框上使用 sudo。
  • (为了记录,我不清楚为什么人们投票关闭。这是关于通用计算。susudo 是程序员使用的工具。)

标签: bash shell su


【解决方案1】:

使用printf "%q" 转义参数,以便将它们用作函数的字符串输入:

su_wrapper() {
    su -s /bin/bash -c "$(printf "%q " "$@")"
}

$* 不同,即使参数包含特殊字符和空格,它也有效。

【讨论】:

    【解决方案2】:

    您需要$* 而不是$@

    su_wrapper() {
        local IFS=' '
        su -c "$*"
    }
    

    请参阅Special Parameters section in the Bash Reference Manual,了解$*$@ 之间的区别。

    我添加了local IFS=' ' 以防IFS 设置为其他内容(在阅读了$* 的作用之后,应该清楚为什么要确保将IFS 设置为空格)。

    【讨论】:

    • su_wrapper ls "foo bar"su_wrapper find . -name '.*' 会失败
    • @thatotherguy 你是对的,但你总是可以正确引用参数以获得你想要的。
    • 但是你必须引用它们两次,不像 sudo。
    • @thatotherguy 对,但对应的是重定向更容易:su_wrapper "ls > file",无需摆弄tee 或类似的技巧。所以你在一方面失去的,你在另一方面得到它。选择你的阵营:)
    • 如果你想传入一个完整的、带引号的命令,为什么不直接使用 su?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多