【问题标题】:Set env variable inside sudo statement - Linux shell在 sudo 语句中设置环境变量 - Linux shell
【发布时间】:2018-07-09 23:01:35
【问题描述】:

我需要修改环境变量在 sudo 语句中。 sudo 语句包含一些说明。

在示例中,我将环境变量 VAR1 设置为值“ABC”。

然后,在 sudo 语句中(仅在此处),我需要将该值更改为“DEF”。但是在我将值设置为“DEF”后,该值没有改变。 Echo 命令返回“ABC”作为 VAR1 的值。

如何在 sudo 语句中更改/设置变量的值?

这是我运行的代码示例:

#!/bin/bash
export VAR1="ABC"

sudo -u <user> -i sh -c "
         export VAR1="DEF";
         echo $VAR1;
"

echo $VAR1;

额外信息:我尝试了sudo的选项-E,在sudo调用时保留环境变量(来源:https://unix.stackexchange.com/questions/337819/how-to-export-variable-for-use-with-sudo/337820),但结果没有改变:

#env VAR1="DEF" sudo -u <user> -E -i sh -c " [...]"

【问题讨论】:

  • sudo env VAR1="DEF" sh -c '...' 可能会少一些麻烦——你不必担心让你的定义eval-safe,如果你试图从不受信任的来源传递数据,这肯定是一个问题到以升级权限运行的脚本。虽然这当然不能解决双引号导致早期扩展的问题——您确实需要为您的脚本使用单引号(与没有sudo 相同;sh -c "foo=bar; echo $foo" 总是坏的,sudo 或否) .
  • @jww 嗯?问题中有一个 MCVE。

标签: linux bash environment-variables


【解决方案1】:

使用单引号防止外壳插入$VAR1。您需要将 $VAR1 传递给内壳,以便它可以扩展它。

sudo -u <user> -i sh -c '
         export VAR1="DEF"
         echo "$VAR1"
'

将变量扩展引用为prevent globbing and splitting mishaps 也是一个好主意:写"$VAR1" 而不是$VAR1

(分号不是必需的,因为您有换行符。)

【讨论】:

    【解决方案2】:

    试试这个

    export VAR1="ABC"
    
    sudo -u <user> -i sh -c '
             export VAR1="DEF"
             echo "${VAR1}"
    '
    
    echo $VAR1;
    

    正如 John Kugelman 指出的,你应该使用 ' 而不是 " 来包装你的命令以避免 shell 变量插值。此外,当在命令中引用 VAR 时,使用 "${}" 而不是 $,这是对我有什么影响

    【讨论】:

    • 我想不出有什么理由让你写$VAR1 还是${VAR1} 很重要。为什么你认为它会有所作为?
    • 它对我有用,仅使用 $ 对我不起作用,我使用的是 bash,所以应该没有任何问题,老实说,我不知道为什么不起作用
    • 我刚试过。我不需要花括号,但我确实需要将sh 更改为bash(将export 与变量赋值相结合是bash 扩展名)并在@987654333 的末尾添加; @line(它没有将换行符视为语句终止符)。
    • 嗯,这正是我运行的:export V=1; sudo -i bash -c 'export V=2; echo "${V}"; echo "$V";'; echo $V;,只有${V} 和最后一个$V(在sudo cmd 之外)正在打印。你知道为什么吗?我不是 bash 专家,这真的很有趣
    • 它似乎是特定于版本的。我看到了你在运行 bash 3.2.57 的 OS X 上看到的,但在运行 4.2.37 的 Linux 上看不到。
    猜你喜欢
    • 2011-09-03
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2016-01-26
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多