簡體   English   中英

Python Popen:通過sudo將環境變量傳遞給以其他用戶身份運行的命令

[英]Python Popen: pass environment variable to command running as another user with sudo

subprocess.Popen()函數具有一個“ env”參數。 但是使用sudo似乎沒有達到預期的效果。 這是在交互式Python Shell中執行此操作時得到的:

import subprocess
env={"CVS_RSH":"ssh"}
command = "sudo -u user cvs -d user@1.8.7.2:/usr/local/ncvs co file.py"
p = subprocess.Popen(command, stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,env=env,shell=True)
(command_output, error_output) = p.communicate()
p.wait()

1
>>> error_output
b'cvs [checkout aborted]: cannot exec rsh: No such file or 
directory\ncvs [checkout aborted]: end of file from server (consult 
above messages if any)\n'

信息令人分心,所以讓我解釋一下。 我被迫使用古老的CVS,環境變量告訴它使用ssh連接到服務器,而不是使用默認值rsh。 它還需要一個名為CVS_ROOT的環境變量,但是幸運的是,有一個“ -d”選項,但對於我所知道的CVS_RSH卻沒有。

有趣的是,如果我這樣做:

command = "sudo -u user echo $CVS_RSH"
env={"CVS_RSH":"something_else"}
p = subprocess.Popen(command, stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE,env=env,shell=True)
(command_output, error_output) = p.communicate()
p.wait()

0
>>> command_output
b'something_else\n'

也許這是因為回聲實際上不是作為子進程開始而起作用的? 是否可以通過sudo將環境傳遞給以其他用戶身份執行的進程?

使用env參數似乎無法實現。 解決方案似乎是像在shell上一樣通過環境,例如:

command = "sudo -u user CVS_RSH=ssh 
    CVSROOT=:ext:user@2.8.7.2:/usr/local/ncvs cvs co dir/file.py"
p = subprocess.Popen(command, stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE,env=env,shell=True)

奇怪的是,如果我在Python CGI腳本中執行此操作,則可以看到:

cvs [結帳中止]:無法執行ssh:權限被拒絕

cvs [結帳中止]:服務器中文件的末尾(如果有,請咨詢以上消息)

但是,如果我嘗試使用交互式Python Shell,它將超越此范圍,因此它一定是另一個奇怪的問題(因為用戶有權使用ssh),與該問題無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM