首頁 >後端開發 >Python教學 >當 `shell=True` 時,為什麼 `subprocess.Popen` 不能使用清單中的變數參數?

當 `shell=True` 時,為什麼 `subprocess.Popen` 不能使用清單中的變數參數?

Linda Hamilton
Linda Hamilton原創
2024-11-26 05:46:17147瀏覽

Why Doesn't `subprocess.Popen` Work with Variable Arguments in Lists When `shell=True`?

將變數傳遞給subprocess.Popen:為什麼它不能使用列表中的參數

當使用subprocess.Phon 調用另一個Pyt 時調用另一個Pyt 時腳本時,您可能會遇到傳遞儲存在變數中的參數的問題。當您嘗試執行以下命令時,可能會發生這種情況:

p = subprocess.Popen(
    ["python mytool.py -a ", servers[server]['address'], "-x", servers[server]['port'], "-p", servers[server]['pass'], "some additional command"],
    shell=True,
    stdout=subprocess.PIPE
)

問題:

問題的出現​​是由於使用了 shell=True。啟用此標誌後,傳遞給 Popen() 的參數在 Unix 系統上的處理方式有所不同。 shell 將參數解釋為單一命令字串,這可能會導致意外行為。

解:

要解決此問題,放棄使用shell=True。相反,直接建立一個參數清單並將其傳遞給 Popen()。以下是一個範例:

import sys
from subprocess import Popen, PIPE

# Populate list of arguments
args = ["mytool.py"]
for opt, optname in zip("-a -x -p".split(), "address port pass".split()):
    args.extend([opt, str(servers[server][optname])])
args.extend("some additional command".split())

# Run script
p = Popen([sys.executable or 'python'] + args, stdout=PIPE)
# ... Use p.stdout here
p.stdout.close()
p.wait()

透過刪除 shell=True 並手動建立參數列表,可以確保變數正確傳遞給被呼叫的腳本。

安全警告:

需要注意的是,為涉及外部輸入的命令傳遞 shell=True 可能會帶來安全風險,如子流程文件。如果您在腳本中處理使用者提供的輸入,強烈建議避免使用 shell=True 以防止潛在的漏洞。

以上是當 `shell=True` 時,為什麼 `subprocess.Popen` 不能使用清單中的變數參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn