リモートサーバーに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();
...
どうすればいいのかわからず、接続したら止まってしまいます。
アドバイスは大歓迎です。
これを試して:
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();
上記の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();
}
JCraft Webサイトの非表示の例をご覧になることをお勧めします。 http://www.jcraft.com/jsch/examples/UserAuthKI.Java
これらの例では、ユーザー名、ホスト名、パスワードの入力を求められるため、すぐにテストできます。私はそれを自分のネットワークで実行し、コードを変更せずにAIXサーバーに接続できました。
これらの例には問題があることに注意してください(これが非表示になっている可能性があります)。チャネルが閉じられることはありません。 「exit」を送信すると、サーバーは接続を切断しますが、チャネルオブジェクトは開いたままになり、Javaプログラムは終了しません。ここに修正を提供しました: jSchを使用してサーバーの応答を読み取る