使用 sudo 运行的自定义脚本 - 未找到命令

使用 sudo 运行的自定义脚本 - 未找到命令

问题:

以 sudo 返回的方式运行脚本

sudo: mount-remove-hiberfile: command not found

信息:

  • 脚本文件夹:'/scripts'(我所有的自定义脚本都保存在这里)

  • 我的用户:'cybex'

cybex@cybex-W55xEU:~$ echo $PATH //和 'sudo echo $PATH' 返回相同的路径

/home/cybex/.rbenv/plugins/ruby-build/bin:/home/cybex/.rbenv/shims:/home/cybex/.rbenv/bin:/home/cybex/.rbenv/plugins/ruby-build/bin:/home/cybex/.rbenv/shims:/home/cybex/.rbenv/bin:/home/cybex/bin:/scripts:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/scripts:/snap/bin

root@cybex-W55xEU:/home/cybex# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/scripts

脚本“mount-remove-hiberfile”无法以普通用户身份运行,因此我需要运行sudo mount-remove-hiberfile

为什么 sudo 检测不到这个脚本?

注意:我发现了一些与此相关的问题,但没有一个能回答我的问题

更新

ls -l /scripts/
total 20
-rwxr-xr-x 1 root root   95 Apr 26 22:45 apt-manage
-rwxr-xr-x 1 root root   40 Apr 26 22:45 apt-update
-rwxr-xr-x 1 root root  769 Apr 28 20:47 create-desktop-file
-rwxr-xr-x 1 root root  370 May 16 22:45 extractgst.sh
-rwxr-xr-x 1 root root 1085 May 16 21:25 mount-remove-hiberfile

更新(包括包含命令和错误和目录的粘贴)

cybex@cybex-W55xEU:~$ pwd
/home/cybex
cybex@cybex-W55xEU:~$ ls -l /scripts/
total 52
-rwxr-xr-x 1 root root   95 Apr 26 22:45 apt-manage
-rwxr-xr-x 1 root root 2283 May 21 16:59 backup
-rwxr-xr-x 1 root root  109 May 21 16:59 check-port
-rwxr-xr-x 1 root root 2185 May 21 16:59 connected
-rwxr-xr-x 1 root root  769 Apr 28 20:47 create-desktop-file
-rwxr-xr-x 1 root root  164 May 21 16:59 download
-rwxr-xr-x 1 root root  370 May 16 22:45 extractgst.sh
-rwxr-xr-x 1 root root 5142 May 21 16:59 firewall
-rwxr-xr-x 1 root root 3881 May 21 16:59 firewall.save
-rwxr-xr-x 1 root root 1085 May 16 21:25 mount-remove-hiberfile
-rwxr-xr-x 1 root root   80 May 21 16:59 portquiz
-rwxr-xr-x 1 root root   84 May 21 16:59 space-used
drwxr-xr-x 1 root root    0 May 21 17:00 tmp
cybex@cybex-W55xEU:~$ sudo mount-remove-hiberfile 
sudo: mount-remove-hiberfile: command not found

答案1

默认情况下,无论如何调用 sudo,sudo 配置都会重置路径。以下是两种解决此问题的常用方法,第一种是永久更改,第二种是 sudo 的命令行参数(您可以将其添加为别名)。

永久性和全球性变化

/etc/sudoers需要修改两个设置:

sudo visudo

在 sudoers 文件中,默认情况下有一个名为的设置,Default env_reset它会从 sudo 调用者 shell 中清除环境设置,即使使用 -E(保留环境)调用 sudo。

在文件中查找名为 的设置env_keep。这决定了哪些环境变量可以传递到使用 sudo 创建的根环境中。默认 sudoers 文件中通常有一系列 env_keep="xxx" 和 env_keep+="xxx" 语句。默认情况下,PATH 不是允许传递的环境变量之一。

将 PATH 添加到其中一个条目或注释掉 env_reset 行。如果没有 env_keep 条目,请查找并在其后Defaults env_reset添加新条目。env_keep = "PATH"

其次,即使您允许 PATH 变量传递到 sudo 环境,该路径在 sudoers 中也会受到设置的限制。Defaults secure_path='...'您可以注释掉此设置,也可以将脚本所在的路径添加到条目中。

之后,sudo 将维护 PATH 变量并执行您的脚本。

命令行解决方法

为了避免修改 sudoers 文件,您可以使用以下语法调用 sudo:

sudo env "PATH=$PATH" <script name>

答案2

默认情况下,sudo 不会使用您的路径,也不会运行 root 的 bashrc 或等效文件。请参阅https://askubuntu.com/q/128413了解完整描述。

相关内容