Java + SSH + Postgres

3
我们正在实施一项大学项目:用Java开发一个拼车服务。
我们需要解决一个问题:"如何管理Postgres服务器",PostgreSQL数据库配置在实验室服务器上,名为"golem"(130.136.4.sth),只能通过同一子网(130.136.4.0)中的终端访问。我们有四个账户(属于我们自己),可以通过这些账户建立SSH连接到主机。
在JAVA中,是否可能通过SSH向Postgres DB进行SQL查询呢?
谢谢 :) Davide

看一下这个。虽然不是完整的答案,但我认为它是其中的一部分,至少包括SSH连接:http://www.example-code.com/java/ssh_exec.asp - Valentin Vrinceanu
2
你尝试过什么?……说真的……我已经厌倦了阅读没有明确问题的提问…… - Brendan Lesniak
@Brendan:抱歉,我们还没有尝试过任何东西,因为我们不是Java专家。所以我们正在寻求您这些专家的提示 :) 也许可以验证设计模式,而不是在其他地方找到糟糕的解决方案。 - Gorgo
3个回答

5
如果这只是为了开发,您可以使用ssh端口转发来访问数据库,就像它安装在本地一样。如何启用端口转发取决于您使用的客户端软件,例如openssh有一个命令行开关 (-L):
ssh user@host -L localport:remotehost:remoteport

这个命令会使得位于remotehost上的remoteport,虽然只能通过host访问,但可以在你的计算机上通过localport访问。

你也可以通过传递“-g”选项(参见man页面)告诉ssh监听0.0.0.0:localport而不是默认的127.0.0.1:localport。除非确实需要,否则不应这样做,但如果需要,它是存在的。这将通过“<yourhost>:localport”向* EVERYONE *公开“remotehost:remoteport”,以便可以联系“<yourhost>:yourport”,因此请确保“remotehost:remoteport”设置了强大的安全性和/或在转发主机上使用iptables来限制对端口的访问。 - Craig Ringer
没有必要仅为开发而使用这种方法。为Java应用程序添加一个选项以生成SSH会话以隧道流量是很容易的。ssh端口转发非常稳定,尽管在拥塞下的性能可能有些棘手(因为在TCP内部进行TCP隧道会混淆TCP的拥塞控制和速率算法 http://sites.inka.de/bigred/devel/tcp-tcp.html)。如果您不想生成进程,则[JSch](http://www.jcraft.com/jsch/)支持通过本机Java ssh进行端口转发和IP隧道。 - Craig Ringer

2
请看其他建议的答案,因为它们似乎更容易实现您所需的功能。
然而,如果您确实需要在Java中实现命令提交以完成实验任务,可以查看这里找到的JSch(Java Secure Channel)库:http://www.jcraft.com/jsch/ 示例在这里http://www.jcraft.com/jsch/examples/ 使用它,您可以通过Java API提交ssh命令并执行任何类型的操作。

方便的是,看起来JSch还可以隧道传输IP,因此,即使直接访问被防火墙或过滤掉了,他们也可以通过SSH会话访问Pg。 - Craig Ringer
我们正在尝试这个解决方案。提示:手动解决方案可行: ssh user_lab@lucia.cs.unibo.it //
输入密码user_lab // psql -h golem -U ingsw12_03 ingsw12_03 // ingsw12_03=>(访问postresql服务器成功)//
这是Java的“解决方案”: http://pastebin.com/QrM2UkHDorg.postgresql.util.PSQLException: 服务器请求基于密码的身份验证,但未提供密码。更改String rhost="golem" 和 urlAlfresco = "jdbc:postgresql://golem:"+rport+"/ingsw12_03";org.postgresql.util.PSQLException: 连接失败 Caused by: java.net.UnknownHostException: golem如何解决? :(
- Gorgo
@DavideAguiari 我不会公开暴露你的用户名、主机和IP地址。 - kmarks2
不用担心。用户是虚假的,而且IP地址被大学高度防火墙保护。 - Gorgo

1
如果您运行的是“ssh”,随后是任何命令,该命令将在远程主机上被执行。因此,您应该能够通过ssh以批处理模式运行预先制作的查询。

考虑进行密钥生成和密钥交换,以启用无密码ssh执行。

示例(这只是将目录列表转储到您的终端):

ssh me@mybox ls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接