web-dev-qa-db-ja.com

Java JSchを使用したsshによるリモートサーバーへのコマンドの送信

リモートサーバーにssh(IP、ユーザー名、パスワードを取得)できるようにクラスを設定し、「echo "test"」のようなコマンドを送信して、出力(例: "テスト")。 JSchを使用してこれを行っていますが、方法がわかりません。

import com.jcraft.jsch.*;

public class ConnectSSH {

public int execute (String command) {

    JSch jsch   = new JSch();
    String ip   = "00.00.00.00;
    String user = "root";
    String pass = "password";
    int port    = 22;

    try {                
        Session session = jsch.getSession(user, ip, port);   
        session.setPassword(pass);
        session.connect();

             ...

どうすればいいのかわからず、接続したら止まってしまいます。

アドバイスは大歓迎です。

12
snario

これを試して:

JSch jsch=new JSch();
Session session=jsch.getSession(remoteHostUserName, RemoteHostName, 22);
session.setPassword(remoteHostpassword);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();

ChannelExec channel=(ChannelExec) session.openChannel("exec");
BufferedReader in=new BufferedReader(new InputStreamReader(channel.getInputStream()));
channel.setCommand("pwd;");
channel.connect();

String msg=null;
while((msg=in.readLine())!=null){
  System.out.println(msg);
}

channel.disconnect();
session.disconnect();
25
Sainse

上記のshamnuの答えは正しかった。コメントを追加できなかったので、ここに彼の回答を強化するいくつかの例を示します。 1つは「ls -l」、もう1つは「mkdir」、もう1つはローカルからリモートへのコピーをリモートで実行する方法です。 jschのバージョン0.1.51ですべて完了しました( http://www.jcraft.com/jsch/ )。

  public void remoteLs() throws JSchException, IOException {
    JSch js = new JSch();
    Session s = js.getSession("myusername", "myremotemachine.mycompany.com", 22);
    s.setPassword("mypassword");
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    s.setConfig(config);
    s.connect();

    Channel c = s.openChannel("exec");
    ChannelExec ce = (ChannelExec) c;

    ce.setCommand("ls -l");
    ce.setErrStream(System.err);

    ce.connect();

    BufferedReader reader = new BufferedReader(new InputStreamReader(ce.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
      System.out.println(line);
    }

    ce.disconnect();
    s.disconnect();

    System.out.println("Exit code: " + ce.getExitStatus());

  }



  public void remoteMkdir() throws JSchException, IOException {
    JSch js = new JSch();
    Session s = js.getSession("myusername", "myremotemachine.mycompany.com", 22);
    s.setPassword("mypassword");
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    s.setConfig(config);
    s.connect();

    Channel c = s.openChannel("exec");
    ChannelExec ce = (ChannelExec) c;

    ce.setCommand("mkdir remotetestdir");
    ce.setErrStream(System.err);

    ce.connect();

    BufferedReader reader = new BufferedReader(new InputStreamReader(ce.getInputStream()));
    String line;
    while ((line = reader.readLine()) != null) {
      System.out.println(line);
    }

    ce.disconnect();
    s.disconnect();

    System.out.println("Exit code: " + ce.getExitStatus());

  }

  public void remoteCopy() throws JSchException, IOException, SftpException {
    JSch js = new JSch();
    Session s = js.getSession("myusername", "myremotemachine.mycompany.com", 22);
    s.setPassword("mypassword");
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    s.setConfig(config);
    s.connect();

    Channel c = s.openChannel("sftp");
    ChannelSftp ce = (ChannelSftp) c;

    ce.connect();

    ce.put("/home/myuser/test.txt","test.txt");

    ce.disconnect();
    s.disconnect();    
  }
9
gageorge

JCraft Webサイトの非表示の例をご覧になることをお勧めします。 http://www.jcraft.com/jsch/examples/UserAuthKI.Java

これらの例では、ユーザー名、ホスト名、パスワードの入力を求められるため、すぐにテストできます。私はそれを自分のネットワークで実行し、コードを変更せずにAIXサーバーに接続できました。

これらの例には問題があることに注意してください(これが非表示になっている可能性があります)。チャネルが閉じられることはありません。 「exit」を送信すると、サーバーは接続を切断しますが、チャネルオブジェクトは開いたままになり、Javaプログラムは終了しません。ここに修正を提供しました: jSchを使用してサーバーの応答を読み取る

2
Damienknight