Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java实现从一台机器到另一台机器的ssh_Java_Ssh_Jsch - Fatal编程技术网

如何使用Java实现从一台机器到另一台机器的ssh

如何使用Java实现从一台机器到另一台机器的ssh,java,ssh,jsch,Java,Ssh,Jsch,使用putty,我能够从一台机器到另一台机器进行ssh,然后从另一台机器进行ssh。就像一个链式过程。我希望在我的程序中复制相同的过程。到目前为止,我能够ssh到第一台机器。从那台机器如何ssh到后续机器。我还希望执行一些命令,如“pwd”或“ls” import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import java.io.*; public c

使用putty,我能够从一台机器到另一台机器进行ssh,然后从另一台机器进行ssh。就像一个链式过程。我希望在我的程序中复制相同的过程。到目前为止,我能够ssh到第一台机器。从那台机器如何ssh到后续机器。我还希望执行一些命令,如“pwd”或“ls”

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.io.*;

public class SSH {

   public static void main(String args[]) {

     String user = "******";
     String password = "******";
     String host = "******";
     int port=22;

     String remoteFile="something.txt";

     try {
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, port);
        session.setPassword(password);
        java.util.Properties config = new java.util.Properties(); 
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
        sftpChannel.connect();
        System.out.println("connected to first server....");
        InputStream out= null;
        out= sftpChannel.get(remoteFile);
        BufferedReader br = new BufferedReader(new InputStreamReader(out));
        String line;
        while ((line = br.readLine()) != null)
           System.out.println(line);
        br.close();

        /********* Here i want to ssh to another machine from the already connected one ******/

    String command = "pwd" ; //executing correctly with o/p
    Channel channel = session.openChannel("exec");
    ((ChannelExec) channel).setCommand(command);
    channel.setInputStream(null);
    InputStream in = channel.getInputStream();
    channel.connect();
    byte[] tmp=new byte[1024];
    while(true){
      while(in.available()>0){
        int i=in.read(tmp, 0, 1024);
        if(i<0)break;
        System.out.print(new String(tmp, 0, i));
      }
      if(channel.isClosed()){
        System.out.println("exit-status: "+channel.getExitStatus());
        break;
      }

    }
    channel.disconnect();

    Channel channel1 = session.openChannel("exec");
    ((ChannelExec) channel1).setCommand("ssh username@hostname" + "&&" + "password");//not    executing
    channel1.setInputStream(null);
    in = channel1.getInputStream();
    channel1.connect();
    channel1.disconnect();



    Channel channel2 = session.openChannel("exec");

    ((ChannelExec) channel2).setCommand("ls"); //to verify if ssh to 2nd machine has happened.not working
     channel2.setInputStream(null);
     in = channel2.getInputStream();
    channel2.connect();
   // byte[] tmp=new byte[1024];
    while(true){
      while(in.available()>0){
        int i=in.read(tmp, 0, 1024);
        if(i<0)break;
        System.out.print(new String(tmp, 0, i));
      }
      if(channel.isClosed()){
        System.out.println("exit-status: "+channel2.getExitStatus());
        break;
      }

    }
    channel2.disconnect();
    session.disconnect();
     } catch(Exception e) { System.err.print(e); }
   }

}
import com.jcraft.jsch.ChannelSftp;
导入com.jcraft.jsch.jsch;
导入com.jcraft.jsch.Session;
导入java.io.*;
公共类SSH{
公共静态void main(字符串参数[]){
字符串user=“*******”;
字符串密码=“*******”;
字符串host=“*******”;
int端口=22;
String remoteFile=“something.txt”;
试一试{
JSch JSch=新的JSch();
Session Session=jsch.getSession(用户、主机、端口);
session.setPassword(密码);
java.util.Properties config=new java.util.Properties();
配置放置(“检查”、“否”);
session.setConfig(config);
session.connect();
ChannelSftp sftpChannel=(ChannelSftp)session.openChannel(“sftp”);
sftpChannel.connect();
System.out.println(“连接到第一台服务器…”);
InputStream out=null;
out=sftpChannel.get(远程文件);
BufferedReader br=新的BufferedReader(新的InputStreamReader(out));
弦线;
而((line=br.readLine())!=null)
系统输出打印项次(行);
br.close();
/*********在这里,我想从已经连接的机器ssh到另一台机器******/
String command=“pwd”//使用o/p正确执行
Channel=session.openChannel(“exec”);
((ChannelExec)channel).setCommand(command);
channel.setInputStream(空);
InputStream in=channel.getInputStream();
channel.connect();
字节[]tmp=新字节[1024];
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);
if(i0){
inti=in.read(tmp,0,1024);
如果(i在session.connect()之后),请使用该代码在linux服务器中执行命令

                            session.connect();
            command = "pwd;" + "ssh username@hostname" + "&&" + "password" ; // u can give your own commands

            Channel channel = session.openChannel("exec");
            ((ChannelExec) channel).setCommand(command);
            channel.setInputStream(null);
            InputStream in = channel.getInputStream();
            channel.connect();
            byte[] tmp = new byte[1024];
            while (true) {
                while (in.available() > 0) {
                    int i = in.read(tmp, 0, 1024);
                    if (i > 0) {

                        output = new String(tmp, 0, i); // name a variable of your own

                    } else {

                        break;

                    }

                    System.out.println(output);

                }}
                                         channel.disconnect(); 
                                         session.disconnect();

确保断开频道连接。这样您就可以创建一个新频道并执行下一个命令。

我尝试了这个方法,它对我有效。但我不确定这是否是正确的过程

`公共类SSH{

public static void main(String[] args) {
    String server1="server1";
    String server2="server2";
    String user1="user1";
    String user2="user2";
    String password1="pswd1";
    String password2="pswd2";

    String command1="ls -ltr";

    try{

        java.util.Properties config = new java.util.Properties(); 
        config.put("StrictHostKeyChecking", "no");
        JSch jsch = new JSch();
        Session session1=jsch.getSession(user1, server1, 22);
        session1.setPassword(password1);
        session1.setConfig(config);
        session1.connect();
        System.out.println("Connected session1");



        Session session2=jsch.getSession(user2,server2);
        session2.setPassword(password2);
        session2.setConfig(config);
        session2.connect();
        System.out.println("Connected session2");


        Channel channel=session1.openChannel("exec");   
        ((ChannelExec)channel).setCommand(command1);
        channel.setInputStream(null);
        InputStream in=channel.getInputStream();
        ((ChannelExec)channel).setErrStream(System.err);   
        channel.connect();

        Channel channel1=session2.openChannel("exec");  
        ((ChannelExec)channel1).setCommand(command1);
        channel1.setInputStream(null);
        InputStream in1=channel1.getInputStream();
        ((ChannelExec)channel1).setErrStream(System.err);   
        channel1.connect();

        byte[] tmp=new byte[1024];
        while(true){
            while(in.available()>0){
                int i=in.read(tmp, 0, 1024);
                if(i<0)break;
                System.out.print(new String(tmp, 0, i));
            }
            if(channel.isClosed()){
                System.out.println("exit-status: "+channel.getExitStatus());
                break;
            }
            try{Thread.sleep(1000);}catch(Exception ee){}
        }
        while(true){
            while(in1.available()>0){
                int i=in1.read(tmp, 0, 1024);
                if(i<0)break;
                System.out.print(new String(tmp, 0, i));
            }
            if(channel1.isClosed()){
                System.out.println("exit-status: "+channel1.getExitStatus());
                break;
            }

            try{Thread.sleep(1000);}catch(Exception ee){}
        }
        channel.disconnect();
        session2.disconnect();
        session1.disconnect();
        System.out.println("DONE");
    }catch(Exception e){
        e.printStackTrace();
    }

}
publicstaticvoidmain(字符串[]args){
字符串server1=“server1”;
字符串server2=“server2”;
字符串user1=“user1”;
字符串user2=“user2”;
字符串password1=“pswd1”;
字符串password2=“pswd2”;
String command1=“ls-ltr”;
试一试{
java.util.Properties config=new java.util.Properties();
配置放置(“检查”、“否”);
JSch JSch=新的JSch();
sessionsession1=jsch.getSession(user1,server1,22);
会话1.设置密码(密码1);
session1.setConfig(config);
会话1.connect();
System.out.println(“连接会话1”);
sessionsession2=jsch.getSession(user2,server2);
会话2.设置密码(密码2);
session2.setConfig(config);
会话2.connect();
System.out.println(“连接会话2”);
Channel=session1.openChannel(“exec”);
((ChannelExec)channel.setCommand(command1);
channel.setInputStream(空);
InputStream in=channel.getInputStream();
((ChannelExec)channel.setErrStream(System.err);
channel.connect();
Channel channel1=session2.openChannel(“exec”);
((ChannelExec)channel1.setCommand(command1);
channel1.setInputStream(空);
InputStream in1=channel1.getInputStream();
((ChannelExec)channel1.setErrStream(System.err);
channel1.connect();
字节[]tmp=新字节[1024];
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);
if(i0){
inti=in1.read(tmp,0,1024);

如果(iYou)必须SSH连接到机器1,并将机器2的端口22转发到机器上的本地端口。然后SSH连接到该端口,这将使您连接到机器2。清洗并重复多个“链”您需要。您能提供有关如何将此端口更改为本地端口的详细信息吗?还有什么方法可以在这些机器上执行linux命令吗?我在windows机器上工作。好的,因此相应地修改了代码。对于我执行的第一个命令,我将得到结果,即“pwd”但是没有执行后续的命令。我尝试将此作为从当前计算机到另一台计算机的ssh的替代方法。请检查我所做的是否正确。Thanx提供帮助。请查看我编辑的代码。希望它有帮助。只需用分号分隔命令,以便您能够运行多个命令。但是他的任务是分别ssh两台不同的机器,但我想ssh从机器1到2,然后从2到3,并在任何机器上执行一些基本命令