¿Cómo me puedo conectar a la base de datos MySQL remota a través de SSH desde la aplicación Java? El ejemplo de código pequeño es útil para mí y agradecería esto.conéctese a la base de datos remota de mysql a través de ssh usando java
Respuesta
Según tengo entendido, usted desea acceder a un servidor mysql que se ejecuta en una máquina remota y escuchar, digamos, el puerto 3306 a través de un túnel SSH.
Para crear un túnel de este tipo desde el puerto 1234 en la máquina local al puerto 3306 en una máquina remota utilizando el cliente de línea de comandos ssh, debe escribir el siguiente comando desde la máquina local:
ssh -L 1234:localhost:3306 mysql.server.remote
Para hacer lo mismo desde Java, puede usar JSch, una implementación Java de SSH2. Desde su sitio web:
JSch le permite conectarse a un servidor sshd y usar el reenvío de puertos, reenvío X11, transferencia de archivos, etc., y puede integrar su funcionalidad en sus propios programas Java. JSch tiene licencia bajo la licencia de estilo BSD.
Por poner un ejemplo, echa un vistazo a PortForwardingL.java
. Una vez que la sesión se conectó, cree su conexión JDBC a MySQL usando algo como jdbc:mysql://localhost:1234/[database]
como URL de conexión.
sí, lo he hecho de acuerdo a su dirección ... gracias –
no funciona para mí .. después de que la sesión está conectada, cuando intento conectarme a 'localhost: [puerto]' desde java, lo intenta por siempre, sin dar ninguna excepción, pero no se puede conectar a la base de datos. Se agradece cualquier ayuda. – harsh
Mi código detalle es el siguiente:
package mypackage;
import java.sql.*;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class UpdateMySqlDatabase {
static int lport;
static String rhost;
static int rport;
public static void go(){
String user = "ripon";
String password = "wasim";
String host = "myhost.ripon.wasim";
int port=22;
try
{
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
lport = 4321;
rhost = "localhost";
rport = 3306;
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
System.out.println("Establishing Connection...");
session.connect();
int assinged_port=session.setPortForwardingL(lport, rhost, rport);
System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);
}
catch(Exception e){System.err.print(e);}
}
public static void main(String[] args) {
try{
go();
} catch(Exception ex){
ex.printStackTrace();
}
System.out.println("An example for updating a Row from Mysql Database!");
Connection con = null;
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://" + rhost +":" + lport + "/";
String db = "testDB";
String dbUser = "wasim";
String dbPasswd = "riponalwasim123";
try{
Class.forName(driver);
con = DriverManager.getConnection(url+db, dbUser, dbPasswd);
try{
Statement st = con.createStatement();
String sql = "UPDATE MyTableName " +
"SET email = '[email protected]' WHERE email='[email protected]'";
int update = st.executeUpdate(sql);
if(update >= 1){
System.out.println("Row is updated.");
}
else{
System.out.println("Row is not updated.");
}
}
catch (SQLException s){
System.out.println("SQL statement is not executed!");
}
}
catch (Exception e){
e.printStackTrace();
}
}
}
package framework.restapi.utils;
import java.sql.*;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
public class SQLConnection {
private static Connection connection = null;
private static Session session = null;
private static void connectToServer(String dataBaseName) throws SQLException {
connectSSH();
connectToDataBase(dataBaseName);
}
private static void connectSSH() throws SQLException {
String sshHost = "";
String sshuser = "";
String dbuserName = "";
String dbpassword = "";
String SshKeyFilepath = "/Users/XXXXXX/.ssh/id_rsa";
int localPort = 8740; // any free port can be used
String remoteHost = "127.0.0.1";
int remotePort = 3306;
String localSSHUrl = "localhost";
/***************/
String driverName = "com.mysql.jdbc.Driver";
try {
java.util.Properties config = new java.util.Properties();
JSch jsch = new JSch();
session = jsch.getSession(sshuser, sshHost, 22);
jsch.addIdentity(SshKeyFilepath);
config.put("StrictHostKeyChecking", "no");
config.put("ConnectionAttempts", "3");
session.setConfig(config);
session.connect();
System.out.println("SSH Connected");
Class.forName(driverName).newInstance();
int assinged_port = session.setPortForwardingL(localPort, remoteHost, remotePort);
System.out.println("localhost:" + assinged_port + " -> " + remoteHost + ":" + remotePort);
System.out.println("Port Forwarded");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void connectToDataBase(String dataBaseName) throws SQLException {
String dbuserName = "sf2_showpad_biz";
String dbpassword = "lOAWEnL3K";
int localPort = 8740; // any free port can be used
String localSSHUrl = "localhost";
try {
//mysql database connectivity
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerName(localSSHUrl);
dataSource.setPortNumber(localPort);
dataSource.setUser(dbuserName);
dataSource.setAllowMultiQueries(true);
dataSource.setPassword(dbpassword);
dataSource.setDatabaseName(dataBaseName);
connection = dataSource.getConnection();
System.out.print("Connection to server successful!:" + connection + "\n\n");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void closeConnections() {
CloseDataBaseConnection();
CloseSSHConnection();
}
private static void CloseDataBaseConnection() {
try {
if (connection != null && !connection.isClosed()) {
System.out.println("Closing Database Connection");
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
private static void CloseSSHConnection() {
if (session != null && session.isConnected()) {
System.out.println("Closing SSH Connection");
session.disconnect();
}
}
// works ONLY FOR single query (one SELECT or one DELETE etc)
private static ResultSet executeMyQuery(String query, String dataBaseName) {
ResultSet resultSet = null;
try {
connectToServer(dataBaseName);
Statement stmt = connection.createStatement();
resultSet = stmt.executeQuery(query);
System.out.println("Database connection success");
} catch (SQLException e) {
e.printStackTrace();
}
return resultSet;
}
public static void DeleteOrganisationReferencesFromDB(String organisationsLike) {
try {
connectToServer("ServerName");
Statement stmt = connection.createStatement();
ResultSet resultSet = stmt.executeQuery("select * from DB1");
String organisationsToDelete = "";
List<String> organisationsIds = new ArrayList<String>();
// create string with id`s values to delete organisations references
while (resultSet.next()) {
String actualValue = resultSet.getString("id");
organisationsIds.add(actualValue);
}
for (int i = 0; i < organisationsIds.size(); i++) {
organisationsToDelete = " " + organisationsToDelete + organisationsIds.get(i);
if (i != organisationsIds.size() - 1) {
organisationsToDelete = organisationsToDelete + ", ";
}
}
stmt.executeUpdate(" DELETE FROM `DB1`.`table1` WHERE `DB1`.`table1`.`organisation_id` in (" + organisationsToDelete + ");");
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnections();
}
}
public static List<String> getOrganisationsDBNamesBySubdomain(String organisationsLike) {
List<String> organisationDbNames = new ArrayList<String>();
ResultSet resultSet = executeMyQuery("select `DB`.organisation.dbname from `DB1`.organisation where subdomain like '" + organisationsLike + "%'", "DB1");
try {
while (resultSet.next()) {
String actualValue = resultSet.getString("dbname");
organisationDbNames.add(actualValue);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnections();
}
return organisationDbNames;
}
public static List<String> getAllDBNames() {
// get all live db names incentral DB
List<String> organisationDbNames = new ArrayList<String>();
ResultSet resultSet = executeMyQuery("show databases", "DB1");
try {
while (resultSet.next()) {
String actualValue = resultSet.getString("Database");
organisationDbNames.add(actualValue);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeConnections();
}
return organisationDbNames;
}
public static void deleteDataBasesByName(List<String> DataBasesNamesList) {
try {
connectSSH();
int dataBasesAmount = DataBasesNamesList.size();
for (int i = 0; i < dataBasesAmount; i++) {
connectToDataBase(DataBasesNamesList.get(i));
Statement stmt = connection.createStatement();
stmt.executeUpdate("DROP database `" + DataBasesNamesList.get(i) + "`");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
CloseDataBaseConnection();
closeConnections();
}
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
public class CTestDriver {
private static void doSshTunnel(String strSshUser, String strSshPassword, String strSshHost, int nSshPort,
String strRemoteHost, int nLocalPort, int nRemotePort) throws JSchException {
final JSch jsch = new JSch();
Session session = jsch.getSession(strSshUser, strSshHost, 22);
session.setPassword(strSshPassword);
final Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
session.setPortForwardingL(nLocalPort, strRemoteHost, nRemotePort);
}
public static void main(String[] args) {
try {
String strSshUser = "ssh_user_name"; // SSH loging username
String strSshPassword = "abcd1234"; // SSH login password
String strSshHost = "your.ssh.hostname.com"; // hostname or ip or
// SSH server
int nSshPort = 22; // remote SSH host port number
String strRemoteHost = "your.database.hostname.com"; // hostname or
// ip of
// your
// database
// server
int nLocalPort = 3366; // local port number use to bind SSH tunnel
int nRemotePort = 3306; // remote port number of your database
String strDbUser = "db_user_name"; // database loging username
String strDbPassword = "4321dcba"; // database login password
CTestDriver.doSshTunnel(strSshUser, strSshPassword, strSshHost, nSshPort, strRemoteHost, nLocalPort,
nRemotePort);
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:" + nLocalPort, strDbUser,
strDbPassword);
con.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.exit(0);
}
}
}
Proporcione algunos detalles de la solución. –
Se puede decir que cuando desea conectarse al host remoto usando otro host, es decir, se conecta a un host y desde allí se conecta al host principal. Esto se hace con fines de seguridad. – Ankur
- 1. Conéctese a mysql remoto a través de la terminal
- 2. ¿Sincronizar base de datos remota a local?
- 3. Conéctese condicionalmente a una base de datos
- 4. ¿cómo puedo exportar la base de datos mysql usando ssh?
- 5. Cómo conectarse a MySQL desde C# a través de SSH
- 6. remota se conecta a una base de datos MySQL
- 7. Ejecución de mandatos completos a través de SSH remota
- 8. Conexión a una base de datos remota a través de CodeIgniter
- 9. Conéctese a AS400 usando .NET
- 10. Conéctese a una base de datos heroku con pgadmin
- 11. ¿Cómo conectarse a una base de datos remota de MySQL con Java?
- 12. Acceso de Android a la base de datos SQL remota
- 13. Conectar a la base de datos a través de proxy una secuencia de comandos python
- 14. Conexión MySQL remota a través de alojamiento gratuito
- 15. ssh a través de shell emacs?
- 16. Conéctese a dos bases de datos
- 17. Conexión SSH a MySQL usando la biblioteca SSH.NET
- 18. Restaurar archivo .bak a la base de datos remota
- 19. Base de datos remota de mysql en la aplicación Heroku
- 20. Obtener salida de la base de datos MySQL a través de PHP a XML
- 21. Actualización de una base de datos MySql usando PHP a través de una función onClick javascript
- 22. scripting MySQL desde BASH a través de SSH
- 23. Transferir archivo a través de ssh
- 24. Instalación de Java en Linux a través de SSH
- 25. conéctese a mysql con C# .net
- 26. Java: problemas para conectarse a la base de datos MySQL en línea usando JDBC
- 27. Script Python: conéctese a SSH y ejecute el comando
- 28. ¿Editar archivos remotos a través de SSH, usando TextMate?
- 29. Ejecutar comando remoto a través de ssh usando Maven3
- 30. Cómo conectarse a una base de datos remota desde la aplicación de Iphone nativa
Tome un vistazo a [esta respuesta] (http://stackoverflow.com/questions/252258/java-sql-connection-extension -for-ssh) ... – TofuBeer