我有一个可用的 LDAP 身份验证环境。LDAP 服务器在 ubuntu 12.04 机器上,而客户端都是 centos 6.4 机器。最近我按照这篇文章在 LDAP 中配置了 sudoershttp://www.malaya-digital.org/configure-ldap-for-sudo-support-in-ubuntu-server-11-04-64-bit/
一切工作正常,只是使用 sudo 执行命令时 PATH 很奇怪。
以下是 sudo 的 PATH
# sudo printenv PATH
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
看起来上面列出的 PATH 中的所有命令都可以执行,除了 /bin 中的命令。例如
# sudo which node
/usr/local/bin/node
# sudo which zip
/usr/bin/zip
# sudo which ip
/sbin/ip
# sudo which ls
which: no ls in ("/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin") #WTF??
# sudo ls /
sudo: ls: command not found
但是,当使用完整路径在 /bin 中执行命令时,它可以工作。
# sudo /bin/ls /
bin boot dev etc home lib lib64 lost+found media mnt NFS opt proc root sbin selinux srv sys tmp usr var
我读过了路径中的 sudo 问题和通过 ldap 对 sudoers 进行故障排除,但却不知道问题出在哪里。
具有 PATH 设置的 LDAP 条目如下:
dn: cn=defaults,ou=SUDOers,dc=example.dc=com
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOrder: 1
sudoOption: env_reset
sudoOption: secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
答案1
我今天遇到了同样的问题,我相信解决方案只是从选项中删除双引号secure_path
:
dn: cn=defaults,ou=SUDOers,dc=example.dc=com
objectClass: top
objectClass: sudoRole
cn: defaults
description: Default sudoOption's go here
sudoOrder: 1
sudoOption: env_reset
sudoOption: secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
通过用引号括起来,正如您在 的结果中看到的那样sudo printenv PATH
,PATH
包含引号本身。这似乎对应于一条有趣的长路径,其中目录名称包含冒号 --- 这不是您想要的...
您的答案似乎绕过了这个问题,可能是因为末尾的冒号具有附加一些默认路径的特殊含义。尝试sudo printenv PATH
看看发生了什么——在我的情况下它不起作用。
使用我上面建议的 LDIF,您将获得正确的结果PATH
:
$ sudo printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
答案2
我自己找到了解决方案,尽管我不知道确切的原因。
这很简单,在 LDAP 条目中的 secure_path 末尾添加“:”即可解决所有问题。
secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:"