題 如何讓sudo保留我的環境變量?


在Solaris 5.10上使用sudo 1.7.4p4,在RHEL4 u6上使用sudo 1.6.7p5,我看不到如何保存我的環境變量,例如$ PYTHONPATH。我已將此行添加到sudoers中,但它沒有任何區別:

Defaults !env_reset

我做錯了什麼,或者sudo安裝是否只是不尊重env_reset標誌?

編輯: 至少在Solaris上,我們發現這個問題取決於shell!如果我們在sudo下運行bash,標準的root shell就是Bourne(sudo bash另一方面,!env_preset將保留環境(包括PATH和LD_LIBRARY_PATH)。這是我不得不說的相當混亂的行為。


45
2018-01-12 13:04


起源


stackoverflow.com/questions/8633461/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


謹慎使用,sudo和變量存在安全問題。

man sudoers 我發現你應該使用

默認為env_reset
默認值env_keep + =“PYTHONPATH OTHERVARIABLE YETANOTHER”

在Ubuntu, sudo 確實保留了一些變量。 sudo -i 更像是以root身份登錄然後運行命令。 兩者都可能不方便,前者為 sudo nano myfile 將根擁有的文件留在你的家裡,而後者則留給你 sudo -i nano myfile 將嘗試打開/ root / myfile。


sudo printenv PATH

並看看它給了什麼。在這裡給出

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

例如。現在跑 sudo visudo 並添加該行

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

替換你之前發現的東西。如果需要,可以為其添加新路徑。

關於圖書館:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Linux發行版需要很多 照顧 PATH,在玩它之前你應該小心。 添加路徑時要特別小心“.“ 要么 /home/username,這是不安全的。

添加路徑的一個危險是它打開了這些路徑上的文件被執行的可能性 root,在系統安全中打開一個可能被惡意軟件利用的窗口。可能還有其他危險。只要確保你知道你在做什麼。通過傳遞 sudo 安全措施可能使您的Solaris像Windows XP一樣安全。


41
2018-01-12 14:13



謝謝你的建議。至少在Solaris上,似乎env_keep只能部分工作,因為它忽略了PATH和LD_LIBRARY_PATH。也許sudo的設置使得它拒絕保留“危險”的變量? - aknuds1
它是否適用於其他可修復的產品,如AKNUDS?你也可以運行sudo sudo -V(是的,兩次sudo!)並看看它說的是什麼。上面的解決方案適用於PYTHONPATH,但PATH看起來很特別。真正的問題是PATH。在Ubuntu中,他們建立sudo故意重置PATH。 - user39559
env_keep為我保留了PYTHONPATH和HOME,所以顯然有一些過濾正在進行中。 - aknuds1
在你修改過的解決方案中,你建議我通過修改secure_path來硬連接sudo PATH,對吧?我不認為我想這樣做。我們可能接近我的問題的答案;我認為sudo是為忽略reset_env而構建的,並且在使用env_keep指定時忽略PATH和LD_LIBRARY_PATH等變量。我想我可以不在sudo下保留PATH / LD_LIBRARY_PATH,這不是什麼大事,但知道為什麼它不起作用仍然很有趣:) - aknuds1
它不起作用,因為 sudo 作家小心翼翼地阻止你這樣做。您不希望加載惡意庫,因為它們是在sudo使用的路徑中找到的。所以,這就是重置的原因。如果您要編寫要由root運行的內容,請將它們複製到相應的系統目錄中。 - user39559


擺弄 sudoers 正如其他人所說的那樣,要謹慎行事。

對於想要保留特定環境變量的簡單案例,更簡單的方法是直接通過sudo傳遞您想要的環境變量(這顯示為 [VAR=value] 在sudo cmdline幫助)。

看到這個小例子,我也為多個變量演示了它。

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

對於原始 PYTHONPATH 問題中的示例,只需使用以下內容:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

為這類事物創建別名非常方便。像這樣:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH'

8
2018-05-10 16:21





您的 Defaults !env_reset 看起來不錯,假設你還沒有用sudo調用sudo -E 選項。

您可以嘗試完全刪除該條目。

你驗證過你正在編輯正確的sudoers文件嗎?我猜它可能是 /etc/sudoers 要么 /usr/local/etc/sudoers 取決於它的安裝方式。你用它編輯了嗎? visudo

你是如何運行sudo的? sudo pythonsudo susudo su -sudo -s還有什麼?只要 sudo pythonsudo su 會保護你的環境。

是什麼 env | grep PYTHONPATH 說?如果沒有,請確保通過運行導出PYTHONPATH export PYTHONPATH 然後再試一次。

是什麼 sudo env | grep PYTHONPATH 說?如果它打印出預期值,則其他東西會覆蓋您的PYTHONPATH值。也許是root的.bashrc或.bash_profile或系統範圍的配置文件。


3
2018-01-12 13:36



我很確定我正在編輯正確的sudoers,安裝前綴對應於sudo。我正在運行sudo作為“sudo su”。不幸的是,幾天后我將不得不回复你的其他建議。謝謝! - aknuds1
嘗試更改一個不重要的設置,如 editor 要么 passprompt 看看你是否有正確的文件。或者使用strace,dtrace,truss或類似的東西,看看它打開了什麼文件。 - Mikel
環境| grep PYTHONPATH,因為我的用戶打印了期望的值,但在sudo下,沒有打印任何內容。編輯sudoers,我可以通過修改“env_keep”來確保保留PYTHONPATH。但是,env_keep不會保留PATH或LD_LIBRARY_PATH。我想sudo有一個安全限制,不保留像PATH和LD_LIBRARY_PATH這樣的變量?也許構建時間設置? - aknuds1
!據我所知,env_reset被忽略,但明天我可以仔細檢查。我很確定env_delete沒有設置,但我也可以檢查一下。 - aknuds1
我已經確認了!env_reset被忽略,並且沒有設置env_delete。 - aknuds1


根據 LD_LIBRARY_PATH的Ubuntu文檔

您必須使用/etc/ld.so.conf.d/*.conf配置文件

然後:

  1. 添加一個 ld.so 配置文件 /etc/ld.so.conf.d/ 與你的道路 LD_LIBRARY_PATH

  2. 使用以下命令更新緩存

    sudo ldconfig -v
    

-1
2018-06-02 09:49



很好,但問題不在於Ubuntu。提示:下次查看問題下的標籤。 - DavidPostill♦