ssh -l 目标服务器 'java -version'情况
- 一、ssh -l 目标服务器 ’Java-version‘ 这个命令执行出来的 jdk是谁的jdk?
- 二、ssh -l user 目标服务器 "java -version",目标服务器上明明安装的是 JDK 17,但却返回了 Java 1.8
-
- 如何排查
- 结论
- 三、update-alternatives –config java 可以看到系统当前默认链接的是 Java 1.8。,为什么ssh -l 目标服务器 ’Java-version‘ 是默认的jdk吗?
- 四、通过 update-alternatives –config java 在系统层面将 JDK 17 选为默认 具体怎么配置?
-
- 1. 确保系统已安装 JDK 17
- 2. 注册到 update-alternatives
- 3. 切换默认版本
- 4. 验证
-
- 小结
一、ssh -l 目标服务器 ’Java-version‘ 这个命令执行出来的 jdk是谁的jdk?
使用 ssh -l 目标服务器 'java -version' 时,真正被调用的 java 是目标服务器上的 Java 解释器(即远程主机上的 JDK)。
- 您在本地执行该命令后,SSH 会登录到“目标服务器”,在那台服务器执行 java -version,因此输出的是目标服务器所安装的 JDK 版本。
- 本地主机自己的 JDK 不会对此命令产生影响。
二、ssh -l user 目标服务器 “java -version”,目标服务器上明明安装的是 JDK 17,但却返回了 Java 1.8
当您在本地主机上执行 ssh -l user 目标服务器 "java -version",实际上会在“目标服务器”上执行 java -version,按理说应显示目标服务器的 JDK 版本。如果目标服务器上明明安装的是 JDK 17,但却返回了 Java 1.8 的信息,通常说明:
目标服务器上同时安装了多个 Java 版本,且默认 java 指向的是 1.8
- 很可能通过 which java 或 update-alternatives –config java 可以看到系统当前默认链接的是 Java 1.8。
- JDK 17 也许安装在 /usr/local/java17 或其它路径,但并没被系统设置为默认。
远程用户的环境变量 / PATH 没有生效
- 有时在非交互式登录( 比如直接 ssh user@server "command" )时,不会加载某些配置文件(如 ~/.bash_profile 或 ~/.bashrc),导致 Java Home 或 PATH 未被正确设置。
- 如果您只在交互式 Shell 里能看到 Java 17,那么说明配置只在交互式环境被加载,对于 SSH 的非交互命令,可能走了系统全局的默认 Java 1.8。
您使用的远程用户名与配置不一致
- 您本以为该用户下是 JDK 17,但实际上您 SSH 登录的用户权限或环境不一样(比如 root 账户默认为 Java 1.8)。
如何排查
检查目标服务器上的默认 java 路径
ssh user@server "which java"
ssh user@server "readlink -f $(which java)"
- 这可查看究竟 /usr/bin/java 或 /usr/local/bin/java 最终指向哪个版本的 Java。
- 若指向 /usr/lib/jvm/java-8 等目录,说明系统默认走的 1.8。
查看系统的 alternatives 配置(如果是 Linux)
ssh user@server "update-alternatives –display java"
- 可能会列出多个候选版本和当前默认指向。也可以执行:ssh user@server "update-alternatives –config java"
- 如果要切换默认版本,需要在服务器上执行此配置命令或修改相应链接。
查看环境变量 JAVA_HOME 与 PATH
- 在远程服务器上执行:ssh user@server "echo \\$JAVA_HOME; echo \\$PATH"
- 看看这里有没有指向 JDK 17。如果没有,说明您需要在 .bashrc 或 .bash_profile、/etc/profile 等地方配置正确的变量。
测试是否是交互式登录才加载
- 如果您直接在远程服务器上登录,然后敲 java -version 看到 17,而通过 ssh "java -version" 却是 1.8,说明可能 .bashrc 或 .bash_profile 里某些配置仅在交互式 Shell 启用。
- 可以尝试加 -t 参数强制交互式 Shell,或把相关环境配置移动到 /etc/profile 或 ~/.profile 里让非交互式 SSH 也能加载。
结论
- 1.8 从哪来? 绝大多数是目标服务器装了多个 Java 版本,系统默认 java 指向了 1.8。
- 怎么手动验证? 先执行 ssh user@server "which java"、ssh user@server "readlink -f $(which java)"、update-alternatives –display java 逐项检查;再看远程用户的环境变量和系统全局的默认设置。
- 怎么切换到 JDK 17?
- 要么通过 update-alternatives –config java 选择 17 为默认;
- 或者在非交互式环境也加载相应的 Java 环境变量 (JAVA_HOME + PATH);
- 或直接在命令中用绝对路径调用 17 (/usr/local/java17/bin/java -version)。
这样您就能查清为何 SSH 返回的是 Java 1.8,而非 17,并具体修正目标服务器上的默认 Java 设置。
三、update-alternatives –config java 可以看到系统当前默认链接的是 Java 1.8。,为什么ssh -l 目标服务器 ’Java-version‘ 是默认的jdk吗?
因为在通过 SSH 远程执行 java -version 时,系统默认调用的是当前“全局默认链接”的 Java,也就是通过 update-alternatives –config java 看到的那个版本。如果该默认链接指向的是 1.8,那远程执行自然会显示 Java 1.8。
换句话说,服务器上可能装了多个 JDK,但您没有显式指定要用哪个 JDK,就会用系统里默认的 java,而这通常是由 update-alternatives 配置所决定。只要默认链接尚未切换到 JDK 17,那么远程执行就会显示 1.8。
如果您想让远程执行使用 JDK 17,可以:
- 通过 update-alternatives –config java 在系统层面将 JDK 17 选为默认;
- 或者在命令里显式指定 JDK17 的绝对路径(例如 /usr/local/java17/bin/java -version);
- 或者在用户环境变量(如 .bashrc、/etc/profile)里优先设置了 JDK17,但要确保非交互式 SSH 也能加载相应配置。这样就能使 ssh -l 目标服务器 "java -version" 显示 JDK 17。
四、通过 update-alternatives –config java 在系统层面将 JDK 17 选为默认 具体怎么配置?
可以通过以下步骤来切换系统默认的 Java 版本为 JDK 17(以 Linux 常见发行版为例):
1. 确保系统已安装 JDK 17
先确认 JDK 17 已正确安装在某个目录。例如:
- /usr/lib/jvm/java-17/
- /usr/local/java17/
- 等其他目录
若还未安装,可以通过发行版自带的包管理器或手动下载并解压安装。
2. 注册到 update-alternatives
如果安装后还没有注册到 update-alternatives,需要先执行(下面示例以 /usr/local/java17/ 为路径,需根据你实际目录修改):
sudo update-alternatives –install /usr/bin/java java /usr/local/java17/bin/java 1
sudo update-alternatives –install /usr/bin/javac javac /usr/local/java17/bin/javac 1
解释:
- update-alternatives –install 命令用于将某个可执行文件(如 java、javac)注册到系统的“备选列表”中;
- /usr/bin/java 是系统标准可执行路径;
- java 是该选项的名字;
- /usr/local/java17/bin/java 是要注册的真正可执行文件路径;
- 1 表示优先级(数字越大,优先级越高;若多个版本同级,则后面用命令手动切换)。
如果系统已经有了 JDK 1.8 的可执行文件,比如 /usr/bin/java -> /usr/lib/jvm/java-8/bin/java,再添加上 JDK 17,即表示系统有两个 Java 选项可选。
3. 切换默认版本
然后执行:
sudo update-alternatives –config java
系统会显示类似:
There are 2 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
————————————————————
* 0 /usr/lib/jvm/java-8/bin/java 1 auto mode
1 /usr/lib/jvm/java-8/bin/java 1 manual mode
2 /usr/local/java17/bin/java 1 manual mode
Press <enter> to keep the current choice[*], or type selection number:
此时输入数字选择 JDK 17 的那一项 ( 比如 2 ),再按回车。这样就在系统层面将“java”命令的默认链接切换成 JDK 17 了。
如果你还需要 javac 也同样切换,执行:
sudo update-alternatives –config javac
并选择 JDK 17 的路径即可。
4. 验证
再次执行:
java -version
若显示 openjdk version "17" 或 java version "17",说明已成功切换默认版本到 JDK 17。
小结
这样当你通过 ssh user@server "java -version" 时,如果该用户的环境变量或 PATH 没有特殊改动,一般就会直接使用新的默认 Java 17,而不再显示 1.8。
评论前必须登录!
注册