问题:
以 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了解完整描述。