tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
1552
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    nFiniteFX nFiniteFX ist offline Grünschnabel
    Registriert seit
    Aug 2004
    Beiträge
    4
    Hallo,

    per JSch verbindet sich mein Java-Programm über SSH und soll dann Befehle absetzen. Dazu erwartet JSch einen InputStream.
    Mit System.in klappt das auch wunderbar, allerdings soll mein Programm die Befehle automatisch absetzen, also <Befehl1> <warten> <Befehl2> usw.
    Ist soetwas mit Java möglich? also dass ich sozusagen Tastatureingaben simuliere?
    Meine Idee war folgende:


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    String str = "ls -al \n";
    InputStream bais = new ByteArrayInputStream(str.getBytes());
                
    channel.setInputStream(bais);
    channel.setOutputStream(System.out);
            
    threadInput = new Thread() {
      public void run() {
        while (!channel.isEOF()) {
          if (threadInput == null) {
            return;
          }
          try {
            sleep(1000);
            // Nach 1s soll der neue String rausgeschrieben werden
            str = "hallo";
          } catch (Exception e) {
            // ignored
          }
        }
      }
    };

    Leider wird nur der erste Befehl ls -al korrekt angezeigt + ausgeführt. Muss ich dem InputStream irgendwie sagen, dass sich seine Quelle geändert hat? Schreibt denn ein Stream nicht immer alles fortlaufend weg?

    Vielen Dank im Voraus! Viele Grüße.
     

  2. #2
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Dein Problem ist tatsächlich der InputStream. Du kannst nicht einfach den String überschreiben und dann hoffen, das der ByteArrayInputStream das artig mitmacht. Möglicherweise gibt es eine bessere Lösung, aber ich fürchte, dass Du den Strom neu aufbauen musst. Habe Dein Problem mal ein bißchen vereinfacht...

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    package de.tutorials;
     
    import java.io.BufferedReader;
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
    import java.io.InputStreamReader;
     
    public class BaisDemo {
     
        /**
         * @param args
         * @throws  
         */
        public static void main(String[] args) throws Exception {
            String str = "ls -al \n";
            InputStream bais = new ByteArrayInputStream(str.getBytes());
            BufferedReader reader = new BufferedReader (new InputStreamReader(bais));
            System.out.println(reader.readLine());
            
            str = "neue Zeile\n";
            
            System.out.println(reader.readLine());
        }
     
    }

    Ausgabe:
    Code :
    1
    2
    
    ls -al 
    null
     
    I didn't write this; a very complex macro did.

  3. #3
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Ich kenne JSch nicht, aber vielleicht hilft das;

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
     
    package de.tutorials;
     
    import java.io.FileOutputStream;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
     
    public class BaisDemo {
     
        /**
         * @param args
         * @throws  
         */
        public static void main(String[] args) throws Exception {
            String str = "ls -al \n";
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            for (int i = 0; i < str.length() ; i++)
                buffer.put(str.getBytes()[i]);
            
            FileOutputStream ostream = new FileOutputStream("out.txt");
            FileChannel channel = ostream.getChannel();
            
            buffer.flip();
            channel.write(buffer);
            buffer.clear();
            
            str = "Neue Zeile\n";
            for (int i = 0; i < str.length() ; i++)
                buffer.put(str.getBytes()[i]);
            buffer.flip();
            channel.write(buffer);
            buffer.clear();
     
            ostream.close();
            
        }
     
    }
    EDIT
    Habe leider nicht viel Zeit, aber auch das könnte ein Ansatz sein

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
         JSch jsch=new JSch();
     
            Session session = jsch.getSession("ich", "localhost", 22);
            channel = session.openChannel("sftp");
            
            InputStream inputStream = new InputStream(){
     
                
                
                @Override
                public int read() throws IOException {
                    // TODO Auto-generated method stub
                    return 0;
                }};
            
            channel.setInputStream(inputStream);
            channel.setOutputStream(System.out);
    Geändert von limago (23.06.07 um 10:36 Uhr)
     
    I didn't write this; a very complex macro did.

  4. #4
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    schau mal hier:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    
    /**
     * 
     */
    package de.tutorials;
     
    import java.awt.Container;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.io.PrintWriter;
    import java.util.concurrent.TimeUnit;
     
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JPasswordField;
    import javax.swing.JTextField;
     
    import com.jcraft.jsch.ChannelShell;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;
    import com.jcraft.jsch.UIKeyboardInteractive;
    import com.jcraft.jsch.UserInfo;
     
    /**
     * @author Thomas.Darimont
     * 
     */
    public class JSchExample {
     
        /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
     
            JSch jsch = new JSch();
            jsch
                    .setKnownHosts("C:/Dokumente und Einstellungen/Thomas.Darimont/ssh/known_hosts");
            Session session = jsch.getSession("someUser", "someHost", 22);
            session.setUserInfo(new CustomUserInfo());
            session.setDaemonThread(true);
            session.connect(30000);
     
            try {
                ChannelShell channelShell = (ChannelShell) session
                        .openChannel("shell");
                channelShell.setOutputStream(System.out);
                channelShell.connect();
     
                String[] commands = { "cd /", "cd proc", "ls -aFl", "cat cpuinfo" };
     
                submitCommandsTo(channelShell, commands);
            } finally {
                session.disconnect();
            }
     
        }
     
        private static void submitCommandsTo(ChannelShell channelShell,
                String[] commands) throws Exception {
            PrintWriter printWriter = new PrintWriter(channelShell
                    .getOutputStream());
            for (String command : commands) {
                printWriter.println(command);
                printWriter.flush();
                TimeUnit.SECONDS.sleep(2);
            }
        }
     
        static class CustomUserInfo 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
                }
            }
        }
     
    }

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  5. #5
    nFiniteFX nFiniteFX ist offline Grünschnabel
    Registriert seit
    Aug 2004
    Beiträge
    4
    Habe Thomas' Lösung benutzt und es funktioniert hervorragend!

    Vielen Dank an euch!
     

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 26.09.10, 16:24
  2. Berechnung ausführen wenn Inhalt des textfeldes sich ändert
    Von no_ahnung im Forum Javascript & Ajax
    Antworten: 3
    Letzter Beitrag: 09.07.07, 14:49
  3. Antworten: 8
    Letzter Beitrag: 02.08.05, 16:58
  4. Antworten: 4
    Letzter Beitrag: 02.08.03, 12:57
  5. Antworten: 2
    Letzter Beitrag: 03.01.03, 18:30