com.jcraft.jsch.JSchException:java.net.ConnectException:连接被拒绝:连接

时间:2014-12-02 04:36:49

标签: sockets jsch

我知道有重复的>>>从副本>>>复制;只要您的本地计算机有运行的SSH服务器<<<<<<但是我无法发表评论,也不能从问题中得出(而且我没有提供答案......)

它声明“只要您的本地计算机运行SSH服务器”,但我不知道如何运行SSh服务器。我打开我的腻子(双击它)(不确定这是否意味着SSH(?Putty?)服务器(?)正在运行......怀疑......

我是套接字编程的新手。我正在使用JSch(http://www.jcraft.com/jsch/)尝试连接到远程服务器(后期阶段) 目前,这是我使用的代码,我试图连接到我的本地计算机并执行命令(确切地说是ls)来进行测试。但是,我一直拒绝连接。我用谷歌搜索,我注意到有一些文章提到“有服务器监听”,但我不知道它意味着什么。请查看我的代码如下。

import java.awt.event.*;

import javax.swing.*;

import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;

import com.jcraft.jsch.*;



class SwingWorkerExample {

    JTextField hostField;
    JTextField userNameField;
    JTextField passwordField;
    JPanel panel;


    public SwingWorkerExample() {
        JPanel p = panel = new JPanel(new GridLayout(0,2));
        hostField = new JTextField(20);
        userNameField = new JTextField(20);
        passwordField = new JPasswordField(20);
        JButton testButton = new JButton("connect!");
        testButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ev) {
                    testConnectionButtonActionPerformed(ev);
                }
            });
        p.add(new JLabel("host:"));
        //127.0.0.1
        p.add(hostField);
        p.add(new JLabel("user:"));
        //mycomputerusername
        p.add(userNameField);
        p.add(new JLabel("password:"));
        //mycomputerpassword
        p.add(passwordField);
        p.add(testButton);
    }

    public JPanel getPanel() {
        return panel;
    }

    private void testConnectionButtonActionPerformed(ActionEvent evt) {

        SwingWorker sw = new SwingWorker(){

                protected Object doInBackground() throws Exception {
                    try {
                        JSch jsch = new JSch();

                        String host = hostField.getText();
                        String username = userNameField.getText();
                        String password = passwordField.getText();

                        Session session = jsch.getSession(username, host);
                        session.setPassword(password);
                        session.setConfig("StrictHostKeyChecking", "no");

                        session.setTimeout(20000);
                        System.out.println("Connecting to server...");
                        session.connect();

                        return session;
                    }
                    catch(Exception ex) {
                        ex.printStackTrace();
                        throw ex;
                    }
                }

                public void done(){
                    try {
                        System.out.println(get());
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            };

        sw.execute();

    }


    public static void main(String[] egal) {
        EventQueue.invokeLater(new Runnable(){public void run() {
            SwingWorkerExample ex = new SwingWorkerExample();
            JFrame f = new JFrame("bla");
            f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            f.setContentPane(ex.getPanel());
            f.pack();
            f.setVisible(true);
        }});
    }

    public void remoteLs() throws JSchException, IOException {
        JSch js = new JSch();
        Session s = js.getSession("kellyseo", "192.168.0.103", 22);
        s.setPassword("S9031808z");
        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();    
      }
}

BTW我使用命令提示ping 127.0.0.1没关系,但是如果我使用telnet 127.0.0.1它说无法打开与主机的连接(我打开putty(?双击?),在端口23上:连接失败。 而且,SSH = PUTTY ......对吗? (我不能在命令提示符中使用'ssh'命令)

链接: 1)http://sourceforge.net/p/jsch/mailman/message/31745775/

和2)http://javarevisited.blogspot.sg/2013/02/java-net-ConnectException-Connection-refused.html

和3)http://www.jcraft.com/jsch/examples/  和4)Run a command over SSH with JSch  和5)Can we use JSch for SSH key-based communication?

和...谢谢是提前!!

哦,还有theres http://www.ganymed.ethz.ch/ssh2/(JSch的替代品......任何建议都欢迎!)但是当我尝试运行这个例子时,它说没有主要的。哪个..我duno>。<在那之前会坚持使用JSch ....

