Shell

從非root使用者設置環境變數:www-data(Web伺服器)

  • August 22, 2021

有一個來自 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.

引用自:https://unix.stackexchange.com/questions/665674