首页 > 解决方案 > 在 sudo 内部,当命令内联而不是调用第二个脚本时,未设置环境变量

问题描述

我正在以 root 身份运行 korn shell 脚本,需要对不同的用户(oracle)执行 sudo 以执行一些命令,并且我需要访问 .profile 中设置的环境变量。

如果我调用第二个脚本来执行命令而不是内联执行它们,我会看到不同的行为。

这是一个简单的测试来演示。这有效并显示 $ORACLE_HOME 环境变量:

sudo su - oracle -s /bin/ksh -c "/home/u6vzbes/upgrade/get_oracle_home_test.ksh"

被调用的脚本就是这样的:

#!/bin/ksh
echo 'Called from script - ORACLE_HOME is '  ${ORACLE_HOME}

但这不起作用, $ORACLE_HOME 环境变量为空:

sudo su - oracle -s /bin/ksh -c "
 echo 'Called from sudo - Oracle home is ${ORACLE_HOME}'
"

为什么这两者的工作方式不同?我更喜欢内联执行命令而不是第二个脚本,因为我需要在整个根脚本中多次使用 sudo 到 oracle。仅供参考,环境变量是在 oracle 用户的 .profile 中设置的。

标签: environment-variableskshsudosu

解决方案


' 转义在这种情况下不起作用。以下工作,转义 $ 字符:

sudo su - oracle -s /bin/ksh -c "echo Called from sudo - Oracle home is \${ORACLE_HOME}"

所以删除 ' 并将 \ 放在 $ 前面


推荐阅读