普通用户可以运行该脚本,但 root 无法找到它。
我有一个简单的脚本,保存在 中~/bin
。我更新了.profile
文件以将此文件夹包含在 PATH 中。我可以进入终端,在任何目录中工作,输入脚本的名称,它就可以正常运行。但如果在该终端中切换到 root,则找不到该脚本。我假设某个地方的某个文件需要新的 $PATH 更新,但我不知道是哪一个。
答案1
如果你正在使用sudo
,很可能是这种情况,有一个安全策略会将 $PATH 环境变量修改为安全路径(在文件中定义/etc/sudoers)。 这〜/箱目录不包含在默认目录中安全路径设置在sudoers文件,因此运行sudo script
将不起作用,但是sudo ~/bin/script
可以。
您可以将脚本放在sudoers配置文件(即在/usr/本地/bin)使其可直接访问。安全路径也可以在配置文件中更改,但不建议这样做。
答案2
为了暂时防止重置单个命令sudo
的路径,而不修改任何全局配置,您可以执行以下操作:secure_path
sudo env PATH=$PATH command
command
您想要运行的可执行文件的名称在哪里PATH
?
您可以为此创建一个别名,并添加到您自己的(不是 root 的)~/.bashrc
...类似
alias sudo2='sudo env PATH=$PATH'
然后您可以使用自己的 PATHsudo2 command
来运行可执行文件。sudo
答案3
为什么以 root 身份运行脚本会失败?
在这种情况下,您必须检查有效用户的路径root
...
运行这个:
(前两行是提示符加命令。最后一行是命令的输出。)
$ sudo su -
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
对于将脚本放在何处以供其他人运行的建议:
为您的项目创建一个子目录/opt
,并将项目的执行脚本放在那里。这个位置将在同一分区上全新安装操作系统后继续存在(当然,无需格式化)。
脚本的根区域可以位于:
/opt/myprojectname/myscriptfiles/
现在你可以将脚本链接/usr/local/bin/
到
$ sudo ln -s /opt/myprojectname/myscriptfile/myscript.sh /usr/local/bin/myscript.sh`
您不必更改root
$PATH 变量,因为从上面的测试可以看出,它已经存在了。
因此,您无需更改根路径,而是可以更改路径来搜索/opt/myprojectname/myscriptname
或者,您可以将您的 链接~/bin/myscript.sh
到/usr/local/bin/myscript.sh
。
答案4
正如其他人所说,特权环境与用户环境不同,这是有充分理由的。主要有两种解决方案:(i) 使用路径调用脚本,或 (ii) 将脚本 chown 为 root 并将它们移动到文件层次结构中的更高位置(例如,/usr/custom/bin,但无论如何都可以),然后更新用户的 PATH,而不是尝试执行相反的操作。