String -> InputStream und wenn sich der String ändert?

nFiniteFX

Grünschnabel
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:
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.
 
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...

Java:
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:
ls -al 
null
 
Ich kenne JSch nicht, aber vielleicht hilft das;

Java:
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

Java:
	 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);
 
Zuletzt bearbeitet:
Hallo,

schau mal hier:
Java:
/**
 * 
 */
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
 
Zurück