美文网首页
sudo Java:command not found的分析

sudo Java:command not found的分析

作者: 猫尾草 | 来源:发表于2019-04-22 09:08 被阅读0次

    1.问题

    • 有时候安装了一个程序到/usr/local/bin目录下,这个程序需要root权限执行。但是用sudo去执行的时候,又收到 sudo: XXXXX: command not found的错误提示。
    • 自己下载了一个程序解压,添加到/etc/profile环境变量中,但是用sudo去执行的时候,又收到 sudo: XXXXX: command not found 的错误提示。
      以上两个问题本质是一样的

    2.分析

    2.1 正常的环境变量

    当我们执行一个命令例如java时,系统回去$PATH环境变量中去找。一个刚安装好没有改动的linux系统环境变量大概是下面这样:

    [jck@desktop bin]$ echo $PATH
    /usr/sbin:/usr/bin:/bin:/sbin
    

    我们可以看到,其中包含了/usr/local/bin,所以任何包含在/usr/local/bin下的命令也都包含在环境变量PATH中,在shell中执行该命令时系统能找到
    一般我们通过yum(Redhat系列)或者apt-get(Debia系列)方式安装的软件、或者make & make install方式安装的软件,都会在/usr/loca/bin目录下创建命令的快捷方式,所以安装完就在系统环境变量中了。我们下载的tar包程序,解压后,在/etc/profile中配置export这种方式,是直接将一个命令添加到环境变量$PATH中

    2.2 举例

    • 第一种方法
    yum install -y java
    

    安装完就可以执行java -version

    • 第二种方法
      解压Java的tar包到/usr/local/java,在/etc/profile中配置
    export JAVA_HOME=/usr/local/java8  
    export JRE_HOME=$JAVA_HOME/jre  
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib  
    export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin*
    

    此时再执行

    echo $PATH
    

    就会得到

    /sbin:/bin:/usr/sbin:/usr/bin:JAVA_HOME/bin:JRE_HOME/bin*
    

    这时java命令也包含在了$PATH中。
    那么,为什么sudo java就不行呢?

    2.3 sudo的环境变量

    在linux系统中,当你使用sudo去执行一个程序时,出于安全的考虑,这个程序将在新的、最小化的环境中执行。也就是说,诸如PATH这样的环境变量,在sudo命令下已经被重置成默认的状态了。所以当一个刚初始化的PATH变量中不会包含你所要运行的程序所在的目录,用sudo去执行,你就会得到command not found的错误。


    3.解决方法

    当执行sudo命令时,/etc/sudoers文件的secure_path中包含的路径将被当做默认$PATH变量使用。要改变PATH在sudo会话中的初始值,通过命令

    sudo visudo
    

    打开/etc/sudoers文件,找到secure_path一行。比如加入/usr/local/bin到其中

    Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
    

    如果是yum或者apt-get安装方式,java已经包含在了/usr/local/bin中,这样 sudo java就可以使用了。如果是用tar包安装方式,需要在/usr/local/bin中创建/usr/local/java/bin/java(即你的安装路径)的软连接,例如

    // 创建软连接不要使用相对路径
    ln -s /usr/local/java/bin/java /usr/local/bin/java
    

    这样 sudo java也可以使用了


    一个小问题

    创建了软连接之后,你可能会遇到如下报错:

    error while loading shared libraries: libjli.so
    

    那是因为你采用的的是yum或者apt-get安装方式,但是你有多此一举的创建了软连接,这时$PATH中有了两个,删掉一个报错就没有了。

    参考:

    https://blog.csdn.net/wj1066/article/details/72453613
    http://www.cnblogs.com/A-Song/archive/2013/03/09/2951951.html

    相关文章

      网友评论

          本文标题:sudo Java:command not found的分析

          本文链接:https://www.haomeiwen.com/subject/lodmgqtx.html