sudo:java:从root用户退出后找不到命令 [英] sudo: java: command not found after exiting from root user

查看:117
本文介绍了sudo:java:从root用户退出后找不到命令的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经安装了 jdk,但是当我尝试使用 java 命令时,它说找不到命令".

然后我在 .bashrc 中为我的帐户设置环境变量,它工作正常.

export JAVA_HOME=/usr/java/jdk1.7.0_03export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/l\ib/tools.jar导出路径=$PATH:$JAVA_HOME/bin

但是,当我尝试使用 sudo 执行 java 时,它又说了一遍.所以我用 sudo -s 切换到 root,把它们放到/etc/profile 中,然后执行 source/etc/profile

如果我继续以 root 身份登录,这会起作用,但在我返回自己的帐户并使用 sudo java 后,它仍然显示 sudo: java: command not found 并且这些环境变量变为空白.

我该怎么做才能解决问题?我想应该很容易解决.

解决方案

默认情况下,某些发行版会重置您的环境变量以确保在 root 下执行的程序按预期运行.任何未在白名单中指定的环境变量都不会带入您的根会话中.

/etc/sudoers 中定义了重置环境的指令以及允许使用的变量.(您需要权限才能查看/编辑此内容).

例如,在我的 Fedora 16 机器上,我有

<前>默认值 env_reset默认值 env_keep = "颜色显示主机名 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"

请注意,XAUTHORITY 默认不存在,我必须添加它.

如果您希望您的 JAVA_HOME envvar 继续使用,您可以在此处添加它.但是,为了让您只需要这样做,您需要将 PATH 添加到此列表中,这真的不鼓励.

所以在这个文件中还有如下一行:

<前>默认secure_path =/sbin:/bin:/usr/sbin:/usr/bin

这将是您的 sudo 会话中的 $PATH.只需确保您有一个指向要在其中一个文件夹中使用的 java 可执行文件的符号链接,就可以了.

(由于您收到未找到命令的消息",因此您的安全路径上没有 java 可执行文件,但如果有,您需要将其删除,或将您的路径中的新符号链接更高"(更早)

备选方案 1

/etc/之类的文件中为 java 添加别名(例如 alias java='/usr/java/latest/bin/java')bashrc

备选方案 2

在您的本地配置文件或 bashrc 文件中为 java 添加别名,并为 sudo 添加别名 这将保留您的别名.

I have installed jdk but when I tried to use the java command it said "command not found".

So I then set the environment variable for my account in .bashrc and it works okay.

export JAVA_HOME=/usr/java/jdk1.7.0_03
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/l\
ib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

However when I try to use sudo to execute java it says that again. So I used sudo -s to switch to root, put those into /etc/profile, and executed source /etc/profile

This works if I keep logged in as root but after I return to my own account and use sudo java it still says sudo: java: command not found and those environment variables become blank.

What should I do to solve the problem? I guess it should be easy to solve.

解决方案

Some distros, by default, reset your environment variables to ensure programs executed under root run as expected. Any environment variable not specified in a whitelist is not carried into your root session.

The instruction to reset to environment as well as what variables to allow is defined in /etc/sudoers. (You need permissions to view/edit this).

For example, on my Fedora 16 box, I have

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

Note that XAUTHORITY isn't there by default, I had to add it.

If you want your JAVA_HOME envvar to carry over, you could add it here. However, for this to be all you need to do, you'd need to add PATH to this list and that is really discouraged.

So also in this file is a line like the following:

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

This will be your $PATH inside your sudo session. Just ensure that you have a symlink to the java executable you want to use in one of those folders, and you'll be fine.

(Since you are getting the "command not found message", there are no java executables on your secure path, but if there were, you'd need to either remove it, or place your new symlink "higher" (earlier) in the path)

Alternative 1

Add an alias to java (eg alias java='/usr/java/latest/bin/java') inside a file like /etc/bashrc

Alternative 2

Add an alias to java in your local profile or bashrc files and an alias to sudo that will preserve your aliases.

这篇关于sudo:java:从root用户退出后找不到命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