Putty via Java Process steuern

kleene0105

Mitglied
Hallo Zusammen,

wir dürfen zum Verbinden auf den Server nur Putty SSH Verbindungen benutzen.
Ich versuche gerade einen Wohlfühlfunktion für unsere User zu schreiben, damit diese nicht immer die Server-Logins eintragen müssen. Dabei habe ich aber Probleme nachdem ich Putty nun offen habe und das Profil geladen wurde Text an den Server zu schicken.

Vielleicht kann mir jemand helfen.
Mein Code sieht so aus:
Code:
	public static void main(String[] args) throws IOException,InterruptedException {
		String line;
		OutputStream stdin = null;
		InputStream stderr = null;
		InputStream stdout = null;
		
		ProcessBuilder builder = new ProcessBuilder("CMD","/K","<PUTTYLOCATION>/putty.exe -load <PROFILE>");
		Process p = builder.start();

		stdin = p.getOutputStream();
		stderr = p.getErrorStream();
		stdout = p.getInputStream();

		// "write" the parms into stdin
		line = "server-loginuser" + "\n";
		stdin.write(line.getBytes());
		stdin.flush();

	}

Der Text aus der Code-Stelle
Code:
              // "write" the parms into stdin
		line = "server-loginuser" + "\n";
		stdin.write(line.getBytes());
		stdin.flush();
kommt nicht am Server an.

Ich hoffe mir kann jemand weiterhelfen.
Danke
 

takidoso

Erfahrenes Mitglied
Hi kleene0105,
kan dass sein, dass Du in einen Eingang (StdIn) etwas schreiben willst, obgleich dieser Eingang zum lese und nicht zum Schreiben gedacht ist?
in anderen Worten, StdIn kannst do soweit ich weiß nur lesen hat einen InputStream während StdOut ist etwas nur zum Schreiben.

Takidoso
-----------------------

Ach sorry, habe gerade erst geshen, dass D lediglich die Bezeichnungen umgestellt hattest.

hmmmm Ich meine da gab es so eine Sache mit de StdIn und Out. Man braucht so etwas wie einen Gobler, sonst kann es sich aufhängen.

Ach wen ich nicht genau weiß, ob es Dir bei Deinem Problem helfen wird, habe ich mal sowas von irgndwoher verdachtsweise rausgeklaut (s. Kommentar)
Java:
package mein.packet

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;

import de.cmk.util.ExceptionHandlerLike;
import de.cmk.util.MExceptionHandler;

/**
 * Original auf http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 gefunden
 * @author 
 *
 */
public class StreamGobbler extends Thread
{
	private ExceptionHandlerLike m_exceptionHandler = null;
	private InputStream          m_is;
	private OutputStream         m_os;
	private String               m_type;
	
	
	public StreamGobbler (InputStream is, String tpye)
	{
		this (is, tpye, System.out, null);
	}
	
	public StreamGobbler (InputStream is, String tpye, OutputStream redirectionOutputStream)
	{
		this (is, tpye, redirectionOutputStream, null);
	}
	
	public StreamGobbler (InputStream is, String tpye, ExceptionHandlerLike eHandler)
	{
		this (is, tpye, System.out, eHandler);
	}
	
	public StreamGobbler (InputStream is, String type, OutputStream redirectionOutputStream, ExceptionHandlerLike eHandler)
	{
		m_is               = is;
		m_type             = type == null ? "" : type+": ";
		m_os               = redirectionOutputStream;
		m_exceptionHandler = eHandler;
		
		if (is == null)
		{
			throw new IllegalArgumentException("InputStream must not be null");
		}
	}
	
	public void setExceptionHandler(ExceptionHandlerLike eHandler)
	{
		m_exceptionHandler = eHandler;
	}
	public ExceptionHandlerLike getExceptionHandler()
	{
		return m_exceptionHandler;
	}
	
	public void run()
	{
		PrintWriter pWriter = null;;
		try
		{
			if (m_os!=null)
			{
				pWriter = new PrintWriter(m_os);
			}

			
			BufferedReader bReader = new BufferedReader(new InputStreamReader(m_is));
			
			
			String line;
			while ((line=bReader.readLine())!=null)
			{
				if (pWriter != null)
				{
					pWriter.println(m_type+line);
				}
			}
			
		}
		catch (IOException ioEx)
		{
			if (m_exceptionHandler==null)
			{
				MExceptionHandler.handleException(ioEx);
			}
			else
			{
				m_exceptionHandler.handleException(ioEx);
			}
		}
		finally
		{
			//System.out.println("StreamGobbler "+m_type+" finalized");
			if (pWriter!=null)
			{
				pWriter.flush();
				if (m_os != System.out && m_os != System.err)
				{
					pWriter.close();
				}
			}
		}
	}
}


und so würde es beispielswise angewendet:
Java:
...
            Process p = pb.start();
            //Runtime rt = Runtime.getRuntime();
            //Process p = rt.exec(toks);
            String originalFileName = originalFileNames.iterator().next(); // damit es nicht zu kompliziert wird hier nur der erste Eingangsname.
            m_applValues = new Object[] {originalFileNames, replaceTokens, props};
            StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(),m_config.getStdErrBypassTag(originalFileName), m_config.getStdErrBypass(originalFileName), myExtHandler);
            StreamGobbler stdGobbler   = new StreamGobbler(p.getInputStream(),m_config.getStdOutBypassTag(originalFileName), m_config.getStdOutBypass(originalFileName), myExtHandler);
            errorGobbler.start();
            stdGobbler.start();
...
 
Zuletzt bearbeitet:

kleene0105

Mitglied
@takidoso Danke für den Hinweis mit den Threads.
Was ich probiert hatte war mit Plink das ganze Thema auszuprobieren. Da hatte es geklappt. Allerdings wird dort ja die Shell nicht angezeigt.
Ich melde mich wenn ich das mit dem Kapseln der Threads ausprobiert habe.

@slowfly Wir haben drei Profile hinterlegt im Putty und eines wird über das Script gestartet. Ich schau mit bei Gelegenheit nochmal die Einstellungen in Putty an. Allerdings muss ich per Outputstream weitere Daten über die Session an den Server schicken, damit der User von lästigen Tastatureingaben befreit wird.