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

JAVA实现与Linux通信(通过SSH协议)

阅读更多
使用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;
/**
 *
 * @author leon.lee
 */
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;
    }
    /**
     * Creates a new instance of <code>ChangeEmailPassword</code>.
     * @param username
     * @param oldpassword
     */
    public ChangeEmailPassword(String username,String oldpassword) {
        this.username = username;
        this.oldpassword = oldpassword;
         try{
             conn = new Connection(HOST);
             conn.connect();
            /* Authenticate */
            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;
                }
            }
            /* Close this session */
            sess.close();
            /* Close the connection */
            conn.close();
        } catch (IOException e) {
            e.printStackTrace(System.err);
        }
    }
    /**
     * @param args the command line arguments
     */
    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());
        }
    }
    /**
     * @return the SystemMessage
     */
    public String getSystemMessage() {
        return SystemMessage;
    }
}
 
把里面注解掉的System.out.println打开可以看到系统提示的信息.我只保留了最关键的信息提示
分享到:
评论
1 楼 tang9916 2013-05-09  
执行2次要打开SESSION,2次楼主的代码怎么跑起来的!

相关推荐

    java linux ssh登陆

    标题“Java Linux SSH登录”指的是使用Java编程语言与Linux操作系统进行安全外壳(SSH)通信的过程。在描述中提到,这个过程通常涉及建立一个通道并执行单个命令。这里,我们将会详细探讨Java如何通过SSH连接到Linux...

    linux java web SSH 工具 远程

    在IT行业中,Linux、Java、Web、SSH以及远程工具是至关重要的组成部分,它们构成了...在实际工作中,通过SSH工具进行远程操作,配合Linux系统的强大功能和Java的跨平台特性,能够实现高效且安全的远程开发和运维工作。

    java实现模拟SSH和telnet登陆(实现命令的发送和接受)

    Java 实现模拟 SSH 和 Telnet 登陆,以及发送...总的来说,通过 Java 实现 SSH 和 Telnet 功能涉及网络编程、加密通信和命令行接口的交互。理解这些概念并熟练运用相关库,可以为你的 IT 项目提供强大的远程管理能力。

    基于Java的Linux远程登录系统研究与实现.pdf

    基于Java的Linux远程登录系统研究与实现涉及了Java编程语言、Linux操作系统、远程登录技术以及跨平台应用开发等方面的知识。 首先,Java语言具备了良好的跨平台性,这使得基于Java开发的应用可以运行在不同操作系统...

    java上传文件到linux服务器,操作linux服务器上文件,下载linux服务器文件,删除linux服务器文件

    Linux服务器是一种基于Linux操作系统并提供网络服务的计算机系统,而Java作为一种跨平台的编程语言,能够通过SSH(Secure Shell)协议与Linux服务器进行通信。SSH是一种安全的网络协议,用于在网络中传输命令和数据...

    java连接linux,执行shell命令的工具类 sshxcute.jar

    在这种情况下,使用SSH(Secure Shell)协议是常见的解决方案,因为它提供了安全的网络通信。SSHXCUTE.jar是一个Java库,它允许程序员通过SSH连接到Linux系统并执行shell命令,而无需深入了解SSH的底层细节。 ...

    Java版Linux文件上传下载、windows本地文件上传下载

    总的来说,实现Linux与Windows之间的文件上传下载以及网页版的文件管理界面,需要结合Java的文件操作、网络通信、SSH连接和HTML前端技术。通过合理的设计和实现,可以构建出高效、安全的跨平台文件传输系统。

    通过Ssh协议连接到服务器执行执行的指令

    标题中的“通过SSH协议连接到服务器执行指令”指的是使用Secure Shell (SSH) 协议来远程控制和管理服务器。SSH是一种网络协议,用于安全地在两台计算机之间进行通信,特别是用于管理员对服务器进行远程操作。它允许...

    java操作Linux环境

    Java操作Linux环境主要涉及到的是Java对远程系统的交互能力,尤其是通过SSH(Secure Shell)协议进行安全的网络通信。JSCH(Java Simple SSH)是Java中一个常用的库,它提供了SSH2协议的实现,使得Java程序可以执行...

    7.linux远程连接工具类 SSH

    Linux远程连接工具类SSH是一种广泛使用的通信协议,它允许用户在本地计算机上安全地操作远程Linux系统。SSH,全称为Secure Shell,旨在提供加密的网络服务,特别适用于管理服务器、执行命令、传输文件等场景。在开发...

    JediTerm纯Java终端模拟器。适用于SSH和PTY。

    总的来说,JediTerm 是一个强大且实用的工具,它通过提供 SSH 连接和 PTY 支持,使得 Java 开发者可以在熟悉的开发环境中便捷地进行终端操作,无论是在本地还是远程系统。对于需要在 IDE 内部管理和调试服务器的...

    基于Java的Linux远程登录系统研究与实现.zip

    总结来说,"基于Java的Linux远程登录系统研究与实现"项目涉及到了Java编程、SSH协议、用户认证、网络通信安全等多个重要知识点。通过学习和实践这一系统,开发者不仅能深入理解Java的网络编程,还能掌握构建安全远程...

    java实现sshd协议帮助文档

    Java实现SSHD协议是将SSH(Secure Shell)协议集成到Java应用程序中,以便与Linux或Unix系统进行安全的远程通信。SSH是一种网络协议,用于在不安全的网络上提供加密的网络服务,常用于远程登录、文件传输以及执行...

    Java应用程序远程登录linux并执行其命令.pdf

    在Java应用程序中,命令执行是通过SSH协议实现的。SSH协议提供了一个安全的通道,用于在客户端和服务器之间传输数据。在Java应用程序中,我们可以使用Ganymed SSH-2库来实现命令执行。 命令执行的原理可以分为以下...

    ssh2 jar包及学习资料

    在Java环境中,通过使用SSH2相关的jar包,开发者可以实现与Linux服务器的远程交互,执行命令、传输文件等操作。 SSH2 jar包通常包含了如JCraft公司的JSch库,这是一个Java实现的SSH2库,它提供了对SSH2协议的支持,...

    ganymed-ssh2-build210.jar

    标题中的“ganymed-ssh2-build210.jar”是一个特定版本的Java库,用于实现SSH(Secure Shell)协议,使Java程序能够与Linux服务器进行安全通信。SSH是一种网络协议,广泛用于在不安全的网络环境中提供加密的远程登录...

    Java 程序员眼中的 Linux

    9. **远程访问与版本控制**:Linux支持SSH协议,允许安全的远程访问和文件传输。同时,版本控制系统如Git在Linux环境中被广泛使用,对于协同开发Java项目至关重要。 10. **容器技术**:Docker等容器技术在Linux上...

    J2SSH(Java SSH API )使用文档

    1. **平台独立性**:由于 J2SSH 是用 Java 编写的,因此它可以跨平台运行,支持各种操作系统,如 Windows、Linux 和 macOS。 2. **安全特性**:SSH 提供了加密的网络通信,确保数据在传输过程中的安全性,防止中间...

    ganymed-ssh2.rar

    对于"linux ssh"这个标签,表明了ganymed-ssh2库可以用于与Linux系统进行SSH通信。在Linux环境中,SSH常用于远程管理服务器、自动化运维任务,以及在不安全网络中安全地传输文件。 总的来说,这个压缩包提供了一...

    java ssh权限解析以及源代码

    在Java开发中,SSH(Secure Shell)是一种广泛用于网络服务的安全协议,主要用于远程登录、文件传输等,确保数据传输过程中的安全性。SSH权限分配是指在使用SSH进行远程操作时,如何管理和控制用户对服务器资源的...

Global site tag (gtag.js) - Google Analytics