Java 응용 프로그램의 SSH를 통해 원격 MySQL 데이터베이스에 어떻게 연결할 수 있습니까? 작은 코드 예제는 나에게 도움이된다. 그리고 나는 이것을 이해할 것이다.java를 사용하여 ssh를 통해 원격 mysql 데이터베이스에 연결
답변
필자가 원격 컴퓨터에서 실행중인 mysql 서버에 액세스하여 수신 대기중인 경우 포트 3306을 SSH 터널을 통해 사용한다고 가정합니다.
명령 행 SSH 클라이언트를 사용하여 원격 컴퓨터의 포트 3306에 로컬 컴퓨터의 포트 1234에서 이러한 터널을 만들려면 로컬 컴퓨터에서 다음 명령을 입력합니다ssh -L 1234:localhost:3306 mysql.server.remote
하기 위해 Java에서와 동일한 것은 JSch, Java 구현 인 SSH2를 사용할 수 있습니다. 웹 사이트에서 :
JSch는 당신이 SSHD 서버에 연결 등 포트 포워딩, X11 포워딩, 파일 전송을 사용할 수 있습니다, 당신은 당신의 자신의 자바 프로그램으로 그 기능을 통합 할 수 있습니다. JSch는 BSD 스타일 라이센스에 따라 라이센스가 부여됩니다.
예를 들어, PortForwardingL.java
을 살펴보십시오. 세션이 연결되면 연결 URL로 jdbc:mysql://localhost:1234/[database]
과 같은 것을 사용하여 MySQL에 대한 JDBC 연결을 생성하십시오.
예, 당신의 지시에 따라 ... 감사합니다 –
그것은 나를 위해 일하지 않습니다 .. 세션이 연결된 후'localhost : [port]'에 연결하려고하면 자바, 어떤 예외를주지 않고 영원히 같은 시도하지만 데이터베이스에 연결할 수 없습니다. 도움을 주시면 감사하겠습니다. – harsh
내 세부 코드는 다음과 같습니다 :
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);
}
}
}
솔루션에 대한 세부 정보를 제공하십시오. –
다른 호스트를 사용하여 원격 호스트에 연결하려는 경우, 즉 하나의 호스트에 연결하고 거기에서 기본 호스트에 연결할 때 보안의 목적으로 수행됩니다. – Ankur
- 1. Java를 MySQl 데이터베이스에 연결
- 2. Java를 사용하여 외부 데이터베이스에 연결
- 3. PHP로 SSH를 통해 MySQL에 연결
- 4. Netbeans의 SSH를 통해 MySql db에 연결
- 5. MySQL의 권한은 지역에서 거부하지만 난 명령을 통해 (ssh를 통해) 원격 서버에 내 MySQL 데이터베이스에 연결하려고 원격
- 6. Java를 사용하여 원격 MySQL 데이터베이스에 연결하는 방법은 무엇입니까?
- 7. 원격 mysql 데이터베이스 연결
- 8. VB.NET에서 mysql 데이터베이스에 연결
- 9. MySQL 데이터베이스에 연결
- 10. Java를 통해 원격 데이터베이스에 액세스 할 수없는 이유는 무엇입니까?
- 11. 원격 mysql 연결
- 12. ODBC를 통해 C#으로 MySQL 데이터베이스에 연결
- 13. C++에서 MySQL 데이터베이스에 연결 PHP를 통해
- 14. 파이썬으로 ssh를 통해 원격 기계에서 스크립트를 시작하십시오.
- 15. 안드로이드 - MySQL 데이터베이스에 연결
- 16. ssh를 사용하는 mySQL 쿼리 브라우저 연결
- 17. Java를 사용하여 MySQL에 연결
- 18. PHP에서 MySQL 데이터베이스에 연결
- 19. Python에서 MySQL 데이터베이스에 연결
- 20. 로컬 컴퓨터를 통해 원격 MySQL에 연결
- 21. Java를 사용하여 PostgreSQL 8.2와 연결
- 22. ASP.net을 통해 ODBC를 사용하여 Access 데이터베이스에 연결
- 23. localhost에서 온라인 MySQL 데이터베이스에 연결
- 24. Java를 사용하여 데이터베이스에 이미지 삽입
- 25. Java를 사용하여 원격 파일 읽기
- 26. 텔넷을 통해 외부 데이터베이스에 연결
- 27. ssh를 허가 내가 원격 시스템에 ssh를 시도하고
- 28. 다른 도메인의 MySQL 데이터베이스에 연결
- 29. 원격 DB에 느린 mysql 연결
- 30. ssh를 사용하여 원격 컴퓨터에서 명령 실행
는 [이 답변] 한 번 봐 (http://stackoverflow.com/questions/252258/java-sql-connection-extension를 타고 -for-ssh) ... – TofuBeer