从非 root 用户设置环境变量:www-data(Web 服务器)

从非 root 用户设置环境变量:www-data(Web 服务器)

Gutenprint (/usr/lib/cups/backend/gutenprint53+usb) 有一个脚本,要使用它,需要设置一个环境变量,即:

sudo BACKEND=printerModel /usr/lib/cups/backend/gutenprint53+usb -sin

在我的根帐户和 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(破坏者)

答案1

与几乎所有有关 的问题一样sudo,答案是编写一个包装脚本。

在这种情况下,编写一个 shell 脚本来设置BACKEND变量,然后运行程序。

例如

#!/bin/sh

BACKEND=printerModel
export BACKEND

/usr/lib/cups/backend/gutenprint53+usb -sin

然后允许www-data运行该脚本(但不是.../gutenprint53+usbsudo

如有必要,您可以允许www-data将打印机模型传递给包装器脚本,但您应该小心检查传递的数据是否有效且安全 - 特别是如果“printerModel”数据由 Web(直接或间接)提供用户。

我不知道什么值对于BACKEND变量 with有效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.

答案2

阿帕奇支持环境变量。 最简单的方法是在 httpd.conf 或 .htaccess 中设置它

SetEnv BACKEND 'printerModel /usr/lib/cups/backend/gutenprint53+usb -sin'

问题是如何动态填充它。您可以在 .htaccess 文件中进行设置,因为它不需要重新启动 apache。写起来也会更容易。

如果某些工作人员或除 www-data 之外的其他东西试图访问该变量,它将无法工作。

此外,如果您在基于 debian 的系统上运行 apache,您还可以将该变量插入到 /etc/apache2/envvars 中。

相关内容