1

在下面的代码片段(打算在 init.d 环境中工作)中,我想执行 test.ClassPath。但是,我在设置和传递用户的 .bashrc 中定义的 CLASSPATH 环境变量时遇到了问题。

这是我沮丧的根源:

  • 当以下脚本在使用模式下运行时,它会打印出 CLASSPATH OK(来自 $HOME/.bashrc)
  • 当我以 root 身份运行它时,它也显示 CLASSPATH 正常(我已经使用 CLASSPATH 设置了 /etc/bash.bashrc)
  • 但是当我执行“sudo script.py”(模拟 init.d 启动时发生的情况)时,缺少 CLASSPATH !

CLASSPATH 非常大,所以我想从文件中读取它.. 比如说 $HOME/.classpath

#!/usr/bin/python
import subprocess
import os.path as osp
import os

user = "USERNAME"
logDir = "/home/USERNAME/temp/"
print os.environ["HOME"]

if "CLASSPATH" in os.environ:
        print os.environ["CLASSPATH"]
else:
        print "Missing CLASSPATH"
procLog = open(osp.join(logDir, 'test.log'), 'w')
cmdStr = 'sudo -u %s -i java  test.ClassPath'%(user, ) # run in user
proc = subprocess.Popen(cmdStr, shell=True, bufsize=0, stderr=procLog, stdout=procLog)
procLog.close()
4

2 回答 2

4

sudo默认情况下不会传递环境变量。从手册页:

   By default, the env_reset option is enabled.  This causes
   commands to be executed with a minimal environment containing
   TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER and USERNAME in
   addition to variables from the invoking process permitted by
   the env_check and env_keep options.  This is effectively a
   whitelist for environment variables.

有几种方法可以解决这个问题。

  1. 您可以编辑以使用配置指令/etc/sudoers显式传递CLASSPATH 变量。env_keep这可能看起来像:

    Defaults env_keep += "CLASSPATH"
    
  2. 您可以使用命令运行env命令,该命令允许您显式设置环境。典型的命令行调用可能如下所示:

    sudo env CLASSPATH=/path1:/path2 java test.ClassPath
    

选项 (2) 的明显优势是它不需要对sudoers配置进行处理。

于 2012-06-04T17:16:42.023 回答
1

您可以source ~/.bashrc在启动 python 脚本之前设置环境变量。

于 2012-06-04T17:40:19.920 回答