BTW,我为服务器尝试https://serverfault.com/questions/185153/free-public-ssh-server-for-testing-purposes但是...我不知道地址,用户名和密码是什么。 (我还有一个http://sdf.org帐户新创建,但当我尝试连接到它时,它会显示unknownhost.fyi!)

忘了提,我使用的是Windows 7,而'yum'在我的命令提示符中不是命令...

3 个答案:

答案 0 :(得分:5)

您尝试通过SSH协议连接到本地主机。对于JSCH,这不完全是套接字编程,但是你的问题与套接字编程有关。

基本上你的问题是你的程序试图连接到一个没有打开的端口,特别是在这个实例的端口22.你没有SSH服务器所以你的SSH客户无能为力。您正在给没有电话的人打电话。

要解决此问题,您需要找到一个运行ssh的测试服务器,以便在本地PC上进行开发或安装ssh服务器。对于Windows框,最好的选择是cygwin,这将允许您模拟posix系统并在本地计算机上运行SSHD。谷歌搜索cygwin和sshd将为您提供如何设置它的示例。

答案 1 :(得分:0)

我不知道为什么但是我可以将putty添加到我自己的localhost之后,虽然上面(示例代码,并且感谢您提供代码)我面临错误但是以下代码(再次感谢您提供代码这段代码来自JCraft,如果我不混淆,可以工作!我设法发送命令'help')。非常感谢#chris midolo提供答案和#Robby Cornelissen评论......虽然我变得更加困惑(所以...... SSH意味着服务器和客户端(?)叹息......我虽然远程访问意味着只要我的计算机打开,我就可以从其他地方访问它...所以我的计算机,为了从其他地方访问,也必须有某种服务器运行...天啊!我的头疼...... )

请注意,除了使用其他命令的'help',将导致'无法在远程系统上执行命令或shell:执行失败的过程。根据{{​​3}},您需要使用 cmd /c dir 并执行我的bat文件,我需要使用C:\ Users \ kellyseo \ sampling.bat(如果我只使用sampling.bat,它会显示错误)

我的批处理文件内容如下:

ECHO RUNNING kellyseo SAMPLING.BAT
@ECHO OFF
CD C:\Users\kellyseo\Desktop
set ldt=kellyseo folder version executed on %date% %time%
echo %ldt%>> logs.txt
EXIT

我实际上有两个版本的同一个文件(一个我放在桌面上)然后我只能使用'sampling.bat'

如果你不喜欢很多提示,除了删除提示之外,如果你面对这个 com.jcraft.jsch.JSchException:UnknownHostKey ,你可能还需要以下代码(感谢{{ 3}})

session.setPassword(password);
java.util.Properties config = new java.util.Properties(); 
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();

**注意:#1提示=输入密码。 #2 prompt =输入命令。用户名是'user1'

/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
/**
 * This program will demonstrate remote exec.
 *   $ CLASSPATH=.:../build javac Exec.java 
 *   $ CLASSPATH=.:../build java Exec
 * You will be asked username, hostname, displayname, passwd and command.
 * If everything works fine, given command will be invoked 
 * on the remote side and outputs will be printed out.
 *
 */
import com.jcraft.jsch.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;

