Oracle中心にIT全般の技術情報を気が向くままに書いています。他にLinux、仮想化技術(VMWare)やトラブルに役立つ情報などがあります。

スポンサーサイトssh接続JAVAアプリケーションを作成する


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
WindowsからLinuxにSSHコマンドを実行してみたいと思います。

鍵を作成してパスワードなしでコマンド実行する方法はいくつかネット上で見つけることができましたが、もっと手軽に、ユーザとパスワードを指定することで自動SSH接続およびコマンド実行を行いたいと思います。

JAVAにはいくつかのSSH用のライブラリが存在していますが,orion-sshを利用することとします。

かなり前に、C言語を利用してWindowsでrshもどきを作ったことがあったのですが、それと比べてJAVAだとライブラリのおかげで非常に簡単に作成することができました。




SSHコマンドの実行
後述する作成したJAR形式のJAVAアプリケーション「sshcmd」については、以下の引数を渡す作りになっています。
・第一引数: ホスト名(IPアドレス)
・第二引数: ユーザ名
・第三引数: パスワード
・第四引数: コマンド(複数実行時にはセミコロン区切りで指定)

コマンドプロンプトより、"ls -l"コマンドを実行してみます。
E:\sshcmd>java -jar sshcmd.jar 192.168.132.10 root password "ls -l"
合計 112
-rw-------. 1 root root  1707 10月 23 06:11 2011 anaconda-ks.cfg
-rw-r--r--. 1 root root 53793 10月 23 06:11 2011 install.log
-rw-r--r--. 1 root root 10272 10月 23 06:10 2011 install.log.syslog
drwxr-xr-x. 2 root root  4096  6月 19 22:11 2012 tool
drwxr-xr-x. 2 root root  4096 10月 22 21:19 2011 ダウンロード
drwxr-xr-x. 2 root root  4096 10月 22 21:19 2011 テンプレート
drwxr-xr-x. 3 root root  4096 10月 22 22:35 2011 デスクトップ
drwxr-xr-x. 2 root root  4096 10月 22 21:19 2011 ドキュメント
drwxr-xr-x. 2 root root  4096 10月 22 21:19 2011 ビデオ
drwxr-xr-x. 2 root root  4096 10月 22 21:19 2011 音楽
drwxr-xr-x. 2 root root  4096 10月 22 21:19 2011 画像
drwxr-xr-x. 2 root root  4096 10月 22 21:19 2011 公開

複数のコマンドを実行する場合は、第4引数にセミコロン区切りで複数のコマンドを指定します。
E:\sshcmd>java -jar sshcmd.jar 192.168.132.10 root password "cd tool;ls -l"
合計 8
-rwxr-xr-x. 1 root root 31  6月 19 22:11 2012 mnt.sh
-rwxr-xr-x. 1 root root 73 10月 23 08:31 2011 rsync.sh


SSH実行JAVAアプリケーションの作成
orion-sshのJARファイルをダウンロードし、ライブラリに加えた上で、下記のようなソースを作成してビルドします。
※パラメータのチェックなども追加した方が良いかもしれません。

■Sshcmd.java
package sshcmd;

public class Sshcmd {

    /*
     * 第一引数: ホスト名(IPアドレス)
     * 第二引数: ユーザ名
     * 第三引数:  パスワード
     * 第四引数: コマンド(複数コマンド実行の場合はセミコロン区切りで指定)
     */
    public static void main(String[] args) {

        // インスタンス生成
        SshMain ssh = new SshMain(args[0],args[1],args[2]);
        
        // SSHコマンド実行
        if(!ssh.execCommand(args[3]))
            System.exit(255);
        
    }
}

■SshMain.java
package sshcmd;

import com.trilead.ssh2.Connection;
import com.trilead.ssh2.Session;
import com.trilead.ssh2.StreamGobbler;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class SshMain  {
    protected Connection sshConn;
    protected Session sshSession;

    protected String sshHostname;
    protected String sshUsername;
    protected String sshPassword;
    
    // コンストラクタ
    public SshMain(String hostname, String username, String password) {
        sshHostname=hostname;
        sshUsername=username;
        sshPassword=password;
    }

    // コマンド実行(SSHオープン⇒コマンド実行⇒SSHクローズ)
    public Boolean execCommand(String command) {
        // SSHオープン
        if(!this.open())
            return false;

        // コマンド実行
        if(!this.exec(command))
            return false;
        
        // SSHクローズ
        this.close();
        
        return true;
    }

    // SSHオープン
    protected Boolean open() {
        try
        {
            // コネクションインスタンスの作成
            sshConn = new Connection(sshHostname);

            // 接続
            sshConn.connect();

            // ユーザ/パスワード認証
            if(!sshConn.authenticateWithPassword(sshUsername, sshPassword)){
                throw new IOException("Error: Failed to authenticateWithPassword");
            }

            // SSHセッションの開始
            sshSession = sshConn.openSession();

        } catch(IOException e) {
            e.printStackTrace(System.err);
            this.close();
            return false;
        }
        
        return true;
    }

    // コマンド実行&結果出力
    protected Boolean exec(String command) {
        try
        {
            // コマンドの実行
            sshSession.execCommand(command);
            
            // コマンド実行結果の標準出力
            this.printStdout(sshSession);

            // コマンド実行結果のエラー出力
            this.printStderr(sshSession);

        } catch(IOException e) {
            e.printStackTrace(System.err);
            this.close();
            return false;
        }
        
        return true;
    }
    
    // 実行結果の標準出力(StreamGobbler使用)
    protected void printStdout(Session sshSession) throws IOException {
        
        InputStream stdout = new StreamGobbler(sshSession.getStdout());

        BufferedReader br_out = new BufferedReader(new InputStreamReader(stdout,"UTF8"));

        while (true) {
            String line_out = br_out.readLine();
            if (line_out == null) {
                break;
            }
            System.out.println(line_out);
        }
    }

    // 実行結果のエラー出力(StreamGobbler使用)
    protected void printStderr(Session sshSession) throws IOException {
        
        InputStream stderr = new StreamGobbler(sshSession.getStderr());

        BufferedReader br_err = new BufferedReader(new InputStreamReader(stderr,"UTF8"));

        while (true) {
            String line_err = br_err.readLine();
            if (line_err == null) {
                break;
            }

            System.out.println("Error(" + sshSession.getExitStatus() + ") " + line_err);
        }
    }

    // SSHクローズ
    protected void close() {
        sshSession.close();
        sshConn.close();
    }
 }

本当に簡単に作成できました。




以上です。




トラックバックURL

この記事にトラックバックする(FC2ブログユーザー)



前ページへ:TcpViewでネットワーク接続状態をリアルタイムで確認する
次ページへ:SDeleteでファイルを完全に削除する

ページのトップへ

必ずお読みください

本ブログ記事をご利用になって生じたいかなる損害についても当方は一切責任を負いません。
ご利用は自己責任でお願いします。(^―^)

広 告





ブログランキング/その他


ビジネスブログ100選

ブログランキング・にほんブログ村へ
blogramで人気ブログを分析




最新トラックバック


RSSリンクの表示

QRコード

QR

アクセスカウンター

ユニーク:
トータル:


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。