• 用Java修改Linux密码


    最近因为测试服务器(Linux)的密码被某测试人员修改(安全管理不到位,痛苦)。导致这个测试服务器无法Login。

    本来准备放弃了,格式化,重装,但是想到在这个环境上的诸多设置,什么NAS,FTP,语言环境,Websphere啥的,都要重新安装,还是稍微冷静了一下。

    发现虽然root密码丢掉了,但是Webphere的管理Console依然可以正常访问,包括发布应用都可以正常执行,因此准备利用WebSphere发布一段执行Linux命令的Java程序修改密码。

    首先,准备确认WebSphere的运行用户是什么。

    这里使用了如下代码:

    Process p = null;
            String s;
            try {
                p = Runtime.getRuntime().exec("whoami");
                BufferedReader br = new BufferedReader(
                    new InputStreamReader(p.getInputStream()));
                while ((s = br.readLine()) != null) {
                    System.out.println("line: " + s);
                }
                p.waitFor(10, TimeUnit.SECONDS);
                System.out.println("exit: " + p.exitValue());
            } catch (Exception e) {
                log.error("Error when running linux process.", e);
            } finally {
                if (p != null) {
                    p.destroy();
                }
            }

    结果很赞,在日志里输出了 “root”。(因为密码丢了,所以日志实在WebSphere的Console里看的。)

    既然Websphere是root用户在执行,那就好办了,只要弄清楚如何在Java中执行linux修改密码的命令就可以了。

    于是我运行了如下代码准备看看效果。

    Process p = null;
            String s;
            try {
                p = Runtime.getRuntime().exec("passwd");
                BufferedReader br = new BufferedReader(
                    new InputStreamReader(p.getInputStream()));
                while ((s = br.readLine()) != null) {
                    System.out.println("line: " + s);
                }
                p.waitFor(10, TimeUnit.SECONDS);
                System.out.println("exit: " + p.exitValue());
            } catch (Exception e) {
                log.error("Error when running linux process.", e);
            } finally {
                if (p != null) {
                    p.destroy();
                }
            }

    结果是,process超时,标准输出没有任何内容,原因也在预料中,因为passwd命令会从pty读输入的新密码,所以,命令会卡住等待输入。

    所以,执行如下语句可以完成对密码的修改。

    Process p = null;
            String s;
            try {
                String[] cmd = {
                    "/bin/sh",
                    "-c",
                    "echo \"newpassword\" | passwd \"root\" --stdin"
                    };
                p = Runtime.getRuntime().exec(cmd);
                BufferedReader br = new BufferedReader(
                    new InputStreamReader(p.getInputStream()));
                while ((s = br.readLine()) != null) {
                    System.out.println("line: " + s);
                }
                p.waitFor(10, TimeUnit.SECONDS);
                System.out.println("exit: " + p.exitValue());
            } catch (Exception e) {
                log.error("Error when running linux process.", e);
            } finally {
                if (p != null) {
                    p.destroy();
                }
            }

    将密码修改成 newpassword, 秘密在于  passwd 命令的 --stdin option 可以将密码输入重定向到标准输入。终于,root又可以Login进去了,这次要管好用户和密码!

    Written By BlueZealot
  • 相关阅读:
    正交相机下实现滚轮按钮拖动,滚动滚轮缩放的功能
    C#标记 [已弃用] 的方法
    JDBC-Mybatis-Hibernate
    Data Structures and Algorithm Analysis in Java
    Maven
    Java面试
    Bootstrap
    CSS3
    HTML5
    JSON
  • 原文地址:https://www.cnblogs.com/WestContinent/p/15745935.html
Copyright © 2020-2023  润新知