# SSH Verbindung zur (MySQL-)Datenbank



## Guest (4. Jun 2007)

Ich möchte mit einem Java-Programm auf eine MySQL Datenbank zugreifen.
Lokal und übers eigene Netzwerk kein Problem, funktioniert bereits.
Jetzt möchte ich aber zusätzlich auf eine externe Datenbank zugreifen, sprich ich habe einen VirtualServer bei einem Hoster auf welchem unter anderen eine MySQL Datenbank läuft. Ich habe keinen Root-Zugriff auf diesem Server, jedoch eine SSH-Verbindung.

Die Frage:
Was muss ich tun um Datenbankzugriff zu erhalten, sprich das mein Java-Programm die Datenbank verändern und Daten auslesen kann? Muss der Server weitere Vorraussetzungen erfüllen bzw. Rechte vergeben damit das funktioniert (was ich dann mit dem Hoster abklären müsste)? 
Das Java-Programm läuft auf einem Windows-Betriebssystem (XP Pro)!

Muss/kann ich da sowas wie Putty verwenden oder kann ich das rein mit Java machen, brauch ich dafür eventuell sowas:
http://www.ganymed.ethz.ch/ssh2/
"Der Ganymed-SSH2 für Java-Bibliothek (implementiert das SSH-2-Protokoll) wird in Ganymed und einigen anderen Projekten an der ETH Zürich genutzt. Es ermöglicht dir, dich von deinen Java-Programmen aus an den SSH-Servern anzumelden."

?


Sorry falls das ne dumme Frage ist, hab leider noch keine Ahnung von Netzwerkprogrammierung, schon gar nicht in Java...


Gruß
Christian


----------



## Guest (14. Jun 2007)

keiner ne idee?


----------



## Guest (20. Jun 2007)

Habs zuerst mit Putty probiert und funktionierte auch einwandfrei.
Wollte es dann aber auch rein mit Java machen damit ich nicht überalle Putty installieren muss und immer mitstarten muss, habs also mit obigem Package versucht und kann nur sagen:
Funktioniert einwandfrei! 
Ohne try/catch sind es gerade mal *4 Zeilen* die man braucht um eine SSH Verbindung herzustellen INKLUSIVE Portforwarding!

Von daher kann ich das Package bisher absolut empfehlen!


----------



## Crach (12. Jul 2007)

Kannst du hinschreiben, wie du dies geschaft hast?^^


----------



## tuxedo (13. Jul 2007)

Hab sowas in der Art auch mal gemacht, nur nicht mit MySQL sondern mit nem Gameserver der nicht öffentlich zugänglich sein sollte. Ist schon ne klasse Sache...


----------



## Crach (13. Jul 2007)

Wie hast dies geschaft? Der Gast sprach ja davon, dass er es erst mittels Putty hinbekommen hatte - un d geh mal von aus, wenn putty es schaft, dann muss es auch mit java irgendwie gehen. 
Wie muss man Putty konfigurieren..oder allg. alles einstellen, damit man mit der datenbanl/oder was auch immer eine ssh-verbindung hat?


----------



## Waldi (13. Jul 2007)

Ich hab das schonmal mit http://www.ganymed.ethz.ch/ssh2/ geschafft. Ist ganz einfach. Also ich muss da eigentlich nichts dazu schreiben. Da sind beispiele dabei die selbsterklärend sind.


```
public class PublicKeyAuthentication
{
	public PublicKeyAuthentication()
	{
		String hostname = "IPDesServers";
		String username = "xyz";
//nur wenn public key authentication benutzt wird
		File keyfile = new File("id_rsa"); // or "~/.ssh/id_dsa"
		String keyfilePass = "abc"; // will be ignored if not needed

		try
		{
			/* Create a connection instance */

			Connection conn = new Connection(hostname);

			/* Now connect */

			conn.connect();

			/* Authenticate */

			boolean isAuthenticated = conn.authenticateWithPublicKey(username, keyfile, keyfilePass);

			if (isAuthenticated == false)
				throw new IOException("Authentication failed.");

			/* ===== OK, now let's establish some local port forwardings ===== */
			
			/* Example Port Forwarding: -L 8080:[url]www.ethz.ch:80[/url] (OpenSSH notation)
			 * 
			 * This works by allocating a socket to listen on 8080 on the local interface (127.0.0.1).
			 * Whenever a connection is made to this port (127.0.0.1:8080), the connection is forwarded
			 * over the secure channel, and a connection is made to [url]www.ethz.ch:80[/url] from the remote
			 * machine (i.e., the ssh server).
			 * 
			 * (the above text is based partially on the OpenSSH man page)
			 */

			/* You can create as many of them as you want */
			
			conn.createLocalPortForwarder(5432, "127.0.0.1", 5432);
			conn.createLocalPortForwarder(10000, "127.0.0.1", 10000);
			//LocalPortForwarder lpf1 = conn.createLocalPortForwarder(5432, hostname, 5432);
			
			/* Now simply point your webbrowser to 127.0.0.1:8080 */
			/* (on the host where you execute this program)                         */

			/* ===== OK, now let's establish some remote port forwardings ===== */
			
			/* Example Port Forwarding: -R 127.0.0.1:8080:[url]www.ganymed.ethz.ch:80[/url] (OpenSSH notation)
			 * 
			 * Specifies that the port 127.0.0.1:8080 on the remote server is to be forwarded to the
			 * given host and port on the local side.  This works by allocating a socket to listen to port
			 * 8080 on the remote side (the ssh server), and whenever a connection is made to this port, the
			 * connection is forwarded over the secure channel, and a connection is made to
			 * [url]www.ganymed.ethz.ch:80[/url] by the Ganymed SSH-2 library.
			 * 
			 * (the above text is based partially on the OpenSSH man page)
			 */

			/* You can create as many of them as you want */
			
			//conn.requestRemotePortForwarding("127.0.0.1", 5432, "192.168.0.4", 5432);

			/* Now, on the ssh server, if you connect to 127.0.0.1:8080, then the connection is forwarded
			 * through the secure tunnel to the library, which in turn will forward the connection
			 * to [url]www.ganymed.ethz.ch:80[/url]. */

			/* Sleep a bit... (30 seconds) */
			//sleepSomeTime(30000);

			/* Stop accepting remote connections that are being forwarded to [url]www.ganymed.ethz.ch:80[/url] */

			//conn.cancelRemotePortForwarding(5432);

			/* Sleep a bit... (20 seconds) */
			//sleepSomeTime(20000);

			/* Stop accepting connections on 127.0.0.1:8080 that are being forwarded to [url]www.ethz.ch:80[/url] */

			//lpf1.close();
			
			/* Close the connection */

			//conn.close();

		}
		catch (IOException e)
		{
			e.printStackTrace(System.err);
			JOptionPane.showMessageDialog (null,e.getMessage());
			System.exit(2);
		}
	}
```

Du musst dann die DB Anfragen auf 127.0.0.1 machen. In meinem Beispiel ist es so: Alle Port Anfragen auf 127.0.0.1:5432 werden durch den Tunnel auf den Server weitergeleitet und werden dort von 22 nach 5432 weitergeleitet.

Hoffe das war verständlich ansonsten guck dir mal die Seite an.


----------

