Sudo 无法在路径中看到符号链接的可执行文件

Sudo 无法在路径中看到符号链接的可执行文件

在 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$PATHsudosudo

运行将返回具有所有权的sudo ls -la /usr/local/bin/executable列表。(真的默认创建全局可编辑链接吗?这不是一个可怕的想法吗?)我的理解是,这表明executable/usr/local/bin/lrwxrwxrwx. 1 root rootln --symbolicsudo 应该能够跑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 sudoersSELinux 可能会覆盖一些条目)。据我所知,您至少有四个选项:-

  • 修改secure_path以包含“/usr/local/bin”。
  • 将链接放入 中定义的目录之一secure_path
  • 使用su -c "{command} {parameters}"而不是sudo {command} {parameters}
  • 使用与原始 shell具有相同初始化的sudo -s根,然后从那里调用您的可执行文件并退出。bashPATH

我还发现了很多讨论和一些其他可能的解决方案这里

相关内容