在 CentOS 7 上,我在 中安装了一些可执行文件/opt/app-version/bin/executable
。这些可执行文件具有以下权限:
rwxrwxr-x. 500 500
路径中每个目录的所有权/opt/app-version/bin/
为500 500
--except /opt
,即root root
。
我的第一个问题:这是什么500 500
业务?鉴于我使用安装了可执行文件sudo
,所有者和组不应该是吗root
?
我以 root 身份运行以下命令来创建指向可执行文件的符号链接/usr/local/bin/
:
ln /opt/app-version/bin/executable /usr/local/bin/executable --symbolic
我可以executable
作为普通用户从命令行运行,但不能作为普通用户使用sudo
。
運行sudo executable
回報sh: executable: command not found
。
运行sudo echo $PATH
表明/usr/local/bin/
在 sudo 环境中是。(或者是这样的?我看到的是超级用户环境$PATH
的内容,还是调用的用户的环境的内容?CentOS 是否为使用 运行的命令创建一个新环境,还是仅在调用者的环境中运行该命令?)$PATH
$PATH
sudo
sudo
运行将返回具有所有权的sudo ls -la /usr/local/bin/executable
列表。(真的默认创建全局可编辑链接吗?这不是一个可怕的想法吗?)我的理解是,这表明executable
/usr/local/bin/
lrwxrwxrwx. 1 root root
ln --symbolic
sudo
应该能够跑executable
。
我错过了什么?
答案1
首先查看500 500
,如果您从tar
存档(以及其他人)中还原,则所有者和组将从创建存档的系统中保留:我猜测安装程序会这样做,并且如果还原的用户或组在您的系统上不存在,则会显示数值。
现在看看PATH
,我已经在 Ubuntu 上重现了这一点,似乎sudo
修改了PATH
:在您的命令中,sudo echo $PATH
变量PATH
在调用之前已在原始 shell 中扩展sudo
。有一个/etc/sudoers
带有条目的文件"defaults secure_path="..."
,这似乎就是所使用的。
如果您使用,sudo sh -c 'echo $PATH'
您将更好地了解PATH
正在使用的。请注意,我故意使用sh
而不是,bash
以便绕过一些初始化文件,这可能会改变一些东西,尽管sh
当然会有一些自己的。
在 Ubuntu 上,该secure_path
行确实包含/user/local/bin
,但 CentOS 可能有所不同(两者都源自 Debian,但根据man sudoers
SELinux 可能会覆盖一些条目)。据我所知,您至少有四个选项:-
- 修改
secure_path
以包含“/usr/local/bin”。 - 将链接放入 中定义的目录之一
secure_path
。 - 使用
su -c "{command} {parameters}"
而不是sudo {command} {parameters}
。 - 使用与原始 shell具有相同初始化的
sudo -s
根,然后从那里调用您的可执行文件并退出。bash
PATH
我还发现了很多讨论和一些其他可能的解决方案这里。