`
leearnold
  • 浏览: 68435 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 使用SSH连接Linux 使用passwd命令修改密码

    博客分类:
  • Java
 
阅读更多

使用InputStream和OutputStream来获得命令行运行结果和输入内容是首先需要具备的.
然后要解决SSH连接问题.
在OpenSource项目里找到了Ganymed SSH-2 for Java .下载后有例子,但是没有找到有关交互命令的例子.所以自己探索了一下
在网上看有老外讨论用这个如何改密码,基本上的问题都是因为找不到返回的提示
Linux修改密码输入passwd后,首先是输入当前密码,然后是输入两个新密码
如果当前密码输入错误,或者新密码输入不符合系统密码规则要求,会要求重新输入.如果碰到这种情况,程序很容易进入一个不太好控制的循环.
可能一般人都认为输入命令后所有的返回都应该是用session.getStdout();而不是session.getStderr();从方法名称上看确实如此,一个是取得标准输出,一个是取得错误信息.
其实在输入passwd后.
Changing password for user [username].
Changing password for [username]
这两行是需要通过session.getStdout();来获得的.但是后面的
(current) UNIX password:
New UNIX password:
Retype new UNIX password:
这三行是需要使用sessssion.getStderr();来获取的
如果用户输入没有通过系统检测,会返回具体原因,但是都是BAD PASSWORD开始的.
如果最后修改成功了.你也会看到有successfully来表示.这些信息是通过session.getStdout();来获取的.
现在问题很好解决了吧.
写了一个类来完成修改密码的操作

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import com.io.Debug;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

public class ChangeEmailPassword {
    private String username = "";
    private String oldpassword = "";
    private Connection conn = null;
    private boolean hasError = false;
    private String ErrorMessage = "";
    private boolean isSuccessfully = false;
    private String SystemMessage = "";
   
    public static final String HOST = "127.0.0.1"; //server ip
    public boolean isSuccessfully(){
        return isSuccessfully;
    }
    public boolean isHasError(){
        return hasError;
    }
    public String getErrorMessage(){
        return ErrorMessage;
    }
    public void setErrorMessage(String msg){
        hasError = true;
        this.ErrorMessage =  msg;
    }
   
    public ChangeEmailPassword(String username,String oldpassword) {
        this.username = username;
        this.oldpassword = oldpassword;
         try{
             conn = new Connection(HOST);
             conn.connect();
           
            boolean isAuthenticated = conn.authenticateWithPassword(username, oldpassword);
            if (isAuthenticated == false) {
                setErrorMessage("Authentication failed.");
                conn=null;
            }
         }catch(Exception e){
             conn.close();
             conn = null;
             System.out.println(e);
         }
    }
    public void setNewPassword(String newpassword) {
        if(hasError){
            return;
        }
        if (conn==null){
            return;
        }
        try{
            Session sess = conn.openSession();
            sess.execCommand("passwd");
            InputStream so = sess.getStdout();
            InputStream err = sess.getStderr();
            OutputStream out = sess.getStdin();
           
            byte[] buffer = new byte[500];//其实没有必要这么大.130就差不多了.怕万一有什么提示.
            int length = 0;
            length = err.read(buffer);
//            if (length > 0) {
//                System.out.println("#1:"+ new String(buffer, 0, length));
//                //(current) UNIX password:
//            }
            String coldpassword = oldpassword+"\n";
            out.write(coldpassword.getBytes());
            length = err.read(buffer);
//            if (length > 0) {
//                System.out.println("#2:"+ new String(buffer, 0, length));
//                //(current) UNIX password:
//            }
            String cnewpass = newpassword +"\n";
            out.write(cnewpass.getBytes());
            length = err.read(buffer);
            if (length > 0) {
                String rs = new String(buffer, 0, length);
                //System.out.println("#3:"+rs);
                if(rs.indexOf("BAD")>-1){
                    sess.close();
                    conn.close();
                    setErrorMessage(rs);
                    return;
                }
            }
            out.write(cnewpass.getBytes());
            length = so.read(buffer);
            if (length > 0) {
                String rs = new String(buffer, 0, length);
                if(rs.indexOf("successfully")>-1){
                    this.isSuccessfully = true;
                    this.SystemMessage = rs;
                }
            }
           
            sess.close();
           
            conn.close();
        } catch (IOException e) {
            e.printStackTrace(System.err);
        }
    }
   
    public static void main(String[] args) {
        ChangeEmailPassword cep = new ChangeEmailPassword("username", "oldpassword");
        if(cep.isHasError()){
            System.out.println(cep.getErrorMessage());
            cep = null;
            return;
        }
        cep.setNewPassword("newpassword");
        if(cep.isHasError()){
            System.out.println(cep.getErrorMessage());
            cep = null;
            return;
        }
        if(cep.isSuccessfully){
            System.out.println(cep.getSystemMessage());
        }
    }
   
    public String getSystemMessage() {
        return SystemMessage;
    }
}
 
//把里面注解掉的System.out.println打开可以看到系统提示的信息.我只保留了最关键的信息提示
 

分享到:
评论

相关推荐

    java修改linux密码资料

    Java作为一种强大的编程语言,虽然它不是直接用来管理操作系统任务的,但通过Java的Runtime类或者ProcessBuilder类,我们可以编写程序来执行shell命令,包括修改Linux密码。下面将详细介绍如何使用Java来实现这一...

    ssh2 jar包及学习资料

    5. **数据交互**:如果需要交互式的命令,例如`passwd`命令更改密码,可以通过通道的输出流发送输入,通过输入流读取响应。 6. **文件传输**:对于SFTP通道,可以使用`ChannelSftp`类提供的方法进行文件的上传、...

    linux常用命令大全.pdf

    - **passwd**: 更改用户的密码。 - **groupadd/groupdel**: 添加或删除用户组。 4. **系统信息** - **uname**: 显示系统的基本信息,如内核版本、操作系统名称等。 - **uptime**: 显示系统已经运行了多久,以及...

    Linux常用的六十条命令

    46. passwd命令:修改用户密码。 47. chown命令:更改文件或目录的所有者。 48. chgrp命令:更改文件或目录的组所有者。 49. ssh命令:远程连接到其他主机。 50. exit命令:退出当前 Shell 会话。 进程管理 51. ...

    ssh用户登录

    3. 设置密码:添加用户后,管理员需通过`passwd`命令设置用户密码,如`sudo passwd newuser`。 三、SSH登录过程 1. 密钥对生成:SSH支持两种认证方式,密码认证和密钥对认证。密钥对认证更安全,用户可以使用`ssh-...

    Linux安装jdk环境

    - 登录后,首先设置一个强密码,使用命令 `sudo passwd root` 更改root用户的密码。 6. **安装文件传输工具**: - 下载并安装Xftp 4,这是一款强大的SFTP客户端,用于文件传输。通过它可以在本地与Ubuntu系统之间...

    linux登录软件及使用步骤1

    - 在Linux系统中,你可以使用`passwd`命令更改密码,`useradd`和`userdel`管理用户,`sudo`命令执行管理员权限操作。 - 了解`chown`、`chgrp`和`chmod`命令,分别用于改变文件的所有者、组和权限设置。 四、设备...

    ssh demo例子

    SSH服务通常与系统账户关联,因此可能涉及到与系统用户数据库的交互,比如使用`useradd`命令创建新用户,或使用`passwd`命令更改密码。 【项目源码】部分可能包含一个简单的SSH服务器或客户端的示例代码,可能是用...

    linux基本命令

    6. **passwd**:更改用户密码。 7. **set**:显示或修改环境变量。 8. **setenv**:设置环境变量。 9. **uname**:显示系统信息。 10. **whatis**:显示命令的简短描述。 11. **whereis**:查找二进制文件、源文件和...

    linux通用命令总结

    - **passwd [username]**: 更改用户密码。 - **logout**: 退出当前用户会话。 - **login**: 登录系统。 #### 进程管理 - **top**: 显示当前系统的进程状态及其资源使用情况。 - **ps -e**: 列出所有运行中的进程。 ...

    Linux下的Hadoop搭建1

    使用以下命令安装SSH server: $ sudo apt-get install openssh-server 然后,使用以下命令生成密钥并将密钥加入到授权中: $ ssh-keygen -t rsa $ cd ~/.ssh/ $ ssh-copy-id -i ~/.ssh/id_rsa.pub hduser@...

    SSH用户管理完整版初学者可用

    2. **用户账户创建与管理**:使用`adduser`或`useradd`命令创建新用户,`passwd`命令设置和更改用户密码。`usermod`命令用于修改用户属性,如家目录、组成员等。 3. **用户权限与组**:理解Linux的用户和组权限模型...

    Linux使用小结

    3. **更改文件所有者:** 使用 `chown` 命令更改文件夹所有者。 #### 二十四、解决Python-pip安装错误 1. **更新pip版本:** 使用 `pip install --upgrade pip` 更新pip到最新版本。 2. **检查Python环境:** 确认...

    java web 开发总结

    - 当尝试通过SSH连接到另一台Linux机器时,如果出现需要输入密码的情况,可能是因为`~/.ssh`目录或`~/.ssh/id_rsa.pub`文件的权限设置不正确。确保`~/.ssh`的权限为700,私钥文件的权限为600,这样可以避免每次连接...

    Hadoop安装(ubuntu16.04+ hadoop-2.9.1.tar.gz+jdk-8u74-linux-x64.tar.gz)

    1. 在master节点设置登录密码,使用sudo passwd命令。 2. 在master节点配置文档,允许其它节点通过免密登录方式登录master节点,编辑/etc/ssh/sshd_config文件,添加PermitRootLogin yes。 3. 在slave01节点重复上述...

    linux系统常用命令

    Linux系统常用命令是每个Linux用户必须掌握的基础工具,无论你是初学者...在实践中,你还可以探索更多高级命令和工具,如`vi/vim`编辑器、`scp`文件传输、`crontab`定时任务、`ssh`远程连接等,以提升你的Linux技能。

    Linux命令总结

    - `远程登录操作9.txt`可能涵盖了SSH(Secure Shell)的使用,如`ssh`用于登录远程服务器,`scp`或`sftp`用于安全地传输文件,以及如何配置SSH密钥对以实现无密码登录。 通过学习这些核心的Linux命令,你可以更...

    linux常用命令.pdf

    - `passwd`:更改用户密码。 - `usermod`:修改用户账户信息。 - `userdel`:删除用户账户。 8. 磁盘管理 - `fdisk`:磁盘分区工具。 - `mkfs`:创建文件系统。 - `mount` 和 `umount`:分别用于挂载和卸载文件系统...

    任务一、Linux基本操作.docx

    - **命令**:使用 xmanager5 连接 Linux 虚拟机。 - **解释**:xmanager5 是一款图形化工具,可用于远程连接 Linux 服务器。 - **示例**:使用 xmanager5 连接 Linux 虚拟机。 ##### 4. 上传文件 - **命令**:使用...

    Linux平台WeblogicADF安装使用手册.docx

    2. **设置密码**:使用`passwd oracle`命令设置Oracle用户的密码。 3. **创建组**:使用`groupadd oracle`命令创建Oracle组。 4. **添加用户到组**:使用`usermod -g oracle oracle`命令将Oracle用户添加到Oracle组...

Global site tag (gtag.js) - Google Analytics