public class Exec{
  public static void main(String[] arg){
    try{
      JSch jsch=new JSch();  
/*
      String host=null;
      if(arg.length>0){
        host=arg[0];
      }
      else{
        host=JOptionPane.showInputDialog("Enter username@hostname",
                                         System.getProperty("user.name")+
                                         "@localhost"); 
      }
      String user=host.substring(0, host.indexOf('@'));
      host=host.substring(host.indexOf('@')+1);
*/
      String user1 = "user1";
      String host1 = "127.0.0.1";
      Session session=jsch.getSession(user1, host1, 22);

      /*
      String xhost="127.0.0.1";
      int xport=0;
      String display=JOptionPane.showInputDialog("Enter display name", 
                                                 xhost+":"+xport);
      xhost=display.substring(0, display.indexOf(':'));
      xport=Integer.parseInt(display.substring(display.indexOf(':')+1));
      session.setX11Host(xhost);
      session.setX11Port(xport+6000);
      */

      // username and password will be given via UserInfo interface.
      UserInfo ui=new MyUserInfo();
      session.setUserInfo(ui);
      session.connect();

      String command=JOptionPane.showInputDialog("Enter command", 
                                                 "set|grep SSH");

      Channel channel=session.openChannel("exec");
      ((ChannelExec)channel).setCommand(command);

      // X Forwarding
      // channel.setXForwarding(true);

      //channel.setInputStream(System.in);
      channel.setInputStream(null);

      //channel.setOutputStream(System.out);

      //FileOutputStream fos=new FileOutputStream("/tmp/stderr");
      //((ChannelExec)channel).setErrStream(fos);
      ((ChannelExec)channel).setErrStream(System.err);

      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()){
          if(in.available()>0) continue; 
          System.out.println("exit-status: "+channel.getExitStatus());
          break;
        }
        try{Thread.sleep(1000);}catch(Exception ee){}
      }
      channel.disconnect();
      session.disconnect();
    }
    catch(Exception e){
      System.out.println(e);
    }
  }

  public static class MyUserInfo implements UserInfo, UIKeyboardInteractive{
    public String getPassword(){ return passwd; }
    public boolean promptYesNo(String str){
      Object[] options={ "yes", "no" };
      int foo=JOptionPane.showOptionDialog(null, 
             str,
             "Warning", 
             JOptionPane.DEFAULT_OPTION, 
             JOptionPane.WARNING_MESSAGE,
             null, options, options[0]);
       return foo==0;
    }

    String passwd;
    JTextField passwordField=(JTextField)new JPasswordField(20);

    public String getPassphrase(){ return null; }
    public boolean promptPassphrase(String message){ return true; }
    public boolean promptPassword(String message){
      Object[] ob={passwordField}; 
      int result=
        JOptionPane.showConfirmDialog(null, ob, message,
                                      JOptionPane.OK_CANCEL_OPTION);
      if(result==JOptionPane.OK_OPTION){
        passwd=passwordField.getText();
        return true;
      }
      else{ 
        return false; 
      }
    }
    public void showMessage(String message){
      JOptionPane.showMessageDialog(null, message);
    }
    final GridBagConstraints gbc = 
      new GridBagConstraints(0,0,1,1,1,1,
                             GridBagConstraints.NORTHWEST,
                             GridBagConstraints.NONE,
                             new Insets(0,0,0,0),0,0);
    private Container panel;
    public String[] promptKeyboardInteractive(String destination,
                                              String name,
                                              String instruction,
                                              String[] prompt,
                                              boolean[] echo){
      panel = new JPanel();
      panel.setLayout(new GridBagLayout());

      gbc.weightx = 1.0;
      gbc.gridwidth = GridBagConstraints.REMAINDER;
      gbc.gridx = 0;
      panel.add(new JLabel(instruction), gbc);
      gbc.gridy++;

      gbc.gridwidth = GridBagConstraints.RELATIVE;

      JTextField[] texts=new JTextField[prompt.length];
      for(int i=0; i<prompt.length; i++){
        gbc.fill = GridBagConstraints.NONE;
        gbc.gridx = 0;
        gbc.weightx = 1;
        panel.add(new JLabel(prompt[i]),gbc);

        gbc.gridx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weighty = 1;
        if(echo[i]){
          texts[i]=new JTextField(20);
        }
        else{
          texts[i]=new JPasswordField(20);
        }
        panel.add(texts[i], gbc);
        gbc.gridy++;
      }

      if(JOptionPane.showConfirmDialog(null, panel, 
                                       destination+": "+name,
                                       JOptionPane.OK_CANCEL_OPTION,
                                       JOptionPane.QUESTION_MESSAGE)
         ==JOptionPane.OK_OPTION){
        String[] response=new String[prompt.length];
        for(int i=0; i<prompt.length; i++){
          response[i]=texts[i].getText();
        }
    return response;
      }
      else{
        return null;  // cancel
      }
    }
  }
}

答案 2 :(得分:0)

如果您使用的是Mac,则可能无法远程登录服务器(在本例中为您的计算机)。转到系统偏好设置 - &gt;共享并启用远程登录。还要添加您要使用的用户。