• 解决 sudo 执行命令时找不到命令问题


    问题

    不知道大家有没有遇到一个问题,就是加sudo后命令no found,即使我们已经将export path加到了 .profile 或者 /etc/profile
    例如
    go 可以,sudo go 不可以
    kubectl 可以,sudo kubectl 不可以
    minikube 可以,sudo minikube 不可以

    问题原因

    Linux 系统中在使用 sudo 执行命令时是为当前用户赋予临时的 root 权限,考虑到安全性等相关问题,sudo 执行命令时会重置 PATH,此时 PATH 中是不包含用户配置的很多命令的路径的。所以会发现 sudo 执行命令时可能存在找不到的情况。
    比如我们使用 Node.js 的版本管理工具如:nvm 安装的 Node.js 存放于 ~/.nvm/version/node/vx.x.x/bin 中,并且 nvm 会在 PATH 中加入该路径,正常是可以使用 node 命令,但是 sudo node 时由于 PATH 被重置, node 命令是找不到的。我们一般情况下不会用 sudo 去运行 node 命令,但是很多时候我们 npm install -g 安装的命令,如果需要操作系统某些文件或功能,是需要 sudo 执行的。
    比如我们在用arkade安装minikube时,提示我们有两种方式将其添加进命令,一种是通过添加到path,另一种是移动到/usr/local/bin,其中第一种就会受sudo的影响

    2022/05/15 23:42:56 Copying /tmp/kubectl to /home/ubuntu/.arkade/bin/kubectl
    
    Wrote: /home/ubuntu/.arkade/bin/kubectl (46.91MB)
    
    # Add arkade binary directory to your PATH variable
    export PATH=$PATH:$HOME/.arkade/bin/
    
    # Test the binary:
    /home/ubuntu/.arkade/bin/minikube
    /home/ubuntu/.arkade/bin/kubectl
    
    # Or install with:
    sudo mv /home/ubuntu/.arkade/bin/minikube /usr/local/bin/
    sudo mv /home/ubuntu/.arkade/bin/kubectl /usr/local/bin/
    
     arkade needs your support, learn more: https://my.arkade.dev
    

    解决方案

    软链接方案

    在使用 sudo 执行命令时,被重置的 PATH 中是包含 /usr/local/bin 的,所以可以将需要的命令通过软链接的方式 ln -s /home/xxx/.nvm/version/node/vx.x.x/bin/node /usr/local/bin 放到 /usr/local/bin 中,然后 sudo 运行命令就可以正常执行了。
    或者使用mv也行

    修改 sudo 时重置 PATH 的默认值

    通过软链接的方式对于少部分命令是可行的,还是 npm install -g 的这个场景,如果安装了很多需要 sudo 权限执行的命令,每个都通过软链接的方式比较繁琐,那么我们可以通过修改 sudo 时重置 PATH 的默认值,将 ~/.nvm/version/node/vx.x.x/bin 这个路径加入到 PATH 中。

    使用 sudo vim /etc/sudoers 打开文件,然后找到 secure_path 这一行,在其中加入 ~/.nvm/version/node/vx.x.x/bin,然后通过 :wq! 保存即可,这里使用 vim 强制保存是因为 /etc/sudoers 文件是只读权限。

    修改 sudo 时重置 PATH 的默认值方式需要多加注意安全问题,保证加入到 PATH 的路径中包含的命令是可以被信任的,如果不能够完全信任的情况下,还是建议使用软链接的方式针对性处理需要用到的命令。

    当然把 export PATH=\(PATH:\)HOME/.arkade/bin/ 添加到profile中还是需要的,这里只是列出这个path可信任,但是前提是要先加到PATH中去

    转载自:解决 sudo 执行命令时找不到命令问题

  • 相关阅读:
    努力的一分不会少
    C语言中的数组的访问方式
    代码的规划与规范化
    Manjaro中源码安装gcc7.1
    周围都是敌人,方法总比问题多
    elementary os 0.4.1下编译GCC-7.1源码并安装成功
    C语言中的基础知识变量探讨
    19年的桌面KDE的风雨和陪伴,没有什么能够割舍
    《手把手教你学C语言》学习笔记(10)--- 程序的循环控制
    copy 的实现原理与深浅拷贝
  • 原文地址:https://www.cnblogs.com/lfri/p/16277069.html
Copyright © 2020-2023  润新知