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+usb
)sudo
。
如有必要,您可以允许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 中。