用su模拟sudo的行为

时间:2014-06-21 10:23:24

标签: bash shell su

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

$*不同,即使参数包含特殊字符和空格,这也适用。

答案 1 :(得分:2)

您需要$*而不是$@

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

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

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