2016-03-06 66 views
2

我想將一個python路徑值添加到不同的環境,因爲我用另一個用戶運行的某些腳本需要設置它。sudo -E不通過PYTHONPATH

現在,奇怪的是,當我運行sudo -E,變量我有我的env就傳給我sudo荷蘭國際集團TO-除了PYTHONPATH用戶沒有。

運行:

TESTVAR=testValue sudo -E bash -c 'echo $TESTVAR' 

將打印 「測試值」,但是:

PYTHONPATH=testValue sudo -E bash -c 'echo $PYTHONPATH' 

不會打印出任何東西。

我想了解是否有任何關於特定變量的特殊情況,sudo行爲與將它們傳遞到不同環境時有所不同。

幫助將不勝感激,謝謝。

+0

'sudo -V'作爲根的輸出? – ninjalj

+0

http://stackoverflow.com/questions/18748045/sudo-e-option-does-not-work/18749090#18749090 http://stackoverflow.com/questions/27045539/scrapy-cannot-import-module-while-其功能於我,PYTHONPATH/27523599#27523599 –

回答

2

因爲PYTHONPATH位於sudo的缺省表中要從環境中移除的「壞」變量(如果未使用env_keep明確保留)。

plugins/sudoers/env.c文件sudo源代碼:

/* 
* Default table of "bad" variables to remove from the environment. 
* XXX - how to omit TERMCAP if it starts with '/'? 
*/ 
static const char *initial_badenv_table[] = { 
    "IFS", 
    . 
    . (Truncated) 
    . 
    "PYTHONHOME",    /* python, module search path */ 
    "PYTHONPATH",    /* python, search path */ 
    "PYTHONINSPECT",   /* python, allow inspection */ 
    "PYTHONUSERBASE",   /* python, per user site-packages directory */ 
    "RUBYLIB",     /* ruby, library load path */ 
    "RUBYOPT",     /* ruby, extra command line options */ 
    NULL 
}; 

正如你可以看到PYTHONPATH就在那裏。

在運行時執行此操作的編譯後的二進制文件是/usr/lib/sudo/sudoers.so

0

由於heemayl said,PYTHONPATH和其他修改程序行爲(並可用於提升權限)的變量被sudo -E忽略。

爲了讓他們有兩種方式:

  • 明確它們作爲參數傳遞給sudo,像這樣:

    sudo PYTHONPATH=... command 
    
  • 配置您的sudoers文件的env_keep變量。例如:

    Defaults env_keep += "PYTHONPATH" 
    

    注意,這條線,是的Defaults部分,可以適用於所有sudoers文件,你想要什麼這可能不是。