问题的原因: 在编译sudo包的时候默认开启了- -with-secure-path选项。
方法1: 在/etc/sudoers文件内增加这么一行:Defaults secure_path=”/bin:/usr/bin:/usr/local/bin:…”, 把要用的命令path包括进去。
方法2: 用命令的绝对路径。
方法3: 使用sudo的env选项,像这样sudo env PATH=$PATH cmd.sh。
方法4: 把脚本拷贝或链接到系统$PATH中。
方法5: 重新编译sudo,不带–with-secure-path选项了.(终极解决办法)。
因为当在Linux下用sudo执行某一命令时,是在原进程(parent process)的基础上fork出来一个子进程(child process),这个子进程是以root权限执行的。然后在子进程中,执行你在sudo后面跟的命令。
在子进程中是无法调用涉及到父进程的状态的一些命令的,所以非系统内置命令会被拒绝。这就是为什么会出现command not found的提示。
解决:先用绝对路径执行吧
==================================================================================================
各位在 Linux 下使用 sudo 時,是否會出現 "command not found" 的錯誤訊息?
這是因為預裝的 sudo 在編譯時,--with-secure-path 採用了預設值,而導致原來 User 的 PATH 環境設置項,在 sudo 時被暫時覆蓋。
--with-secure-path 的詳盡說明如下:
Sudo Installation Notes
--with-secure-path[=PATH]
=================================割割割割割割割割==============
在服务器上执行sudo xxx.sh(某个脚本…,使用非root帐户)时出错:”-bash: sudo: command not found”,
Google之,在http://blog.pcware.cn/it/linux/debian-sudo-command-not-found.html上看到几个解决方法.
- 在/etc/sudoers文件内增加这么一行:Defaults secure_path=”/bin:/usr/bin:/usr/local/bin:…”
- 使用脚本的完全路径,不是办法的办法.
- 使用sudo的env选项,像这样sudo env PATH=$PATH xxx.sh.
- 把脚本拷贝或链接到系统$PATH中.
- 重新编译sudo,不带–with-secure-path选项了.(终极解决办法)
至于出现这个问题的原因则是:在编译sudo包的时候默认开启了- -with-secure-path选项.
===========================================================
在使用ubuntu时发现一些奇怪的现象,明明定义了PATH,而且普通用户也可以调用,sudo却调用不了,报command not found的错误。
google之后知道是编译sudo的时候加入了–with-secure-path,这个选项。
知道了问题就好解决了,要么重新编译sudo,要么在环境配置文件里加一个alias