# Wer kennt sich aus mit ssh (ganymed ssh lib)



## Nicole81 (26. Sep 2007)

Huhu,

ich teste gerade etwas mit ssh und der ganymed ssh Libary.

Angenommen ich bin bereits auf dem Host eingeloggt und möchte nun mit sudo den User wechseln. Das ganze soll nicht über das Terminal sonder via einem JDialog geschehen, d.h. der Benutzer gibt UserName und Passwort in 2 Textfelder ein und ich schicke den sudo Befehl an den Host.
Nun möchte dieser ja ein Passwort von mir.

Wie kann ich das an den Host zurück schicken, damit der Benutzerwechseln stattfindet?

Habe schon einiges probiert allerdings klappt das irgendwie nie. Hier mal ein Lösungsansatz (Habe es auch schon mit Buffered Reader und dem StreamGobbler versucht). So wie es hier am Beispiel ist, bekommen ich das "Password:" als response (seltsamerweise aber vom stderr), wenn ich das pw dann abschicke kommt nochmal ein "\n" vom Host, was ja eigentlich richtig ist oder (komischerweise auch vom stderr)??? Aber wenn ich "whoami" ausführe wurde der Benutzer nicht gewechselt?!?!

Ich weiß, ist grottig programmiert aber soll ja nur zum Testen sein 

```
public void changeUserAtHost(String userName, char[] password)
	{		
		try
		{
			Session s = getSession();
			
			s.execCommand("sudo su - "+userName);
			
			InputStream stdout = s.getStdout();
			InputStream stderr = s.getStderr();
			OutputStream stdin = s.getStdin();
			byte[] buffer = new byte[8192];
			boolean once = true;
			
			// host antwort einholen
			while (true)
			{
				if ((stdout.available() == 0) && (stderr.available() == 0))
				{
					int conditions = s.waitForCondition(ChannelCondition.STDOUT_DATA | ChannelCondition.STDERR_DATA | ChannelCondition.EOF,
							10000);  // TODO: Options

					if ((conditions & ChannelCondition.TIMEOUT) != 0)
					{
						throw new IOException("Timeout while waiting for data from peer.");
					}

					if ((conditions & ChannelCondition.EOF) != 0)
					{
						if ((conditions & (ChannelCondition.STDOUT_DATA | ChannelCondition.STDERR_DATA)) == 0)
						{
							break;
						}
					}
				}

				while (stdout.available() > 0)
				{
					int len = stdout.read(buffer);
					if (len > 0)
					{
						System.out.write(buffer, 0, len);
					}
				}

				while (stderr.available() > 0)
				{
					int len = stderr.read(buffer);
					if (len > 0)
					{
						System.out.write(buffer, 0, len);
					}
				}
// password senden
				if (once)
				{
					for (char c : password)
						stdin.write(c);
					
					stdin.write(13);  // == \n
					
					once = false;
				}
			}
		}
		catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
```

Ich danke euch schon mal jungs.

Liebe Grüße Nicole


----------



## roman007 (2. Okt 2007)

Hi Nicole,


ich sitze am gleichen Problem und weiss auch net weiter.
Ich weiss nur, dass eine neue Konsole aufgemacht wird und wir an diese nicht rankommen. Merkt man im "normalem" Betrieb nicht, soll aber so sein.

Weiss hier jemand was?

Grüße
Roman


----------



## Guest (2. Feb 2008)

Ganymed heisst jetzt "Trilead SSH-2 for Java" und steht hier als Open Source zur Verfügung: Trilead SSH-2 for Java. Dort gibts auch ein Forum, da wird einem geholfen =)


----------

