JSch/SSHJ - Свързване към SSH сървър при натискане на бутон

Опитвам се да се свържа със SSH Unix сървър при натискане на бутон (код, написан в метода actionPerformed()). Използвам JSch за свързване към SSH сървър. Кодът е написан в клас SwingWorker, тъй като е мрежова операция.

private void testConnectionButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                     

        SwingWorker<Boolean, Void> sw = new SwingWorker<Boolean, Void>(){

            @Override
            protected Boolean doInBackground() throws Exception {
                JSch jsch = new JSch();

                String host = "ServerHost";
                String username = "username";
                String password = "password";

                Session session = jsch.getSession(username, host);
                session.setPassword(password);

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

                return true;
            }

            @Override
            public void done(){
                try {
                    System.out.println(get().toString());
                } catch (Exception ex) {
                    System.out.err(ex);
                } 
            }
        };

        sw.execute();

    }  

Но след като стартирам с правилни данни за хост, потребителско име и парола, получавам грешката по-долу през цялото време:

com.jcraft.jsch.JSchException: timeout: socket is not established
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
    at java.util.concurrent.FutureTask.get(FutureTask.java:83)
    at javax.swing.SwingWorker.get(SwingWorker.java:583)

Но всеки път, когато стартирам същия код в самостоятелна програма, имам предвид вместо това за писане на метод actionPerformed(), ако го напиша в нормален метод и извикване от main() метод. Ще работи. когато интегрирам същия код с метода actionPerformed() на Button Click, той ще ми даде горното изключение.

Може ли някой да предложи какво правя погрешно тук или трябва да се направи някаква промяна в кода.

Опитах се да се свържа със SSH сървър, използвайки реализация на "SSHJ", но получавам следната грешка:

java.net.SocketException: Connection reset
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
    at java.util.concurrent.FutureTask.get(FutureTask.java:83)
    at javax.swing.SwingWorker.get(SwingWorker.java:583)

Може ли някой да ми помогне - как да продължа напред?


person Sai    schedule 25.07.2011    source източник
comment
За мен работи (ако променя имената на сървъра, паролата и настройките за приемане на публичния ключ на сървъра и коригирам вашия system.out.err).   -  person Paŭlo Ebermann    schedule 25.07.2011
comment
Пауло, можеш ли да кажеш какви са настройките, които искаш да задам, за да приема публичния ключ на сървъра, част от кода ще бъде наистина полезна. Благодаря.   -  person Sai    schedule 26.07.2011
comment
JSch.setConfig("StrictHostKeyChecking", "no"). Но това не е ваш проблем, вашата програма дори не стига до тази точка (връзката е отказана или не е разрешена). Проверете настройките на защитната стена.   -  person Paŭlo Ebermann    schedule 26.07.2011
comment

Опитвам се да отворя java връзка, която съм запазил в моята папка на работния плот. Не мога да го накарам да намери файла. Java адресът е x:\green\Adam\FILEJAR.jar. Това е изпълним JAR файл. Искам да го отворя и да го имам на работния плот, просто го отворете и го накарайте да работи както обикновено за връзката Java. Искате Python просто да го отворите.

import subprocess
run="x:\green\Adam\FILEJAR.jar"
proc=subprocess.Popen(run)

разбирам това....

Traceback (most recent call last):
File "C:/Python32/test3", line 3, in <module>
proc=subprocess.Popen(run)
File "C:\Python32\lib\subprocess.py", line 741, in __init__
restore_signals, start_new_session)
File "C:\Python32\lib\subprocess.py", line 960, in _execute_child
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

Какво правя грешно, защо не може да намери файла?

  -  person Sai    schedule 26.07.2011


Отговори (1)


Взех вашия код, увих го в някакъв GUI код (и го преобразувах в негенеричен, за да мога да го компилирам със същите настройки като останалите примери на JSch). При мен работи. Опитайте това и докладвайте какво изключение получавате (има малко повече регистриране на изключения).

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

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:"));
        p.add(hostField);
        p.add(new JLabel("user:"));
        p.add(userNameField);
        p.add(new JLabel("password:"));
        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);
        }});
    }
}
person Paŭlo Ebermann    schedule 26.07.2011
comment
Това също е достъпно в github в моето JSch-хранилище на документация (пример за swingworker в клон, засега). - person Paŭlo Ebermann; 26.07.2011
comment
Пауло, изпълних кода ти, работи добре. Създавам GUI с помощта на Netbeans 7, има един клас: [org.jdesktop.application.ResourceMap], използвайки който получавам стойностите на свойствата от файла със свойства. Използвам го за задаване на текст за бутони, текстове на етикети. Ако не използвам този клас файл в кода, session.connect() работи. Наистина не знам връзката тук защо не успява да се свърже. Ако използвам дори един ред от клас ResourceMap, той няма да се свърже. Някакви мисли за това? - person Sai; 27.07.2011
comment
Нямам идея, никога не съм използвал този клас. Това може да е проблем с зареждането на класове - може би някакъв клас е дублиран във вашия класов път, което води до зареждане на грешен, ако се използва ResourceMap, поради някои зависимости? - person Paŭlo Ebermann; 27.07.2011
comment
този клас не присъства в пътя на класа ми, опитах с javap org.jdesktop.application.ResourceMap. Странно е да се наблюдава подобно поведение, така че единственият начин е да избягвате този клас засега? - person Sai; 27.07.2011