如果我发出
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
,您可以
使用完整路径:
sudo ~/bin/my-command
;或将包含命令的目录添加到
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
它运行正常。