Shell
從非root使用者設置環境變數:www-data(Web伺服器)
有一個來自 Gutenprint (/usr/lib/cups/backend/gutenprint53+usb) 的腳本,要使用它,需要設置一個環境變數,即:
sudo BACKEND=printerModel /usr/lib/cups/backend/gutenprint53+usb -sin
在我的 root 帳戶和 sudo 上,我可以毫無問題地使用它,另一方面,我試圖從我的網路伺服器執行它,但我收到以下錯誤:
sudo: sorry, you are not allowed to set the following environment variables: BACKEND
gutenprint53+usb 需要用 sudo 執行,所以我已經用 sudo visudo 添加了以下內容:
www-data ALL = NOPASSWD: /usr/lib/cups/backend/gutenprint53+usb
我的問題是:有沒有辦法讓 www-data 設置所需的環境變數?
重要提示: BACKEND 的值會有所不同,因此我無法使用我的 root 帳戶預先設置它並與 www-data 共享它。
作業系統:Raspbian GNU/Linux 10(破壞者)
與幾乎所有關於
sudo
的問題一樣,答案是編寫一個包裝腳本。在這種情況下,編寫一個 shell 腳本來設置
BACKEND
變數,然後執行程序。例如
#!/bin/sh BACKEND=printerModel export BACKEND /usr/lib/cups/backend/gutenprint53+usb -sin
然後
www-data
允許.../gutenprint53+usb
使用sudo
.如有必要,您可以允許將
www-data
列印機模型傳遞給包裝腳本,但您應該小心檢查傳遞的數據是否有效且安全 - 特別是如果“printerModel”數據由網路(直接或間接)提供使用者。我不知道哪些值對
BACKEND
帶有 的變數有效gutenprint53+usb
,所以我將把它留給你來找出和編碼:#!/bin/sh # INSERT CODE HERE TO VALIDATE "$1" # # This should not test for "known bad" values, instead it # should test for "known GOOD" values and exit immediately # if there is any doubt, anything it does not recognise. # e.g. case "$1" in printerModel) data_is_good=1 ;; AnotherModel) data_is_good=1 ;; *) exit 1 ;; esac [ "$data_is_good" -eq 1 ] || exit 1 BACKEND="$1" export BACKEND /usr/lib/cups/backend/gutenprint53+usb -sin
或者,只擁有多個包裝腳本(每個都有不同的硬編碼
BACKEND
設置)並允許www-data
使用sudo
.