如何设置 sudo 命令的路径

如何设置 sudo 命令的路径

如果我发出

sudo my-command

Linux 如何寻找它my-command

在我的 PATH中my-command。我可以毫无问题地调用它。但是,当我使用 调用它时sudo,我会得到command not found。如何克服它?

编辑:“可能重复”所选答案是错误的,至少没有切中要点。来自 terdon 的这个答案是正确的。

答案1

secure_path这通常由中的选项设置/etc/sudoers。来自man sudoers

 secure_path   Path used for every command run from sudo.  If you don't
               trust the people running sudo to have a sane PATH environ‐
               ment variable you may want to use this.  Another use is if
               you want to have the “root path” be separate from the “user
               path”.  Users in the group specified by the exempt_group
               option are not affected by secure_path.  This option is not
               set by default.

要运行默认命令之外的命令$PATH,您可以

  1. 使用完整路径:sudo ~/bin/my-command;或

  2. 将包含命令的目录添加到secure_path。运行sudo visudo并编辑安全路径行:

    Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/youruser/bin/"
    

    保存该文件,下次运行时sudo,该目录~/bin将处于原来的状态$PATH

答案2

您也可以使用sudo env PATH=$PATH ...rest_of_command_here...。由于输入起来不太方便,我添加了一个别名alias sudop='sudo env PATH=$PATH'sudop(而不是别名sudo本身)提醒我,我正在保留当前的环境路径。

答案3

这是我用来解决问题的方法:

sudo cp $(which my-command) /usr/bin
...

which命令在非 root 的子 shell 中执行,因此它能够找到my-command,然后 sudo 将可执行文件复制到用户root可以访问的路径。对于安全性来说不是很好,但对于运行命令运行后立即被销毁的 docker 镜像来说,这是可以的。

答案4

sudo如何将可执行文件符号链接或复制到有权访问的bin 目录

我正在使用一个名为的文本编辑器micro。我运行sudo micro /etc/sysctl.conf后出现以下错误:

sudo: micro: command not found

这是因为micro它在我的~/bin目录中,但这只是我的用户的个人 bin 目录。要授予sudo对它的访问权限,我可以对其进行符号链接或将其复制到/usr/bin

# symlink it (my preference)
# Create a symlink at /usr/bin/micro which points to my personal ~/bin/micro
# executable
sudo ln -si ~/bin/micro /usr/bin

# OR: copy it
sudo cp -i ~/bin/micro /usr/bin

完成。现在我运行时sudo micro它运行正常。

相关内容