JAVAはLinuxとの通信を実現(SSHプロトコルによる)


InputStreamとOutputStreamを用いるコマンドラインの実行結果と入力内容を得ることがまず必要である.
そしてSSH接続の問題を解決する.
OpenSourceプロジェクトで見つけました
Ganymed SSH-2 for Java.はダウンロードして例がありますが、インタラクティブコマンドに関する例は見つかりません.
ネット上で外国人がこれを使ってどのようにパスワードを変えるかを議論しているのを見て、基本的な問題はすべて戻るヒントが見つからないためです
Linuxパスワードを変更してpasswdを入力すると、まず現在のパスワードを入力し、次に2つの新しいパスワードを入力します.
現在のパスワード入力が間違っていたり、新しいパスワード入力がシステムのパスワードルールの要求に合致しない場合は、再入力が要求されます.この場合、プログラムは制御しにくいループに入りやすいです.
一般の人はコマンドを入力した後、すべての戻りはsession.getStdout()を使うべきだと思っているかもしれません.session.getStderr()ではなく方法名から見ると確かに、一つは標準出力を取得することであり、一つはエラー情報を取得することである.
実はpasswdを入力後です.
Changing password for user [username].
Changing password for [username]
この2行はsession.getStdout()を通過する必要があります.手に入れたのは
(current) UNIX password:
New UNIX password:
Retype new UNIX password:
この3行はsessssion.getStderr()を使用する必要があります.取得した
ユーザ入力がシステム検出に合格すると、具体的な原因が戻るが、いずれもBAD PASWORDによって開始される.
最終的に修正に成功した場合、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+"
"; 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 +"
"; 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を開くと、システムのヒントが表示されます.私は最も重要なヒントしか残っていません.