0%

sudo 时命令不存在的原因和解决方法

在执行 npm 时,系统会在 PATH 中寻找第一个匹配到的 npm 位置,此位置和 which npm 得到的结果相同。

然而,在执行 sudo npm 时,系统的环境变量会默认重置为 secure_path ,执行 sudo -l 可以查看 sudo 受到的限制。结果最后一行便是使用 sudo 时的环境变量。

1
2
3
4
5
6
$ sudo -l
Matching Defaults entries for root on this host:
!visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION
LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME
LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

因此,自己在环境变量中已设置的但不在以上位置的命令将会失效。

解决方法有两种:

  1. 将需要用到的命令软链到上述文件夹中

  2. 修改配置,使 sudo 切换时不重置环境变量

    1
    2
    3
    4
    $sudo visudo 
    # Defaults env_reset # 注释掉原有配置
    # Defaults env_keep="…" # 注释掉指定的变量保持
    Defaults !env_reset # 修改为不重置环境