在我的 Debian Stretch 系统上,我有
Defaults env_reset
在我的系统中/etc/sudoers
。我想设置我的系统,以便在运行时穿梭,我无需输入通话密码
sudo PYTHONPATH=/usr/lib/python3/dist-packages -- /usr/bin/python3 \
/usr/bin/sshuttle --method auto --firewall
/etc/sudoers.d/sshuttle
所以我创建了一个包含内容的文件
username ALL=NOPASSWD: /usr/bin/python3 /usr/bin/sshuttle --method auto --firewall
但是,我收到错误消息
sudo:抱歉,您不能设置以下环境变量:PYTHONPATH
最优解
- 应该允许我通过设置来运行这一命令
PYTHONPATH
,但不会影响我的安全性须藤一般情况下的设置,即此限制仍应适用于我的sudoers
文件中的其他条目。 - 不会要求我改变穿梭源代码,即它应该适用于上面指定的确切命令,无需修改。
到目前为止我尝试过的:
- 修改
/etc/sudoers.d/sshuttle
文件以读取username ALL=NOPASSWD: PYTHONPATH=/usr/lib/python3/dist-packages /usr/bin/python3 /usr/bin/sshuttle --method auto --firewall
,但这似乎不是有效的语法
笔记:
- 我不想运行整个穿梭通过 sudo 命令,作为 a)穿梭除了防火墙部分(这个问题的命令)之外不需要 root 权限,b)因为这样我总是需要输入我的 SSH 密钥的密码(通常通过以下方式解锁)gpg-代理对于我自己的用户,但不适用于 root 用户)。
答案1
如果你需要的 PYTHONPATH 是不变的,你可以使用/usr/bin/env
(有史以来最被低估的 unix 工具......):
username ALL=NOPASSWD: /usr/bin/env PYTHONPATH=/usr/lib/python3/dist-packages /usr/bin/python3 /usr/bin/sshuttle --method auto --firewall
exec
或者编写一个简短的包装脚本,在调用 python 脚本之前设置环境。
如果 PYTHONPATH 是不是常量,您也可以使用username ALL=NOPASSWD: ALL
,因为用户可以覆盖 sshuttle 使用的任何 python 包,并将代码放在其中执行任何可以想象的操作。