如何通过`sudo -s`

时间:2018-03-30 22:29:37

标签: escaping sh sudo

如果我有脚本subtest.sh:

#! /bin/sh

echo "subtest arguments: $@"

variable=${1?"You must provide variable!"}
echo "$variable"

...通过脚本test.sh调用:

#! /bin/sh

echo "test arguments: $@"

variable=$1
sudo -u $USER -s ./subtest.sh "$variable"

这适用于大多数输入字符串。例如:

$ ./test.sh 'abc def'
test arguments: abc def
subtest arguments: abc def
abc def

但是,当输入字符串中有美元符号时,它会中断!

$ ./test.sh 'abc$def'
test arguments: abc$def
subtest arguments: abc
abc

如何正确引用我的变量,使其在另一侧始终不变?

我尝试了各种各样的技巧(例如"'$variable'"$(printf '%q' "$variable")但是如果我设置SHELL=echo我可以看到它们都被挫败了:引号本身会被转义,例如用户输入中的$总是由shell解释!

1 个答案:

答案 0 :(得分:0)

原来这与通常的shell变量处理嫌疑无关。相反,事实证明这只是sudo本身的故意!

在其parse_args.c:566的镜像中找到了这个逻辑:

/* quote potential meta characters */
if (!isalnum((unsigned char)*src) && *src != '_' && *src != '-' && *src != '$')
        *dst++ = '\\';

美元符号明确列入白名单,赢得被转义!但是我要做的所有事情都是为了逃避美元符号自己逃脱......

据我所知,唯一的办法是避免触发-s模式。它适用于普通sudo -u $USER ./subtest.sh "$variable",所以现在我想要记住为什么我[以为我?]首先需要-s: - /